C++C++

笔记07:C++中的const

2018-11-17  本文已影响0人  Wayne_Dream

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是常量表达式
上一篇下一篇

猜你喜欢

热点阅读