原文地址: const 和 constexpr 区别与联系
提到 const 和 constexpr, 就需要引入常量表达式。常量表达式是指值不会改变, 并且编译过程就能得到计算结果的表达式. => 编译阶段就能得到值, 并且不能改变.
const 修饰对象无法修改, constexpr 更侧重于修饰对象编译期确定且无法修改. 具体区别, 体现在以下两个方面:
修饰变量
const 变量,表示一个变量无法改变,但初值并不确定, 不能在编译阶段决定.
比如,
1 | const int sz = get_size(); // 虽然sz无法改变, 但get_size() |
编译阶段无法确定值,也就是说 sz 不是常量表达式
constexpr 变量,编译器在编译阶段验证变量是否为一个常量表达式.
constexpr 侧重变量初值编译阶段确定,且无法修改. 如果认定变量是一个常量表达式,就把它声明称 constexpr 类型.
1 | constexpr int mf = 20; // 字面量20是常量表达式 |
修饰指针
const 修饰指针分为两种情况:顶层 const, 底层 const.
顶层 const 代表指针变量自身无法修改;底层 const 代表指针所指对象无法修改.
1 | int i = 10; |
constexpr 修饰指针,仅对指针有效,与指针所指对象无关
1 | // j的定义必须放在函数体外 |
修饰函数
const 修饰成员函数,通常称为 const 函数, 表示该函数不会修改类的状态(即不会通过任何方式修改类数据成员). 另外, const 类对象,只能调用 const 函数,确保不会修改类的数据成员.
constexpr 无法修饰成员函数,只能作为函数返回值类型, 表明该函数返回的是一个编译期可确定的常量;constexpr 被隐式隐式指定为内联函数,只能在类的声明中定义(.h 文件).
1 | // A.h |