我想简单总结一个const 的用法,方便我自己复习
只能在const类型的对象上执行不改变其内容的操作,const int和普通int一样都能参与算术运算,也能转化为一个布尔值。
int i=42;
const int ci=i;
int j=ci;
在拷贝一个对象的值时并不会改变他。
const的引用
const int ci=9;
const int &r1=ci;
r1=42; //错误 r1是对常量的引用
int &r2=ci; //错误,试图让非常量引用指向敞亮对象,那么通过操作r2就可以改变ci的值了,显然不可以
引用的类型必须与其所引用对象类型一致,但是有两个例外
1)初始化常量引用时允许用任意表达式作为初始值,只要该表达式结果能转化成引用类型即可
int i=3;
const int &r1=i; //常量引用的特例,不允许通过r1修改i的值
int &r2=r1*2; //错误 r2是普通非常量引用
2)...
执行拷贝操作不会改变拷贝对象的值,拷入拷出的对象是否是常量都没有什么影响
底层const的限制不能忽视,非常量可以转换成常量。
const int ci=8;
int i=0;
int &r=ci; //错误
const int &r2=i;
指针和const
要想存放常量对象的地址,只能使用指向常量的指针
const double pi=3.1;
double *ptr=π //错误,ptr是普通指针
const double *p=π
*p=0.2; //错误
指针的类型必须与其所引用对象类型一致,但是有两个例外
1)允许令一个指向常量的指针指向一个非常量对象
double dval=9.2;
const double *p=&dval;
const指针必须初始化。
提一点,指针本身是不是常量以及指针所指的是不是一个常量是两个相互独立的问题。
2)...
类比上面引用的情况
int i=7;
const int ci=2;
const int *p2=&ci;
const int* const p3=p2;
int *p=p3; //错误
p2=p3;
p2=&i;
还有一个关于顶层const的,在执行对象拷贝操作时,常量是顶层const还是底层const区别明显,顶层const不受什么影响.
int i=0;
const int ci=8;
i=ci;
const int *p2=&ci;
const int *const p3=p2;
p2=p3;
这是我所知道的,