0

0

C++中的const关键字怎么用?(定义常量与常量成员函数)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-09 16:21:08

|

912人浏览过

|

来源于php中文网

原创

const是“承诺不修改”的契约标记,位置决定修饰对象,用于变量、指针、成员函数、引用参数等场景,确保数据安全、提升可读性与优化机会;滥用const_cast会导致未定义行为。

c++中的const关键字怎么用?(定义常量与常量成员函数)

const 在 C++ 里不是“只定义常量”的关键字,它本质是“承诺不修改”的契约标记——用错位置,编译器会直接报错;用对了,才能真正保护数据、提升可读性与优化机会。

const 变量声明:位置决定含义

声明 const 变量时,const 修饰的是它**左边紧邻的类型**(若左边无类型,则修饰右边)。这个规则直接影响指针和引用的行为:

  • int const x = 42;const int x = 42; 等价:x 是不可修改的整数
  • int* const ptr = &x;:ptr 指针本身不可变(不能指向别处),但 *ptr 可改
  • const int* ptr = &x;int const* ptr = &x;:ptr 可变,但 *ptr 不可改(指向只读数据)
  • const int* const ptr = &x;:指针和它指向的内容都不可变

实际开发中,尤其在函数参数传递指针/引用时,漏掉某一个 const 很容易导致编译失败或意外修改。

const 成员函数:隐式 this 指针被限定

在类成员函数声明末尾加 const,表示该函数**不会修改当前对象的任何非 mutable 成员**。编译器会把隐式的 this 指针变成 const T* const this,从而禁止对成员变量赋值、调用非 const 成员函数等操作:

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

class Data {
    int value;
    mutable int cache_hits; // mutable 是唯一例外:可在 const 函数中修改
public:
    Data(int v) : value(v), cache_hits(0) {}
int get_value() const { // ✅ 正确:不修改 value
    ++cache_hits; // ✅ 允许:mutable 成员
    return value;
}

void set_value(int v) { // ❌ 非 const 函数
    value = v;
}

};

常见错误:把本该是 const 的访问器(如 size()at())漏写 const,导致无法在 const Data& d 上调用;或者在 const 函数里不小心调用了非 const 成员函数,编译器报错类似:error: passing 'const Data' as 'this' argument discards qualifiers

const 引用参数:避免拷贝 + 保证安全

函数形参用 const T& 是 C++ 中最常用也最值得坚持的习惯之一:

  • 传大对象(如 std::string、自定义类)时避免深拷贝开销
  • 编译器禁止函数体内修改实参,从接口层面杜绝副作用
  • 能接受字面量、临时对象、const 对象 —— 普通 T& 不能绑定临时量

例如:void process(const std::vector& v) 可以安全接收 process({1,2,3});而 void process(std::vector& v) 就不行。

const_cast:极少需要,多数是设计缺陷的信号

const_cast 唯一合法用途是移除由“C 风格接口”强加的 const(比如调用老 C 库函数,它声称不改数据但没声明参数为 const)。除此之外,用 const_cast 修改原本声明为 const 的对象,属于未定义行为:

const int x = 10;
int* p = const_cast(&x);
*p = 20; // ❌ 未定义行为:x 是字面量级 const,可能存于只读段

真正需要修改的成员,应一开始就用 mutable 标记;需要可变接口,就提供 const/non-const 两个重载版本,而不是靠 const_cast 打补丁。

最容易被忽略的一点:const 正确性不是“加了就安全”,而是整个调用链都要一致——某个中间函数忘了加 const,就会让上游所有 const 保证失效。它像一层玻璃,一处裂缝,整面就失去作用。

相关专题

更多
string转int
string转int

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

315

2023.08.02

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

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

1463

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

271

2023.10.25

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

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

520

2023.09.20

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

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

520

2023.09.20

string转int
string转int

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

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

532

2024.08.29

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

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

精品课程

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

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

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

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