一、const变量
1、创建之后不可修改
有时候我们定义一个变量,并且不希望程序其他部分改变它,可以用const对这个变量进行修饰。
const int a=520;
a=23;
如上,a被定义成const类型,如果再对a重新赋值,会出现assignment of read-only variable ‘a’的错误,表明a是只读变量,不能够被修改。
2、创建时候必须初始化
再者,由于const对象创建之后不可修改,所以在创建它的时候就必须对其进行初始化。
const int a;
如果不小心未初始化会出现uninitialized const ‘a’错误。
3、只在当前文件有效
编译器在编译程序时,会对出现const限定符的变量用具体的数值做替换。如果程序中包含不止一个文件,多个文件需要共享这个变量,就必须在编译期知道这个变量的初始值。为了实现这点,一种做法是在每个文件定义,另外一种做法就是在const之前加上extern,这样就能够避免重复定义。
extern const int a=520;
二、常量引用
1、不能用一个非常量对象给一个常量对象设置引用。
如下操作将会出现错误:
const int a=520;
int &b=a;
这是因为如果这样操作成立的话意味着可以通过b来对a进行修改。
2、可以给字面值常量设置引用
通常情况下,引用必须引用一个具体的对象,如果要这么做的话可以在之前加上const。
int &i=42; //错误
const int &i=42; //正确
3、引用类型要匹配
引用对象和被引用对象类型要一致。
double b=2.34;
const int &a=b; //错误
之所以不能这么做的原因是,在进行第二步的时候会发生类型转换,生成一个临时变量然后再发生绑定。
const int temp= b;
const int &a=temp;
如果没有加const限定符,意味着可以通过a修改临时变量的值,这么做是不合法的。
三、const与指针
1、常量指针
含义是指针本身是一个常量,当用它指向一个对象后,就不能再指向另一个对象。
int a=12;
int b=15;
int *const p=&a;
p=&b; //错误
2、指针常量
含义是,指针指向的是一个常量,不能通过解引用去修改这个常量。
int a=12;
int const* p=&a;
*p=5; //错误
记忆这两者,可以从右往左读,如离p最近的是*,然后是const。
四、底层const和顶层const
底层和顶层const是相对于指针来说的。当指针指向的是一个常量时候,用底层来表示,反之,如果指针本身是一个常量的时候,用顶层来表示。
int a=23;
int const *p1=&a; //指针常量,底层const,p1指向的内容不可变
int *const p2=&a; //常量指针,顶层const,p2不能够再再指向另一个对象
int *const *p3=&a; //p3不能指向其他对象且指向的内容不可被改变