const限定符解析

  • const
  1. const对象一旦创建后就不能再改变,所以const对象必须初始化
const int i = get_size(); //运行时初始化
const int j = 10; // 编译时初始化
  1. 编译器在编译过程将该变量都替换成常量
  2. const引用,

允许常量引用

const int ci = 10;
const int &r1 = ci; 
r1 = 42; //无法通过对常量的引用修改其对象
int &r2 = ci; // 非常量引用无法指向常量引用

非常量引用不能指向常量对象


常量引用 可以 绑定非常量的对象

int i = 42; // 1.
const int &r1 = i; // 2.允许用非常量来初始化
const int &r2 = 10; //常量初始化
const int &r2 = r1 * 2; //常量初始化

第1行和2行编译器转化为

const int i = 42; 
const int &r1 = i;

同理,常量引用绑定不同类型的非常量,编译器创建了一个临时量.

double i = 10;  // 编译器转化为 const int temp = i;
const int &r1 = i; // 转化为 const int &r1 = temp;

  • ri非常量引用,int &ri = i;,此时ri绑定的对象是编译器产生的临时量,相当于int &ri = temp.此时引用只能改变temp的值,而改变不了i的值.
  • 所以 引用类型必须与引用对象的类型一致

常量指针指向常量的指针

  1. 指向常量的指针
  • 想要存放常量的地址.只能使用指向常量的指针
const double pi = 3.14; // double型常量
double *ptr = π //普通指针无法存常量地址
const double *cptr = π //合法
*cptr = 42; //只能初始化,不能赋值
  • 可以给该指针赋值一个非常量,和上面的引用绑定非常量对象一样
double dval = 3.14;
cptr = &dval; //赋值
  1. 常量指针
  • 指针本身定义为常量,必须初始化(常量必须初始化),
  • 指针本身是常量意味着存放的地址不能够被改变,而不是指向对象不能被改变
int errNumb = 0;
int* const curErr = &errNumb; //初始化
const double pi = 3.14;
const double* const pip = pi; // pip是指向常量的常量指针
  • 指向常量的常量指针意味着不仅指针存放的地址不能够被改变,而且指向的对象是常量,也不能够被改变
  • 如果分不清符号声明,从右往左读,const离curErr近说明curErr本身是个常量对象
顶层const
  1. 顶层const:指针本身是一个常量.
  2. 底层const:指针所指向的对象是一个常量
int i=0;
int *const p1 = &i; //顶层const
const int ci = 42; //顶层const
const int* p2 = &ci; //底层const
const int* const p3 = p2; //
const int &r = ci; //底层const
  • 执行拷贝操作2个对象都必须具有相同底层const 资格
int *p = p3; //常量不能转化成非常量
p2 = p3; //都有底层const
p2 = &i // 非常量可以辅助给常量
const int &r2 = i; //非常量转化成常量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值