1.使用const应该注意:
- const修饰的变量不能改变
- const必须初始化
- 用一个对象初始化另外一个对象,则它们是不是const都无关紧要。
1 int i = 42;
2 const int ci = i;
3 int j = ci;
2.常量的引用
- 常量(被const修饰的变量)必须绑定在常量的引用上
1 const int ci = 1024;
2 const int& r1 = ci;
3 int& r2 = ci;//错误试图让一个非常量的引用绑定一个常量对象
3.顶层const和底层const
(1)怎么判断底层const还是顶层const
1.通过形式:
const和变量中间没有“&”或者“*”它就是一个顶层const,否则就是底层const
2.通过定义(针对指针)
如果这个指针值不能变(指向的地址不能改变),那么它就是一个顶层const;如果一个指针所指向的是一个常量那么就是底层const。
1 const int a=10; 2 int* b=&a;//错误,&a相当于指向a的指针,指向常量的指针是一个底层const,右边有底层const左边没有,错误;或则也可以根据非常量指针不能接收常量来理解
(2)当执行对象的拷贝赋值时,常量是顶层const还是底层const区别明显,其中顶层const不受什么影响。这句话应改为当当执行对象的拷贝赋值时,常量是顶层const还是底层const区别明显,顶层const可以删除(也就是顶层const不作为等号右边的值是否可以赋值给等号左边值的判别标准),底层const必须一致(也就是等号右边有底层const左边必须得有,而等号左边有底层const右边不必拥有)。注意,这个性质只能在对一个对象初始化的时候用,如果不是初始化的情况还要考虑其他因素。
1 const int *p2 = &ci; 2 const int *const p3 = &i; 3 p3 = p2;//错误,p3是一个const int *下的常量,指向的地址不能改变