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;
}
2462

被折叠的 条评论
为什么被折叠?



