C++中的const变量和引用

一、只有用字面量初始化的const常量才会进入常量符号表:
1、对const常量取引用,会导致编译器为其分配内存空间;
2、虽然编译器为其分配了内存空间,但是这个空间中的值不会被使用,还是会去使用常量符号表中的值;
3、使用其他变量初始化的const常量仍然是只读变量,不会进入常量符号表;
代码如下:

int main(void) {
    const int x = 0;//字面量初始化的const常量才会进入常量符号表
    int& rx = const_cast<int&>(x);//对const常量取引用,会导致编译器为其分配内存空间
    rx = 6;
    int y = 1;
    const int z = y;//使用其他变量初始化的const常量仍然是只读变量
    int* p = (int*)&z;
    *p = 9;
    printf("x = %d\n", x);//虽然编译器为其分配了内存空间,但是这个空间中的值不会被使用,还是会去使用常量符号表中的值
    printf("rx = %d\n", rx);
    printf("&x = %p\n", &x);
    printf("&rx = %p\n", &rx);
    printf("z = %d\n", z);
    cout << endl;

    printf("Press Enter Key to Continue... ...");
    getchar();
    return 0;
}

执行结果如下图:
这里写图片描述

二、被volatile修饰的const常量不会进入常量符号表,而是退化为只读变量,每次访问都从内存中取值:
代码如下:

int main(void) {
    volatile const int y = 2;//使用volatile,导致y未进入常量符号表 ,而是进入内存空间;
    int* p = const_cast<int*>(&y);
    *p = 9;
    printf("y = %d\n", y);
    printf("*p = %d\n", *p);
    printf("&y = %p\n", &y);
    printf("p = %p\n", p);

    printf("Press Enter Key to Continue... ...");
    getchar();
    return 0;
}

代码执行结果如下:
这里写图片描述

三、const引用的类型与初始化变量的类型:
相同:使初始化变量成为只读变量;
不同:生成一个新的只读变量,其初始值与初始化变量相同;
代码如下:

int main(void) {
    char c = 'c';
    char& rc = c;
    const int& trc = c;//const引用的类型与初始化变量的类型不同,这里将在一块新的内存地址产生一个新的只读变量;
    int* ptr = (int*)&trc;
    rc = 'g';
    *ptr = 'k';
    printf("c = %c\n", c);
    printf("rc = %c\n", rc);
    printf("trc = %c\n", trc);
    printf("&c = %p\n", &c);
    printf("&rc = %p\n", &rc);
    printf("&trc = %p\n", &trc);

    printf("Press Enter Key to Continue... ...");
    getchar();
    return 0;
}

代码执行结果如下:
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值