跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 常量
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++常量 = == 简介 == 在C++中,'''常量'''(Constant)是指程序运行期间其值不能被改变的标识符。常量提供了一种增强代码可读性、安全性和维护性的方式,通过明确标识不应被修改的值,帮助开发者避免意外修改重要数据。 C++支持多种常量类型: * 字面常量(Literal constants) * 使用{{code|const}}关键字定义的常量 * 使用{{code|constexpr}}关键字定义的编译期常量(C++11引入) * 枚举常量(Enumeration constants) * 预处理器宏定义的常量(较不推荐) == const关键字 == {{code|const}}是C++中最常用的常量定义方式,可以应用于变量、函数参数和成员函数。 === 基本语法 === <syntaxhighlight lang="cpp"> const 数据类型 常量名 = 初始值; </syntaxhighlight> === 示例 === <syntaxhighlight lang="cpp"> #include <iostream> int main() { const double PI = 3.14159; // 定义双精度浮点常量 const int MAX_USERS = 100; // 定义整型常量 // PI = 3.14; // 错误:不能修改常量 std::cout << "圆周率: " << PI << std::endl; std::cout << "最大用户数: " << MAX_USERS << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> 圆周率: 3.14159 最大用户数: 100 </pre> == constexpr (C++11) == {{code|constexpr}}表示值在编译时即可确定,允许编译器进行更多优化。 === 示例 === <syntaxhighlight lang="cpp"> constexpr int factorial(int n) { return n <= 1 ? 1 : n * factorial(n - 1); } int main() { constexpr int fact5 = factorial(5); // 编译时计算 static_assert(fact5 == 120, "阶乘计算错误"); return 0; } </syntaxhighlight> == 常量指针与指向常量的指针 == 指针与常量结合使用时需特别注意语法: <mermaid> graph LR A[指针常量] --> B[指针本身是常量] C[常量指针] --> D[指向的数据是常量] </mermaid> === 示例 === <syntaxhighlight lang="cpp"> int main() { int value = 10; int another = 20; // 1. 指向常量的指针(指针可以改变,指向的数据不能改变) const int* ptr1 = &value; // *ptr1 = 15; // 错误 ptr1 = &another; // 允许 // 2. 指针常量(指针不能改变,指向的数据可以改变) int* const ptr2 = &value; *ptr2 = 15; // 允许 // ptr2 = &another; // 错误 // 3. 指向常量的指针常量 const int* const ptr3 = &value; // *ptr3 = 15; // 错误 // ptr3 = &another; // 错误 return 0; } </syntaxhighlight> == 实际应用案例 == === 场景:游戏开发中的物理常量 === <syntaxhighlight lang="cpp"> #include <iostream> class PhysicsEngine { public: static constexpr double GRAVITY = 9.8; // 重力加速度 static constexpr double AIR_RESISTANCE = 0.1; static double calculateFallDistance(double time) { return 0.5 * GRAVITY * time * time; } }; int main() { std::cout << "2秒后物体下落距离: " << PhysicsEngine::calculateFallDistance(2.0) << " 米" << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> 2秒后物体下落距离: 19.6 米 </pre> == 常量与宏定义的比较 == {| class="wikitable" |- ! 特性 !! {{code|const}} !! 宏定义(#define) |- | 类型安全 || 是 || 否 |- | 作用域 || 有 || 无 |- | 调试可见 || 是 || 否 |- | 内存占用 || 可能有 || 无 |- | 编译时计算 || {{code|constexpr}}支持 || 支持 |} == 数学公式示例 == 在物理引擎中,自由落体距离公式为: <math>d = \frac{1}{2}gt^2</math> 其中: * <math>d</math> = 距离 * <math>g</math> = 重力加速度(常量) * <math>t</math> = 时间 == 最佳实践 == 1. 优先使用{{code|const}}而非{{code|#define}} 2. 能在编译时确定的常量使用{{code|constexpr}} 3. 对于类中的常量,使用{{code|static const}}或{{code|static constexpr}} 4. 给常量赋予有意义的名称(全大写是常见约定) 5. 在函数参数中,如果不修改传入参数,使用{{code|const}}引用 == 常见问题 == '''Q: {{code|const}}和{{code|constexpr}}有什么区别?''' A: {{code|const}}表示运行时不修改,{{code|constexpr}}表示编译时可确定。 '''Q: 为什么常量通常定义在头文件中?''' A: 因为常量默认有内部链接,在多文件中使用需要在每个文件中定义。 '''Q: 常量存储在内存的什么位置?''' A: 取决于定义方式: * 局部{{code|const}}变量通常在栈上 * {{code|constexpr}}可能被编译器优化掉 * 全局{{code|const}}可能在只读数据段 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Code
(
编辑
)