C++ const 限定符 const的引用 const指针详解
1. const 限定符
目的和作用:定义不能改变的量,称之为常量,且必须初始化。
初始化和const
- 可以用非const对象初始化const对象。
- const对象仅在文件内有效,在编译过程中,用到该变量的地方,会被替换成对应的值。
- const变量默认不能被其他文件访问,非要访问,必须在指定const变量定义之前加extern。
1.1. const的引用
- 可以把引用绑定的const对象上,称之为对常量的引用。可以读取但是不能修改绑定对象的值。引用类型必须是const 类型。const int &r1 = ci;
- 引用必须在定义时初始化,且不能改变与绑定对象的关系。
- reference to const(对常量的引用):指向const对象的引用,如 const int ival=1; const int &refVal = ival;,可以读取但不能修改refVal。
- 引用类型有两种情况可以与绑定对象类型不一致。其一:常量引用可以绑定到可以转换至引用类型的不同类型对象上。
- 临时量(temporary)对象:当编译器需要一个空间来暂存表达式的求值结果时,临时创建的一个未命名的对象。
- 对临时量的引用是非法行为。
- const引用可以绑定非const对象。但是不允许改变绑定对象的值。可以通过其他方式改变绑定对象的值。
int i = 42; const int &r = i; i = 45;//合法 r = 46;//非法
1.2 指针和const
- 指针是对象,允许把指针定义成常量。想要存放常量对象的地址,只能用指向常量的指针。
const double pi = 3.14; const double *cptr = π//合法
- 指针类型必须与所指向对象类型一致,但是有两种意外。第一种:允许常量指针指向非常量对象,不能通过指针改变非常量的值。
int i = 42; const int *r = &i; i = 45;//合法 *r = 46;//非法
- 允许把指针定义成常量。指针存放的地址不能被改变,地址里的内容可以通过其他方式改变。
1.3顶层const
- 顶层const:指针本身是个常量。
- 底层const:指针指向的对象是个常量。拷贝时严格要求相同的底层const资格。
1.4 constexpr和常量表达式
- 常量表达式:指值不会改变,且在编译过程中就能得到计算结果的表达式。
- C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量的表达式。