【C++】const与constexpr
1.【C++】const与constexpr
2.【C++】vector3.【C++】创建对象写法4.【C++】域作用符的作用5.【C++】map6.【C++】类7.【C++】NULL与nullptr的区别8.【C++】cmath9.【C++】struct10.【C++】string11.【C++】unordered_set12.【C++】基本类型13.【C++】algorithm14.【C++】命名空间15.【C++】缺省参数16.【C++】函数重载17.【C++】引用18.【C++】auto19.【C++】基于范围for循环20.【C++】存储区21.【C++】左值与右值22.【C++】explicit23.【C++】构造函数类别24.【C++】decltype25.【C++】remove_refrence26.【C++】typeid与RTTI27.【C++】using28.【C++】引用折叠、万能引用和完美转发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而无需等到运行时再去计算。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南