const 限定符总结

1、const 常量

const int bufSize = 256; //不可修改

const 对象一旦创建后其值就不能修改

const int j = get_Size(); //正确,可以通过表达式初始化

const int k; //错误,没有初始化的常量

2、const 对象作用域

默认状态下,const 对象仅在文件内有效,如const int bufSize = 256; 仅在当前文件内有效

多个文件共享一个const对象,在声明和定义前面均加上extern 关键字

extern const int bufSize = 256; //file1.c内定义并初始化一个常量

extern const int bufSize; //file2.c中声明一个常量,与file1.c中的bufSize是同一个。

3、const的引用

把引用绑定到const对象上,称为对常量的引用(常量引用)

const int ci = 1024;

const int &ri = ci; //正确,引用及其引用的对象均为常量

ri=42; //错误,ri是对常量的引用

int &r = ci; //错误,非常量不能引用常量

对const的引用可能引用一个非常量对象

int i = 42;

int &r1 = i; //正确

const int &r2 = i; //正确,对const的引用可能引用一个非常量对象

r1 = 0 ; //正确

r2 = 0; //错误

i = 0; 正确,尽管有常量引用到该对象


4、指针和const

另指针指向常量对象,称为指向常量的指针。指向常量的指针不能改变其所指对象的值。

const int i = 42;

int *ptr = &i; // 错误,普通指针不能指向常量

const int* cptr = &i; //正确

*cptr =0; //错误

指向常量的指针可以指向一个非常量

int i = 42;

cptr = &i; //正确


5、常量指针

指针是对象,所以允许把指针对象定义为常量,定义时必须初始化,一旦初始化完成,其值不能修改

int i = 42;

int *const ptr = &i; //常量指针,一直指向i,不能修改

*ptr = 0; //正确,指针是常量,但是可以修改指向对象的值

const int j = 0;

const int *const ccptr = &j; //指向常量对象的常量指针

理解含义从右向左阅读:const ccptr—常量对象

                                   *const ccptr—常量指针

                                   int *const ccptr—指向整形的常量指针

                                   const int *const ccptr—指向整型常量的常量指针


6、顶层const与底层const

顶层const可以表示任意的对象是常量

底层const与指针、引用等复合类型的基本类型有关。

例如:指针本身是一个对象,它又可以指向另外一个对象,顶层const表示指针本身是一个常量,底层const表示指针所指对象是一个常量。

对象拷贝时顶层const不受影响,但是底层const会有限制

int i = 0;

int *const p1 = &i //顶层const

const int ci = 42; //顶层const

const int *p2 = &ci; //底层const

const int *const p3 = p2; //靠右是顶层const, 靠左是底层const

i = ci; //正确

p2 = p3; //正确

int *p = p3; //错误,p3包含底层const, 但是p没有

p2 = &i; //正确

int &r = ci; // 错误

const int &r2 = i; //正确


7、常量表达式

值不会改变并且在编译过程中就可以得到计算结果的表达式

const int i = 42; //i是常量表达式

int j = 0; //j不是常量表达式

const int k = i + 1; // k是常量表达式

const int sz = get_size(); // sz不是常量表达式,因为编译过程中不能得到计算结果

在一个复杂系统中,很难判断一个初始值是不是常量表达式,这对对象的定义和使用带来了难度

C++11规定,允许将变量声明为constexpr类型,以便由编译器来验证变量值是否是一个常量表达式,

constexpr int sz = size(); //只有size()是一个constexpr函数时,才是一条正确语句,否则编译器会提示错误

constexpr int *p = nullptr; //常量指针,顶层const  



猜你喜欢

转载自blog.csdn.net/sg_0208/article/details/79718832