0

0

c++中如何使用const修饰成员函数_c++常成员函数使用方法

尼克

尼克

发布时间:2026-03-15 22:04:01

|

628人浏览过

|

来源于php中文网

原创

const成员函数锁住的是this指针所指对象的可修改性,禁止修改成员变量、调用非const成员函数或返回非常量引用,但允许mutable变量修改。

c++中如何使用const修饰成员函数_c++常成员函数使用方法

const 成员函数到底锁住了什么

它锁住的是 this 指针所指对象的**可修改性**,不是函数内部所有变量。也就是说,编译器会禁止你在 const 成员函数里调用非 const 成员函数、修改成员变量(除非加 mutable),甚至不能返回成员变量的非常量引用。

常见错误现象:error: assignment of member 'X::val' in read-only object —— 你在 const 函数里写了 val = 42;;或者 error: passing 'const X' as 'this' argument discards qualifiers —— 你试图在 const 函数里调用一个没加 const 的成员函数 helper()

  • 只读场景才该加 const:比如 size()empty()at()(标准库中这些全是 const)
  • 如果函数逻辑上不改变对象状态,但内部用了缓存或日志计数器,把对应变量声明为 mutable int cache_hits_; 即可绕过限制
  • const 成员函数可以被 const 对象和非常量对象同时调用;而非 const 版本只能被非常量对象调用

const 放哪儿?语法位置别搞错

const 是成员函数声明的**一部分**,必须紧挨着函数参数列表之后、函数体之前,且属于函数类型签名。写错位置(比如放在返回类型前、或者函数名后空格太多)会导致编译失败或语义完全不同。

正确写法:int get_value() const;;错误写法:const int get_value();(这只是返回 const int)、int get_value() const & {}(多了一个 &,变成右值引用限定符)。

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

  • 声明和定义必须一致:头文件里写了 void log() const;,实现文件里就得写 void X::log() const { ... }
  • const 修饰的是隐式 this 的类型:在 const 成员函数内,this 的类型是 const X*,不是 X*
  • 如果函数还带引用限定符(C++11 起),顺序是:参数列表 → &&&const(如 void f() & const; 合法但极少用,通常只选其一)

const 成员函数和重载的关系

const 和非 const 版本可以构成重载——这是 C++ 允许的,而且非常实用。编译器根据调用对象是否为 const 来决定调用哪个版本,而不是看函数内部干了啥。

标小智
标小智

智能LOGO设计生成器

下载

典型使用场景:实现 operator[] 的两种行为。非常量对象返回可写引用,const 对象返回只读引用,避免意外修改。

class Vec {
    std::vector<int> data_;
public:
    int& operator[](size_t i) { return data_[i]; }
    const int& operator[](size_t i) const { return data_[i]; }
};
  • 如果只提供非 const 版本,const 对象就无法调用 operator[],连读都不行
  • 如果只提供 const 版本,非常量对象也能调,但返回的是 const 引用,无法赋值,失去意义
  • 两个版本返回类型必须不同(通常是引用 vs const 引用),否则重载解析失败

容易被忽略的隐式转换陷阱

const 成员函数不会阻止你调用某些看似“安全”的操作,但可能触发静默的临时对象构造,带来性能或逻辑问题。

例如:在 const 成员函数里返回 std::string 成员的 c_str(),看起来没问题,但如果成员是 std::string name_,而你写 return name_.c_str();,返回的是指向内部缓冲区的指针——这本身合法;但如果你不小心写了 return (name_ + "_tmp").c_str();,就会返回临时 std::string 的内部指针,一出函数就悬垂。

  • const 成员函数里调用非 const 成员函数不会“自动转 const”,只会报错——别指望编译器帮你妥协
  • 返回值类型如果是类类型,确保拷贝/移动语义明确;返回 const T& 要确认引用目标生命周期足够长
  • lambda 捕获 this 时,若在 const 成员函数里,捕获的是 const X*,lambda 内部也不能改成员(除非用 const_cast,不推荐)

最麻烦的不是语法报错,而是那些编译通过但行为异常的情况:比如缓存没更新、日志漏打、或返回了悬垂指针。const 的边界很清晰,但它的“保护范围”只到成员访问这一层,不延伸到你调用的每个第三方函数里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

1051

2023.08.02

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

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

1570

2023.10.24

scripterror怎么解决
scripterror怎么解决

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

493

2023.10.18

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

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

382

2023.10.25

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

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

564

2023.09.20

string转int
string转int

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

1051

2023.08.02

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

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

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

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

335

2025.08.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

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

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