const
用于声明该变量是一个常量。
可以用来声明成员函数,表示该函数不会改变成员变量。
const修饰指针的场景稍微复杂点,可以通过循环的方式记忆:
constexpr
constexpr 它是在 C++ 11 被引进的,它的字面意思是 constant expression,常量表达式。它可以作用在变量和函数上。一个 constexpr 变量是一个编译时完全确定的常数。一个 constexpr 函数至少对于某一组实参可以在编译期间产生一个编译期常数。
需要注意的是 const 并未区分出编译期常量和运行期常量,并且 const 只保证了运行时不直接被修改,而 constexpr 是限定在了编译期常量。所以在 constexpr 出来之后, const 的职责被拆分出来一部分,只作可读语义的保证,而常量语义交给了 constexpr 负责。
在 C++11 以后,建议凡是常量语义的场景都使用 constexpr,并且由于它是一个编译期常数,所以它甚至可以用在模板上,例如:
template<int N> class C{};constexpr int FivePlus(int x) {return 5 + x;
}void f(const int x) {C<x> c1; // Error: x is not compile-time evaluable.C<FivePlus(6)> c2; // OK
}
constexpr可以用来修饰变量、函数、构造函数。一旦以上任何元素被constexpr修饰,那么等于说是告诉编译器 “请大胆地将我看成编译时就能得出常量值的表达式去优化我”。
如:
const int func() {return 10;
}
main(){int arr[func()];
}
//error : 函数调用在常量表达式中必须具有常量值
对于func() ,胆小的编译器并没有足够的胆量去做编译期优化,哪怕函数体就一句return 字面值;
而
constexpr func() {return 10;
}
main(){int arr[func()];
}
//编译通过
则编译通过
编译期大胆地将func()做了优化,在编译期就确定了func计算出的值10而无需等到运行时再去计算。