1,const 限定符
const int i = 0;
,使用const可以将i变成一个常量,当试图对i的值进行修改时,会引发报错,需要注意的是,必须对const对象进行初始化,当然,初始化的值可以是任意复杂的表达式。也可以用一个对象去初始化另一个对象,它们是不是const都无关紧要,因为一旦拷贝完成,新的对象和原来的对象就没有任何关系了。
在默认状态下,const对象仅在文件内有效,当多个文件中出现同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。如果想要在多个文件中共享const对象,必须在变量的定义之前添加extern
,如extern const i = 0;
。
2,const的引用
2.1,可以把引用绑定到const对象上,称之为对常量的引用,与普通引用不同的是,对常量的引用不能被用来修改它说绑定的的对象:
const int i = 2;
const int &j = i; //常量引用
j = 3; //error,对常量的引用不能修改。
int &k = i; //error,试图让一个非常量引用指向一个常量对象。
2.2,当一个常量引用被绑定到另外一种类型上时:
double i = 1.55;
const int &j = i;
// 当i 改变时,j也会改变
当引用对象与被引用对象类型不一致时,编译器会产生一个临时量:
const int temp = i; //由双精度浮点数生成一个临时的整型常量
const int &j = temp; //让j绑定这个临时量
2.3,当然,我们必须认识到,常量引用仅对可参与的操作做出来限定,对引用的对象本身是不是常量未作限定,因为对象也可能是个非常量,所以C++允许通过其他途径改变它的值:
int i = 3;
int &j = i;
const int &k = i;
j = 0;
>>> i = 0 , j = 0 , k = 0
可以看到const引用的k发生了变化,并不是3,而是0。
3,指针和const
与引用一样,指向常量的指针,不能用于改变其所指对象的值,即要想存放常量的指针,只能使用指向常量的指针:
const double pi = 3.14;
double *ptr = π //错误,ptr是一个普通指针,必须用常量指针指向常量。
const double *cptr = π //正确
*cptr = 42; //错误,不能给*cptr赋值
所谓指向常量的 指针或引用,不过是指针或引用“自以为是”罢了,它们觉得 自己指向了常量,所以自觉地不去改变所指对象的指,其实可以使用别的方式来改变。
int i = 0;
int *const j = &i; // j将一种指向i,即不变的是指针本身,而非指向的那个值
const double pi = 3.14;
const double *const pip = π //pip是一个指向常量对象的常量指针
4,constexpr变量
在复杂系统中,很难分辨一个初始值到底是不是常量表达式。就像const int sz = get_size();
,sz就不是一个常量表达式,因为get_size()的具体值只有在运行时才能得到。所以在C++11中,允许将变量声明为constexpr
类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr
的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int mf = 20; //20是常量表达式
constexpr int limit = mf +1; //mf+1是常量表达式
网友评论