0

0

c++ const关键字的用法_c++ const修饰符使用场景全解【最佳实践】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-09 14:05:02

|

216人浏览过

|

来源于php中文网

原创

const是C++中编译期契约,用于声明不可修改性以启用优化、保障类型安全、支撑const正确性;它约束访问路径而非绝对内存不可变,需区分顶层/底层const、合理使用const成员函数、mutable、const引用传参及constexpr协同。

c++ const关键字的用法_c++ const修饰符使用场景全解【最佳实践】

const 在 C++ 中不是“只读变量”那么简单,它本质是编译期契约:告诉编译器“这个值/对象/接口不可被修改”,从而启用优化、增强类型安全、防止意外赋值,并支撑 const 正确性(const-correctness)这一核心设计原则。

const 修饰变量:最基础但易错的用法

声明时必须初始化;之后不可通过该标识符修改值。注意:它不保证内存绝对不可变(比如 const int* 指向的值仍可能被其他非 const 指针改),只约束当前绑定的访问路径。

  • 推荐写法:const int x = 42; 或更符合 C++ 风格的 int const x = 42;(两者等价,后者强调“int 是 const 的”)
  • 避免裸指针陷阱:const int* p; 表示“p 指向的 int 不可改”(底层 const);int* const p = &x; 表示“p 本身不可改,但指向的值可改”(顶层 const);const int* const p = &x; 二者都不可改
  • 数组与 const:const int arr[5] = {1,2,3,4,5}; 整个数组内容不可通过 arr 修改;但若用指针间接访问且原内存非 const,则仍可能绕过(不推荐)

const 成员函数:类接口的“只读承诺”

加在成员函数声明末尾(如 int get() const;),表示该函数不会修改 this 所指对象的任何非 mutable 成员。这是实现 const 对象调用、提升接口可读性和安全性的关键。

  • 编译器强制检查:const 成员函数内不能调用非 const 成员函数,也不能修改非 mutable 数据成员
  • mutable 是例外:用于标记“逻辑上不改变对象状态”的可变成员(如缓存、计数器),允许在 const 函数中修改:mutable int cache_hit_count;
  • 重载依据:const 和非 const 版本可构成重载,编译器按调用对象是否为 const 自动选择:const T& operator[] (size_t i) const; vs T& operator[] (size_t i);

const 引用与 const 指针参数:高效且安全的函数入参

传递大对象(如 string、vector、自定义类)时,优先使用 const T& 而非 TT&,兼顾效率(避免拷贝)和安全性(防止误改)。

立即学习C++免费学习笔记(深入)”;

  • 通用建议:void process(const std::string& s); —— 接收任意字符串(字面量、临时对象、const/non-const 变量),且不修改它
  • 禁止隐式转换陷阱:非常量引用不能绑定到临时对象,但 const 引用可以:func(const std::string& s) 可接受 func("hello");而 func(std::string& s) 不行
  • 返回 const 引用需谨慎:仅当返回的是生命周期长于函数作用域的对象(如类成员、静态变量、容器元素)才安全;避免返回局部变量的 const 引用

constexpr 与 const 的协同:从运行时约束走向编译时计算

C++11 起,constconstexpr 的必要不充分条件。constexpr 更进一步,要求表达式在编译期可求值,适用于数组大小、模板参数、static_assert 等场景。

  • 基本规则:constexpr int square(int x) { return x * x; } 要求所有实参也必须是常量表达式才能触发编译期计算
  • const 不等于 constexpr:const int x = rand(); 合法(运行时初始化),但不能用于需要常量表达式的地方;constexpr int y = 42; 既是 const,也是编译期常量
  • 类中的 constexpr 构造函数:可用于创建字面量类型(literal type)对象,支持在编译期构造,如 constexpr Point p{1, 2};

基本上就这些。const 不复杂,但容易忽略细节——尤其在指针/引用层次、成员函数设计和参数传递策略上。真正掌握它,不是为了写满 const,而是让 const 成为你代码意图的自然表达。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

280

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

254

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.1万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号