C++中的const关键字

本文详细解释了C++中const关键字的作用,包括其用于返回值不可变、对象引用、函数规范以及顶层const和底层const的区别。重点讲解了常量引用、常量指针的概念以及它们在数据修改和拷贝中的行为。

const

  • const用于修饰不允许改变的数据

double rear () const { return re; }
double imag () const { return im; }
  • 返回值不会改变数据 用const修饰
  • 本质

个人理解:const可以将为临时变量创建空间长期储存,所以const引用便可以引用右值了

  • 规范

在C++类中,所有不会改变数据的函数都需要加const,此为规范

const声明的对象只能用const方法,如果方法内缺失const关键词,会报错

const引用

把const绑定到引用上,通常称之为对常量的引用(reference to const)

  • 对常量的引用一样不可以修改
const int ci=1024;
const int &r1=ci;

r1=42; //错误,r1是对常量的引用,不能修改
  • 常量对象只能被常量引用所引用
const int ci=1024;
const int &r1=ci;

int &r2=ci; //错误,非常量对象无法引用常量对象
const int &r2=ci; //正确写法
  • 常量引用可以绑定非常量的对象
int i=10;
const int &r1=i
const int &r2=100;
const int &r3=r1*2;

常量引用绑定非常量对象是因为编译器存在隐式转换

我们写出来是这样

double dval=3.14;
const int &ri=dval;

实际上编译器存在隐式转换,用一个临时量来存放dval的结果,而ri绑定的是这个临时量

const int temp=dval;
const int &ri=dval;
  • 常量引用指向的对象可以通过其他途径修改

const声明的变量不能改,但该变量指向的对象不受此约束

int i=400;
int &r1=i;
const int &r2=i;

r1=0; //正确的,可以通过r1修改i的值
r2=0; //错误的,r2是常量引用不能修改

const指针

把*放在const的前面,通常称之为常量指针

  • 常量指针必须初始化
int errNumb=0;
int *const curErr=&errNumb;
const double pi=3.1415926;
const double *const pip=π
  • 常量指针不能改变的是指针,但是指针所指对象的内容是可以改变的
int errNumb=0;
int *const curErr=&errNumb;
const double pi=3.1415926;
const double *const pip=π

*pip=100.0; //错误,因为对象pi也是常量,不能修改
*curErr=0; //正确,因为curErr本身是常量指针,指向errNumb的地址不能改,但是他指向的errNumb的值可以改变

顶层const&底层const

  • 顶层const:表示指针本身是个常量
int i=0;
int *const p1=&i //不能改变p1,这是一个顶层的const

从上图可以看出顶层const可以理解为常量指针,也就是指针本身就是个常量,不可更改,具有常量只能赋值给常量的特性

  • 底层const:表示指针所指对象是一个常量
const int ci=400;
const int *p2=&ci; //p2可以改变,这是一个底层指针
  • 顶层const和底层const的区别

我们可以从右往左读:

顶层const(const->pointer)代表用const修饰的对象

底层const(pointer->const)代表指向的对象是常量

由于常量只能赋值给常量的特性,在进行拷贝操作的时候,顶层const修饰的指针可以被拷贝给常量和非常量对象,因为该指针本身是个常量,但是他指向的内容不是常量,而拷贝是拷贝指针指向的内容,跟指针本身没有关系

const int ci=100;
int a=ci;   //赋值操作对常量ci没有影响,所以ci赋值给常量和非常量都是可行的
const b=ci;

而底层const修饰的指针只能拷贝给同样有底层const资格的对象,因为底层const指针指向的对象一定是常量,拷贝时复制的是指针指向的对象,所以对象是常量,接收他的指针必须是指向常量的指针也就是底层const指针

const int ci=100;
const int *p2=&ci; //此时是底层const声明,指向的对象是常量

int *p=p2; //错误,因为p2是底层const,p2指向的对象是常量,只能赋值给常量对象,而p是非常量对象
p2=&ci; //正确,因为ci可以隐式转换为底层const的形式的,所以可以被底层const接收
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值