C++之const

1. 主要作用

const本身存在两重含义:

  • 只读的变量(例如修饰函数参数)

 void func(const int a) {  } //! 这里a本质上还是一个变量

  • 只读的常量(全局常量和局部常量)

 void func()

{

        const int a = 10;

}

【注意】 ‘只读’并不代表不能修改,可以通过‘指针’或者‘引用’修改值

  • 只读变量与只读常量之间的不同
void func(const int a)
{
    //! 这里arr1的定义是错误的,因为a本质上还是一个变量
    std::array<int, a> arr1;

    const int b = 10;

    //! 这里是正确的
    std::array<int, b> arr2;
}

2. 全局常量

  • 存储位置

全局常量存储在‘全局/静态存储区’。‘全局/静态存储区’的常量主要包括两种:

(1)字符串字面量

(2)全局常量

【注意】 字面量包含很多种:数值字面量、字符字面量、字符串字面量等,前面两种字面量都是存放在寄存器中,只有字符串字面量是存放在‘全局/静态存储区’

  • 不可修改

全局常量一经初始化,就不可修改。如果尝试使用指针或者引用修改全局变量,编译不会报错,但是运行时会立马崩溃

const int gConstVar = 10;
void func()
{
    int* aPtr = (int*)&gConstVar;
    //! 这里的赋值操作在运行时会崩溃
    aPtr = 100;
}

3. 局部常量

  • 存储位置

局部常量存储与栈中

  • 可以修改

可以通过指针或者引用修改局部常量的值,但是需要注意如果局部常量是否是数值字面量和字符字面量,因为这两中情况下局部常量是直接从寄存器中取值,但是指针或者引用修改的时常量内存地址中值,所以从指针或者引用处取到的值是修改后的内存值,而局部常量仍然从寄存器中取值,如果想要局部常量从内存中取值,可以使用volatile进行修改。

void func()
{
    const int var = 5;

    int* bPtr = (int*)&var;
    *bPtr = 300;
    
    //! 这里var是直接从寄存器中取值(如果var被volatile修改,则var就会是300)
    std::cout << "var: " << &var << " " << var << std::endl;
    //! 这里bPtr是从内存地址中取值
    std::cout << "bPtr: " << bPtr << " " << *bPtr << std::endl;
    
    int& aRef = (int&)var;
    aRef = 400;
    //! 这里var是直接从寄存器中取值(如果var被volatile修改,则var就会是300)
    std::cout << "var: " << &var << " " << var << std::endl;
    //! 这里aRef是从内存地址中取值
    std::cout << "aRef: " << &aRef << " " << aRef << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值