C++中的const限定符
0x01 const修饰变量——常量
有时我们希望定义一个变量之后,这个变量的值就不能进行更改,我们往往也会称其为“常量”,在C语言中,我们往往采用#define
进行宏定义,例如:
#define PI 3.14159
在C++中,我们可以使用const
对变量进行修饰:
const int Pi = 3.14159;
这样,任何对变量pi
进行重新赋值的行为都不被允许,哪怕是重新赋的值和原来的值相同也不允许!
const int Size = 500;
Size = 500; // Error:试图更改一个 read-only 的值 Size
将常量的值赋给变量也是合法的:
const int Size = 512;
int Buffer = Size;
注意:
const修饰的变量必须进行初始化;
const int Size; // Error const int Buffer = 512; // 正确
0x02 const的引用
我们可以将引用绑定到普通变量上,那么也可以将引用绑定到const
对象,即常量上,const的引用也就是我们常说的“常量引用”。
const int Size = 500;
int& r1 = Size; // Error: 视图让一个非常量引用指向一个常量对象
const int& r2 = Size; // 正确
这样我们不能通过引用r2
修改Size的值,因为Size是一个const对象,本身的值不允许通过任何途径进行修改!
r2 = 1024; // Error: r2是对常量的引用
对const的引用不是必须引用一个const对象,也可能引用一个非const对象:
const int a = 42;
const int& ra = a; // 正确
int b = 42;
const int& rb = b; // 也是正确的
b = 43;
rb = 43; // Error!
当引用绑定一个非const对象,即变量b
时,变量b
的值可以进行修改,但是不能通过常量引用rb
修改b
的值。
0x03 指针和const
同引用一样,指针可以指向常量和非常量,指向常量的指针,其指向对象的值不能修改:
const double Pi = 3.14159;
double* ptr = Π // Error: ptr是普通指针,不能指向常量
const double* cptr = Π //正确
*cptr = 2.718; // Error
当指向常量的指针指向一个非常量是允许的,只不过不能通过指针更改非常量的值,但是可以通过其他途径进行更改:
double dval = 3.14;
cptr = &dval; // 更改指针cptr的指向
*cptr = 2.718; // Error!
dval = 2.718;
- 底层const(常量指针):表示指针指向的对象为常量,即指针指向对象的值不能修改,但指针的指向可以修改,像上面程序中的指针
cptr
就是一个常量指针
; - 顶层const(指针常量):表示指针本身是一个常量,即指针的指向不可以修改,但是指针所指的对象的值可以进行修改。
double d = 2.718;
double* const p = &d;
*p = 3.14; // 正确
double d2 = 3.14;
p = &d2; // Error!
- 指向常量对象的常量指针:指针本身是个常量,指针所指向的对象也是个常量,也就是说指针的指向不可以修改,指针所指的对象的值也不能修改:
const double Pi = 3.14;
const double E = 2.718;
const double* const cptr = Π
cptr = &E; // Error!
*cptr = 2.718; // Error!