1. const与变量
-
const修饰的变量,在被初始化后就不能对其内容进行修改。
-
const修饰的变量必须初始化。
//初始化的情况如下
const int data = 1024;//情况1 直接给一个初始值。
const int data = fun();//情况2 把函数的返回值作为初始值
int i = 42;
const int data = i;//情况3 由一个已经被初始化的变量的值作为初始值
//总结来说,就是必须在定义时有一个确定的值
static const int data;//情况4 加static修饰,这里实际上隐含了赋初值0的条件
data = 512;//错误代码,此时data所在的内存已经不能被修改了
需要注意的是,无法被修改的只是const限定的变量,如果这个变量被赋值给了一个新的变量,那么新的变量是可以被修改的。
2. const与引用
引用实质上就是给变量起了一个别名,实际上操作的是同一块内存空间
const int data = 50;
const int &rData1 = data;//正确,该空间的值都不能被修改
rData1 = 45;//错误,不能有常量的引用,45本身没有指带内存空间
int &rData2 = rData1;//错误, rData2的空间可以修改。rData1的空间不能修改
int rData3 = 40;
const int &rData4 = rData3;//正确,rData3的空间可以修改。rData4的空间不能修改
总结:
-
双方都必须有一块确定的内存空间
-
权限可以缩小,但是不能扩大
3. const与指针
const修饰指针,需要看其在 * 前还是 * 后。在前面表示指针指向空间的值不能被修改,在后面表示指针指向空间的地址不能被修改。
左定值,右定址
const int a = 3;
int* pa = &a;//错误,被const修饰的变量,只能被const修饰的指针所指向
const int* pa = &a;//正确,同时const在 * 前,指向空间的值不能被修改
int a, b;
int * const pa = &a;
pa = &b;//错误,const在 * 后,指向空间的地址不能被修改
4. constexpr(c++11)
常量表达式是指编译过程中就会被计算的表达式。被constexpr修饰的变量一定是一个常量,并且必须用常量初始化,否则这条语句就是错误的
constexpr int i = 20;//正确,20是常量,i也是常量
int i = 20;
constexpr int j = i;//错误,i是不是常量,无法初始化被constexpr修饰的变量
如果是用一个函数的返回值初始化constexpr修饰的变量,那么这个函数的返回值必须唯一