【C++指南】类和对象(十):const成员函数

【C++指南】类和对象(十):const成员函数
           💓 博客主页:倔强的石头的ZEEKLOG主页 

           📝Gitee主页:
倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注



目录

引言

一、const成员函数的定义与语法

1. 基本语法

2. 底层原理

二、const成员函数的作用与约束

1. 保障数据安全

2. 与const对象的关系

三、特殊场景与进阶技巧

1. mutable关键字

2. 函数重载

3. 权限传递规则

四、最佳实践与常见误区

1. 编码规范建议

2. 易错点分析

五、总结


引言

在C++中,const成员函数是面向对象编程中保障数据安全性的重要机制。它通过限制函数对类成员的修改权限,提升代码的健壮性和可维护性。

本文将结合代码示例,从语法、原理到实际应用场景,全面解析const成员函数的核心要点。

 

一、const成员函数的定义与语法

1. 基本语法

在成员函数的参数列表后添加const关键字,表明该函数不会修改类的非静态数据成员。

声明与定义需保持一致,否则编译器会视为不同函数,导致链接错误
 

 class Student { private: string name; int score; public: // 声明为const成员函数 const string& getName() const; }; // 定义时必须加const const string& Student::getName() const { return name; }

 

2. 底层原理

const成员函数通过修改隐式this指针的类型实现限制:
也就是说const成员函数,参数列表后边的const实际是修饰隐藏的this指针

  • 普通成员函数void func(A* const this)
  • const成员函数void func(const A* const this)

    const成员函数的this指针指向的对象不可被修改,

二、const成员函数的作用与约束

1. 保障数据安全

  • 禁止修改成员变量:若在const函数中尝试修改非mutable成员,编译器直接报错
  • 允许访问静态成员:静态成员不属于对象,可被修改
 class A { static int count; public: void increment() const { count++; } // 合法 };

 

2. 与const对象的关系

  • const对象只能调用const成员函数:违反此规则会导致编译错误
  • 非const对象优先调用非const版本:若无匹配的非const函数,则调用const版本(权限可以缩小,不能放大,非const对象调用const函数相当于原本可以读写,现在变为只读了)
const Student stu("Alice"); stu.getName(); // 必须调用const版本

简单来说:

  • 普通对象可以调用const成员函数和普通成员函数,const对象只能调用const成员函数

三、特殊场景与进阶技巧

1. mutable关键字

若需在const函数中修改某些成员,可用mutable修饰该变量。常用于缓存、状态标记等场景

class Date { private: mutable int accessCount; // 可被const函数修改 public: void logAccess() const { accessCount++; } };

 

2. 函数重载

const成员函数可与非const版本构成重载,编译器根据对象常量性选择调用:

class Screen { public: char get(int x, int y); // 非const版本 char get(int x, int y) const; // const版本 }; const Screen cs; cs.get(0, 0); // 调用const版本

const对象只能调用const函数,普通对象优先调用普通成员函数 

 

 

3. 权限传递规则(重要)

  • const函数不能调用非const函数:避免间接修改成员(权限放大)
  • 非const函数可调用const函数:权限缩小是安全的

四、最佳实践与常见误区

1. 编码规范建议

  • 所有只读函数声明为const:如getter方法,提升接口安全性
  • 谨慎使用mutable:过度使用会破坏const语义,建议仅用于逻辑状态变量

2. 易错点分析

  • 返回非const引用:若const函数返回成员的非const引用,可能通过返回值意外修改数据
// 错误示例:通过返回值修改name string& Student::getName() const { return name; // 编译错误!需返回const string& }

 

五、总结

const成员函数通过限制函数行为,显著增强代码的鲁棒性。其核心价值体现在:

  1. 明确语义:标识函数为“只读”操作,提升代码可读性。
  2. 支持常量对象:确保const对象仅调用安全函数。
  3. 编译器辅助检查:在编译阶段捕获非法修改行为。

正确使用const成员函数,是编写高质量C++代码的重要习惯。


参考实现与扩展阅读

  • 《Effective C++》:条款3“尽可能使用const”
  • 《C++ Primer》:第7章“类”

Read more

Claude, Cursor, Aider, Copilot,AI编程助手该选哪个?

2026年,AI编程工具已经非常成熟了。市面上这么多AI编程工具,哪个最好用? 本文选取了当前最具代表性的六款工具:Claude Code、Aider、Cursor、GitHub Copilot、MetaGPT 以及 OpenHands,从技术特性、优缺点及部署门槛进行客观对比。 Claude Code Anthropic 于2025年推出了 Claude Code,这是一款基于命令行的编程智能体工具。它不同于网页版的对话框,而是直接运行在终端中,能够深度理解本地项目结构。最出名的 AI 编程助手,很贵,但一分钱一分货,不得不说它很好用。 通过终端直接通过自然语言操作。它不仅能写代码,还能自主运行测试、解释复杂的架构、甚至执行终端命令来修复错误。其背后依托的是推理能力极强的 Claude 3.5/3.7 Sonnet 模型。 优势: * 推理能力极强:在处理复杂的逻辑重构和长代码理解上,目前处于行业顶尖水平。 * 自主性:

By Ne0inhk

Whisper-WebUI语音转文字完整教程:5分钟快速部署AI字幕生成器

Whisper-WebUI语音转文字完整教程:5分钟快速部署AI字幕生成器 【免费下载链接】Whisper-WebUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper-WebUI 还在为视频字幕制作而烦恼吗?Whisper-WebUI让你的音频转录变得简单高效!这款基于OpenAI Whisper模型的现代化语音转文字工具,通过直观的网页界面让任何人都能轻松完成专业级的字幕生成任务。 为什么选择Whisper-WebUI? 传统语音转文字工具往往操作复杂、准确率低,而Whisper-WebUI彻底解决了这些痛点: * 零技术门槛:无需编程经验,网页界面操作 * 多格式支持:MP3、WAV、FLAC、YouTube链接等 * 智能语言识别:自动检测近百种语言 * 完整功能生态:字幕生成、背景音乐分离、说话人识别一体化 快速部署指南 环境准备 开始之前,请确保你的系统已安装以下软件: * Git版本控制工具 * Python 3.10-3.12版本 * FFmpeg多媒体处理框架 一键安装步骤 Wind

By Ne0inhk
2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程 作为编程党,谁能拒绝免费的 Copilot Pro?每月省 10 $,解锁无限制代码补全、Anthropic Claude Sonnet 4, GPT-5, Gemini 2.5 Pro等高级模型、每月 300 次 Premium 请求,学生身份认证就能直接白嫖,全程零成本,亲测 2026 年有效!这篇教程把所有步骤、避坑点都捋清楚了,跟着做一遍过,再也不用受免费版额度的气! 前言 先说说为什么一定要冲 Copilot Pro:免费版每月只有 2000 次代码补全 + 50 次聊天请求,写代码刚进入状态就提示额度用完,体验感拉胯;而 Pro

By Ne0inhk

Windows 环境下 llama.cpp 编译 + Qwen 模型本地部署全指南

在大模型落地场景中,本地轻量化部署因低延迟、高隐私性、无需依赖云端算力等优势,成为开发者与 AI 爱好者的热门需求。本文聚焦 Windows 10/11(64 位)环境,详细拆解 llama.cpp 工具的编译流程(支持 CPU/GPU 双模式,GPU 加速需依赖 NVIDIA CUDA),并指导如何通过 modelscope 下载 GGUF 格式的 Qwen-7B-Chat 模型,最终实现模型本地启动与 API 服务搭建。 1.打开管理员权限的 PowerShell/CMD,执行以下命令克隆代码: git clone https://github.com/ggml-org/llama.cpp mkdir

By Ne0inhk