1.const常量在定义的时候必须初始化;
const对象默认的是文件的局部变量,只存在该文件内部,不能被其他文件访问。(使用extern 可以使整个程序访问const 对象);
2.const和引用
const引用是指向const对象的引用:
const int ival =1024;
const int &refval= ival; //ok
int &rev =ival; <span style="white-space:pre"> </span> //error
const引用可以可以绑定到不同但相关的类型的对象或者绑定到右值;(非const引用只能绑定到同类型的对象)
int i = 12;
const int ref =12;
const int ref2 = ref +i;
同样的初始化对于非const引用是不合法的。
3.const和指针
(a)指向const对象的指针
如果指针指向一个const对象,C++强制要求只想const对象的指针也必须具有const特性(为了保证不允许使用指针改变所指的const值):
const int ival = 42;
const int *ipt = &ival;
const限定了ipt指针所指向的对象类型,而不是ipt本身,也就是ipt不是const,因此定义是不需要初始化,并且可以指向另一个const对象;
*ipt =12;//错误,不能修改所指对象的值
把一个const对象赋值给一个非const指针会导致编译出错;
不能使用void*保存const对象的地址,应该使用const void*类型的指针;
可以把非const对象地址赋值给指向const对象的指针,但这样就不能通过该指针修改对象的值
int val = 5;
ipt = &val; //ok
*ipt = 12; //error
这时通过其他途径修改val的值之后,*ipt的值也会改变。
(b)const指针
const指针定义的时候需要初始化,并且const指针的值不能修改,即cosnt指针不能再指向其他的对象:
int val = 0;
int *const refval = &val; //refval 是const指针
refval=refval; //refval不能再指向其他对象,即使是本身赋值给本身
const指针可以修改指向对象的值:
*refval=12; //ok
(c)指向const对象的const指针
const int pi =10;
const int *const pt =π
不能修改pt所指向对象的值,也不能修改pt的指向。
4.const成员函数
定义:在函数形参列表后面加上const,函数体内不能修改数据,只能访问数据;
(a).const成员函数不能修改类对象的数据成员,可以访问非const对象和const对象的数据成员;
(b).非const成员函数只能访问非const对象的数据成员,不能访问const对象;
(c).const对象只能调用const成员函数,非const对象也可以调用const成员函数;
(d).const成员函数可以被具有相同返回值和形参列表的非const函数重载:
int fun(int a,int b) const;
int fun(int a,int b);
这时对象的const属性决定具体调用哪个函数
(e).const成员函数不能调用非const成员函数.