const的基础

发布时间 2023-04-17 00:16:20作者: 小凉拖

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 *下的常量,指向的地址不能改变