C++ const限定符
C++ const限定符简介。
概述
const限定符的作用有主要是:
1. 警惕程序一不小心改变了某个不希望改变的值。
2. const对象一旦创建其值就无法改变——const对象必须初始化。
//error 1 未初始化的const对象
const int bufSize;
//error 2 企图修改const对象
const int bufSize = 512;
bufSize=1024;
需要注意的是:const对象只在当前文件有效,如果需要在多文件中共享const对象,则需要使用extern
关键字。
const 引用
对常量的引用(reference to const),由于const限定符的引入,我们把引用分为:
常量引用
和非常量引用
1. 不能通过常量引用去改变引用对象的值:
//error3
const int i = 22;
const int &r1=i;
r1=23;
不允许直接为i复制,当然也就不能通过引用去改变i。
2. 可以使用常量引用去绑定一个非const对象:
//use 1
int i = 22;
const int & r1 = i;
相当于过程:
const int temp = i;
const int & r1 = temp;
这种情况下const int &绑定了一个临时量对象。
如上例,由于int i=22
是一个非常量对象,所以我们可以通过其他方式去修改他的值,但是不能通过const int & r1
去修改,因为r1
是一个常量引用。
//use2
//不允许通过r2修改i的值,i的值通过其他途径修改
int i=42;
int &r1 =i;
const int &r2 =i;
//r2=0;//error
r1=0;
cout << r2 << endl;
const指针
与const挂钩指针可以有如下两种情况:
指向常量的指针(pointer to const)
常量指针(const pointer)
这两个概念读起来很绕口,但是看他们的英文就明白了,前者pointer to const与上述常量引用(reference to const)类似,而后者,因为指针本身也是一个对象(引用不是),因此就像其他对象类型一样,允许把指针本身定为常量。
指向常量的指针示例:
示例1:
const double pi=3.14;
double * ptr = π // error
const double *cptr = π//ok
示例2:
//指针类型必须与其所指向的对象的类型一致,一个例外是
//允许指向常量的指针指向一个非常量对象
double pi = 3.14;
const double * cptr = π
double * ptr = π
但是不能通过常量指针去改变对象的值
*cptr = 2.0;//error
//与常量引用类似,我们仍然可以通过其他方式去改变指针所指向的对象的值。
*ptr=2.0;//ok
常量指针示例(指针的值不允许改变):
示例1:
//常量指针
int i=0;
int j=1;
int *const cptr = & i;
cptr=&j;//error
*cptr=2;//ok
cout << * cptr << endl; // output : 2
i=1;//ok;
cout << * cptr<<endl;// output : 1
示例2:
const double pi=3.14;
const double pi2 = 4.14;
const double * const cptr=π//指向常量的常量指针
const double * cptr2 = π//用const修饰的指向常量的指针
cptr2=&pi2;//ok
cptr=&pi2;//error;
顶层与底层const
顶层const可以表示任意的对象是常量,底层const则与指针和引用等复合类型的基本类型部分有关,对于指针来说,指针本身是一个对象,又能指向另一个对象,所以他既可以是顶层const,也可以是底层const:
顶层const指针
指针本身是一个常量。
底层const指针
指针所指向的对象是一个常量。