今天我们来谈谈const限定符。关键字const是用来对变量的类型加以限定,它的值不能被改变。
因为const对象一旦创建之后就不能再改变,所以const对象必须被初始化。例
const int k=42;//正确,编译时初始化
const int k=get_size();//正确,运行时初始化,它的值取决于get_size()的返回值,且不再改变。
const跟大多数的对象一样,在默认状态下,const对象仅在文件内有效。程序在编译时,把该变量都替换成对应的值,所以const对象只有在当前文件有效,所以不同文件内有相同名字的const对象也没关系。但是如果希望该const对象在其他文件有效,则需要用extern关键字声明。
接下来我们来看看const的引用即常量的引用。常量的引用不能用作修改它所绑定的对象,而且不能用一个非常量引用指向一个常量对象但是允许将常量引用绑定到普通的对象上。例
const int c=1024;
int &r1=c;//错误,不能用非常亮引用指向一个常量对象。
总之,记住一句。既然是const对象,那么就不能直接通过操作该对象进行修改(也就是可以通过其他非const对象改变,见下例)。其他禁忌跟普通应用类似。
int i=42;
int &r1=i;
const int &r2=i;
r1=2;
//此时i、r1、r2的值全部被修改成为2!!!!!!
最后我们再来说说很容易弄混的【指向常量的指针】和【常量指针】。
故名思义,指向常量的指针就是我们不能直接通过该指针改变它所指的对象(同样要明白的是所指的对象可以通过别的途径改变如下例)。而该指针式用来存放常量对象的地址。
const double pi=3.14;
double *ptr=π//普通指针不能指向常量对象
const double *cptr=π//正确
double dval=3.12;
cptr=&dval;//通过dval来改变*cptr的值,所以也是正确的。
现在我们来看看常量指针是什么吧。
它代表的是指针本身不变而不是指向的对象不变。写出的形式如下:
int *const curerr=&errnumb;
同样的道理,常量指针不代表着不能改变所指对象的值,而是不能通过该指针改变所指对象的值。例如在上一行代码的前提下加上:
*curerr=123;//此时指针curerr所指对象的值已经改变,但是该语句正确。
————————————————————————————
仔细类比指向常量的指针和常量指针,我们可以通过const的位置来判断在该语句中到底是所指向的对象还是该指针本身的值不变呢?
const int *p ,类似这种时就是表示*p是const.我们可以通过操作p来改变p指向的对象的值
int *const p,类似这种时就是表示p是const,我们可以通过操作*p来改变p指向的对象的值
最后再稍微提一点顶层const和底层const.
顶层const表示指针本身是个常量;底层const表示指针所指的对象是个常量。通过之前的const的学习我们可以自己归纳。如:
int i=0;
int *const p1=&i;//p1是个常量,为顶层const
const int ci=42;//ci不能变,为顶层const
const int *p2=&ci;//*p2不能变,为底层const