const限定符的用法
有时候我们希望定义这样一种变量,它的值不能被改变,为了满足这一要求,可以用关键字const来对变量来限定
const int bufSize = 512;
1.这样就把bufSize定义成一个常量,任何试图为bufSize赋值的行为都将引发错误,但与非const对象相比,const对象能完成非const对象的大部分操作,如一样能进行算术运算,也都能转化成一个布尔值,还可以为其他变量赋值;
int i = 42;
const int ci = i;
int j = ci;
2.const与引用
可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为常量的引用。与普通引用不同的是,我们不能通过该引用来改变对象的大小,如:
const int &r = 1;//正确,可以认为&r为一个常量的引用
const int ci = 1024;
const int &r1 = ci;//正确,引用及其对象都是常量
r1 = 42;//错误:不能通过r1来改变ci的值
int &r2 = ci;//错误;试图让一个非常量引用指向一个常量对象
引用的类型必须与对象的类型一致,但是有两个例外,第一种就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转化引用的类型即可,允许为一个常量引用绑定非常量的对象,字面值甚至表达式,但是非常量引用不能绑定常量对象;
double dval = 3.14;
const int&ri = dval;
此处ri引用了一个int型的数。对ri的操作应该是整型运算,但dval却是一个双精度的浮点数。因此为了确保ri绑定一个整数,编译器把上述代码变成了下面的形式:
const int temp =dval;
const int &ri = temp;
但是虽说时常量引用,但不一定要绑定常量,它也可以是变量,也就是说可以改变通过其他方式改变变量的大小(但不能通过该引用改变)
int i = 42;
int &r1 = i;//引用绑定对象
const int &r2 = i;//r2也绑定对象,但不允许通过r2改变i的值
r1 = 0;//r1并非常量,i的值修改成0;
r2 = 0;//错误,不能通过r2改变值
3.指针和const
(1)指向常量的指针:不能用于改变所指对象的值。要想存放常量对象的地址,只能用指向常量的指针。但是和常量引用一样,指向常量的指针也没有规定其所指的对象一定是常量,所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,但没有规定通过其他方式改变对象的值。
const double pi = 3.14;
double *ptr = &pi//错误,存放常量对象只能是指向常量的指针;
const double *p = &pi//正确
*p = 42;//不能通过指向常量的指针改变对象的大小
double i = 3.25;
const double *cptr = i;//可以指向非常量
i = 4.12;//可以通过i本身改变值
(2)const 指针
指针是对象而引用不是,所以可以向对待其他对象一样,允许把指针本身定为常量,这样就意味着指针本身是一个常量。常量指针必须初始化,而且一旦初始化则它的值就无法改变,即不能再指向其他变量
int i = 0;
int *const p = &i;//p将一直指向i;
const double pi = 3.15159;
const double *const pip = πpip是一个指向常量的常量指针
常量指针本身是一个常量并不意味着不可以通过指针修改对象的值,如何指针指向的是一个非常量,则完全可以改变对象的值