const限定符
有时候我们定义一个变量,他的值不能被改变,可以使用const关键字做标识,定义成一个常量,const对象创建后,其值不能被改变,所以必须初始化,默认状态下const对象仅在文件内有效,要想在多个文件中共享const对象,需要在对象前加上extern关键字。
const引用
引用可以绑定在const对象上,与普通引用不同的是,不能修改它所绑定的对象。
如:
const int i = 1;
const int &j = i;
j = 2;//错误,j是一个对常量的引用,不可以改变其所绑定对象的值
允许一个常量引用绑定非常量的对象、字面值、甚至一个表达式,但普通引用时需要注意被引用的数据类型是否相同。
如:
int m = 22;
const int &n = m;//正确,可以绑定在一个普通的int对象上
const int w = 33;
int &x = w;//错误,一个非常量引用指向一个常量对象,两者类型不匹配。
const 指针:
因为指针是对象,而引用不是,所以指针也可以是常量
常量指针必须被初始化,而且一旦初始化成功,它的值(也就是存放在常量*p的对象的地址不在改变)即只指向这个对象
如:
int i = 33;
int * const p = &i;即变量名p永远存放的是变量i的地址,p是一个常量指针,它指向的对象是一个整型变量
const double j = 7.88;
const double * const p1 = &j;应该从右往左读,p1是一个常量指针,指向的对象是一个双精度浮点型常量
顶层const和底层const:
指针本身是不是常量以及指针指向的是不是一个常量,是两个相互独立的问题,
如程序:
顶层const表示指针是一个常量指针,即指针本身是一个常量:
int i = 44;
int * const p = &i;//由左边的*const判断 变量名p是一个常量指针,它指向的对象i只是一个int型变量
//不允许改变p的值
底层const表示指针所指向的对象是一个常量:
如 :
const double j = 55;// 变量j为一个双精度浮点型常量
const double *p = &j; // 变量p是一个指向双精度浮点型常量的指针,p本身不是一个常量
//允许改变p的值
顶层const和底层const对于执行对象拷贝时的区别:
顶层const对于执行对象拷贝时的影响不大,但对底层const来讲影响不能忽视。如:
int a = 100;
const int b = 200;
a = b;//正确,拷贝b的值,b是一个顶层const
底层const在执行对象拷贝操作时,拷入和拷出的对象必须是具有相同的底层const资格,或者拷出对象是非常量,拷入对象是常量对象。
如:
int i = 0;
const int ci = 42;//ci是一个顶层const
const int *p2 = &ci;//p2是一个低层const
const int *const p3 = p2;//p3是一个顶层const,也是一个低层const
p2 = p3;//两个低层const相互拷贝,正确
p2 = &i;//拷出对象是非常量,拷入对象是常量对象
本文详细介绍了C++中const限定符的用法,包括const变量、const引用、const指针的概念及其区别,并通过实例解释了顶层const和底层const的不同之处。

374

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



