有时候我们需要这样一种变量,它的值不能被改变,也应随时警惕防止程序一不小心改变这个值。为了满足这一要求,可以用关键字const对这变量的类型加以限定。
const对象一旦创建,其值就不能在改变。
const对象必须初始化。
初始化可以是任意表达式。
const int bufSize = 520; //对变量bufSize加const限定,bufSize就定义成了一个常量
bufSize = 250; //报错,const对象一旦创建,其值就不能在改变,因此const对象必须初始化
const int k; //报错,const对象未初始化,初始化可以是任意表达式(const int k=表达式)
const的引用
常量对象:例如:const int ci=1024;这里的ci就是常量对象。
常量引用:例如:const int &ri=ci; 这里的r1就是常量引用。
常量引用绑定的可以是常量对象也以是非常量对象。
非常量引用绑定的必须是非常量对象。
const int ci1=1024;//ci1为常量对象
int ci2=52;//ci2为非常量对象
const int &r1=ci1;//正确,常量引用绑定常量对象
const int &r2=ci2;//正确,常量引用绑定非常量对象,但不能通过r2修改ci2的值,允许将const int&绑定到一个普通的int对象上
int &r3=ci1;//错误,非常量引用绑定常量对象
int &r4=ci2;//正确,非常量引用绑定非常量对象
一般,引用的类型必须与其引用对象的类型一致,但是有两个例外,一是在初始化常量引用时允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
double dval=3.14;
const int &ri=dval;
//这种情况编译器会转换成一下代码
const int temp=dval;//这里的temp是一个临时生成的整形变量
const int &ri=temp;//让ri绑定这个临时变量
指针和const
指针常量:也叫顶层const,表示指针本身是个常量。
常量指针:也叫底层const,表示指针指向的对象是个常量。
int a=52;
int b=25;
//顶层const
int *const p=&a;//p不可以改变,*p可改变
p=&b;//不允许
*p=199;//可以
//底层const
const int *p=&a;//*p不可以改变,p可以改变
p=&b;//允许
*p=199;//不允许
//底层const和顶层const
const int *const p=&a;//*p和p都不允许改变
p=&b;//不可以
*p=199//不可以