本文内容为《C++ Primer(第五版)》相关章节整理而得。
- 默认情况下,const对象仅在同一个文件中有效,它在编译器编译期间由编译器进行替换。若想要在文件间共享,则需要在声明和定义中都添加extern,如下:
extern const int nBufSize = 1024; /// 定义 extern const int nBufSize; /// 声明 指向常量的指针不能用于改变其所指对象的值。
const double pi = 3.14; const double* pPi = π /// 正确 *pPi = 52.0; /// 错误常量指针必须初始化(如下,pPi就是一个常量指针)。
const double pi = 3.14; const double* const pPi = π- 指针本身是常量不意味着不能通过该指针去修改所指向对象的值,具体能不能修改要看被指向对象本身。
顶层const与底层const
指针本身是一个对象,所指向的也是一个对象。顶层const表示指针本身是常量,底层const则表示指针指向的是一个常量。
constexpr变量
C++11新标准规定,允许将变量声明为
constexpr类型,声明为该类型的变量一定是一个常量,必须用常量表达式初始化。constexpr int sz = size(); /// 这种情况下只有当size函数也是constexpr函数才是正确声明要了解constexpr函数,需要先了解字面值类型:
- 常量表达式的值需要在编译时就得到计算,因为这些类型一般较为简单,值也显而易见、容易得到,就把它们称为“字面值类型”。
constexpr函数:
- 指能用于常量表达式的函数,其定义与普通函数类似,但需要注意:函数的返回类型及所有形参的类型都得是字面值类型,且函数体重必须且只有一条return语句。
- 在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效。