C++ 成员函数const修饰谁 C++ this指针的const属性解析【语法】
技术百科
穿越時空
发布时间:2026-01-25
浏览: 次 const成员函数将this指针类型变为const T*,禁止修改非mutable成员,但允许修改mutable成员、间接修改外部对象及操作局部变量;const与non-const版本可重载,依据调用对象是否const选择。
const 成员函数修饰的是 this 指针所指向的对象
写成 void func() const,不是说 func 本身不可变,而是编译器会把隐式参数 this 的类型从 T* 变成 const T*。这意味着在该函数体内,你不能通过 this(即不能通过 this-> 或直接访问成员)修改当前对象的任何非 mutable 成员。
const 成员函数里能改哪些东西
看似“只读”,但有例外。以下操作是允许的:
-
mutable修饰的成员变量可以被修改(常用于缓存、计数器等逻辑上不改变对象“状态”的字段) - 通过指针或引用间接修改外部对象(比如成员是指针,你改它指向的内容)
- 调用其他
const成员函数 - 局部变量、形参、静态变量照常可写
但以下操作会编译报错:
- 给普通成员变量赋值(如
value = 42;) - 调用非
const成员函数(如do_something();,除非该函数也声明为const) - 返回非
const引用或指针指向当前对象的成员(除非显式const_cast,但通常不推荐)
const 和 non-const 成员函数的重载关系
它们可以构成重载——编译器根据调用对象是否为 const 来选择版本:
class Example {
public:
int& get() { return data; } // 非 const 版本
const int& get() const { return data; } // const 版本
private:
int data = 0;
};使用时:
-
Example e; e.get() = 10;→ 调用非const版本 -
const Example ce; ce.get();→ 只能调用const版本,返回const int&,不能赋值
注意:仅靠返回值不同无法重载,必须一个带 const、一个不带,且 this 的 cv-qualifier 不同才是合法重载。
容易忽略的细节:const 成员函数里 this 的真实类型
在 void foo() const 中,this 的类型是 const T* const(顶层 const 表示指针本身不可变,底层 const 表示它指向的对象不可变)。也就是说:
- 你不能写
this = nullptr;(顶层const禁止重绑定this) - 也不能写
this->x = 1;(底层const禁止修改成员) - 但你可以安全地取地址、做
static_cast、传给只读接口(this)
很多调试时发现“明明加了 const 还能改”,往往是因为改的是指针所指内

mutable,而不是 this 本身的 const 属性失效了。
# 的是
# 才是
# 会把
# 是因为
# 还能
# 绑定
# 是说
# 对象
# c++
# int
# void
# 指针
# 接口
# 报错
# 不带
# this
# 成员变量
# 成员函数
# 指针类型
# const
# 局部变量
# 形参
# 但你
# mutable
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10怎样安装Word样式库_Win10安装W
- Win11怎么设置默认输入法 Win11固定中文输
- Win11鼠标灵敏度怎么调 Win11鼠标指针移动
- Win11怎么开启智能存储_Windows11存储
- ACF 教程:如何正确更新嵌套在多层 Group
- Win11如何设置计划任务 Win11定时执行程序
- 如何使用Golang recover捕获panic
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Win11如何设置电源计划_Win11电源计划优化
- Windows资源管理器总是卡顿或重启怎么办?(修
- Win10如何备份驱动程序_Win10驱动备份步骤
- c++输入输出流 c++ cin与cout格式化输
- Windows10系统更新错误0x80070002
- Windows笔记本无法进入睡眠模式怎么办?(电源
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- 如何使用Golang管理跨项目依赖_Golang多
- PythonFastAPI项目实战教程_API接口
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win10系统怎么查看显卡温度_Win10任务管理
- PhpStorm怎么调试PHP代码_PhpStor
- Win11更新后变慢怎么办_Win11系统更新后卡
- Python与GPU加速技术_CUDA与Numba
- Win11输入法选字框不见了怎么办_Win11输入
- mac怎么退出id_MAC退出iCloud账号与A
- Python对象比较与排序_魔术方法解析【教程】
- php内存溢出怎么排查_php内存限制调试与优化方
- Win10怎样卸载TeamViewer_Win10
- Golang如何实现基本的用户注册_Golang用
- 如何在Golang中实现文件下载_Golang文件
- C++ STL算法库怎么用?C++常用算法函数(s
- Windows10系统服务优化指南_Win10禁用
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- php修改数据怎么改富文本_update更新htm
- 如何使用Golang实现基本类型比较_Golang
- 如何使用Golang开发简单的聊天室消息存储_Go
- Windows怎样关闭锁屏广告_Windows关闭
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- PHP cURL GET请求:正确设置请求头与身份
- Mac系统更新下载慢或失败怎么办_解决macOS升
- Win11无法识别耳机怎么办_解决Win11插耳机
- Win11怎么设置默认PDF阅读器 Win11修改
- Go语言中正确反序列化多个同级XML元素为结构体切
- Linux如何使用Curl发送请求_Linux下A
- Win11怎么设置系统还原_Windows11系统
- Win10怎么关闭自动更新错误重启 Win10策略
- Win11怎么关闭粘滞键_彻底禁用Windows
- Golang如何测试HTTP中间件_Golang

QQ客服