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





