Const限定符

由于C++ Primer关于const的描述逻辑有些混乱,故总结一下

一、判断原则

  1. 首先将const分为顶层const和底层const。顶层const限定的是当前变量(基本类型、指针)是个常量;底层const(引用、指针)限定其所引用(指向)的对象是个常量
    ①注意括号内容,指针既可为顶层也可为底层,引用只能是底层,基本类型(算术、字符)只能是顶层
    ②注意常量的地址属于底层const
    ③const限定指针时,const在基本类型右边为顶层const,在左边为底层const
  2. 顶层const在初始化或拷贝时,若两边均为对象(引用不是对象),则无所谓两边是否为const
  3. 底层const要求左右两边均为const。若底层const为引用,右边可为字面值。(若底层const为指针,右边应为地址,如果是字面值,则无法确定所指向的对象是什么)
  4. 非常量可以转换成常量,反之则不行(借助临时量实现,本身不会改变)

二、实例

根据判断原则,从上到下,进行判断

int i = 42;
const int ci = i; //正确:顶层const,左右两边均为对象
int j = ci; //正确:顶层const,左右两边均为对象

const int ca = 1024;
const int &r1 = ca; //正确:r1底层const,所引用的对象应是常量,ca顶层const,常量
r1 = 42; //错误:r1是对常量的引用
int &r2 = ca; //错误:ca常量,无法转换成非常量

int a = 42;
const int &ra = a; //正确:ra的const是底层const,所引用的对象应是常量,a为非常量可以转换成常量
const int &rb = 42; //正确:rb的const是底层const,所引用的对象应是常量,右边是字面值(常量)
const int &rc = ra * 2 //正确:ra、rc的const均为底层const,均为常量
int &rd = ra * 2 //错误:ra的const是底层const,所引用的对象应是常量,无法转换成非常量
ra = 0; //错误:ra的const为底层const,所引用的对象应是常量,不能修改

const double pi = 3.14;
double *ptr = π //错误:常量的地址为底层const,无法转换成非常量
const double *cptr = &pi //正确:两边均为底层const,cptr所指向的对象应是常量,而pi地址所指向的pi是常量
*cptr = 42; //错误:底层const,所指向的对象为常量,不能修改

int b = 0;
int *const p1 = &b; //正确:p1的const为顶层const,p1为常量,右边为非常量可以转换成常量
const int pa = 42;
const int *p2 = &pa; //正确:p2的const为底层const,所指的对象应为常量,右边为底层const,所指的对象pa为常量
const int *const p3 = p2; //正确:p3的const靠右的是顶层const(p3是常量),靠左的是底层const(p3所指的对象应为常量),p2所指的对象为常量
const int &r = pa; //正确:r的const为底层const(所引用对象应为常量),pa为常量
b = pa; //正确:非常量b的值可以修改为常量pa
p2 = p3; //正确:p2的const为底层const,p3的const既为顶层const,也为底层const
int *p = p3; //错误:p3的const为底层const,p非const
p2 = &b; //正确:p2的const为底层const,右边为底层const
int &x = pa; //错误:pa的const为顶层const,x是引用,不是对象,因此要求也应为const
const int &r2 = b; //正确:r2为底层const,b非常量可以转换成常量

参考

[1]《C++ Primer》(第5版)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值