const 限定符、const引用、const指针,顶层const和底层const

本文详细介绍了C++中const限定符的用法,包括const变量、const引用、const指针的概念及其区别,并通过实例解释了顶层const和底层const的不同之处。

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;//拷出对象是非常量,拷入对象是常量对象


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值