C++中const限定符的理解

一、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不能指向其他对象且指向的内容不可被改变

猜你喜欢

转载自blog.csdn.net/coding_is_fun/article/details/81364939
今日推荐