当前位置: 首页 > ops >正文

【C++】C++ const成员函数与取地址操作符重载

0. 上篇

【C++】运算符重载深度解析-CSDN博客

1. const成员函数

        有时候我们定义成员函数时,为了防止成员函数修改对象,我们会在参数部分加上 const 修饰,比如:

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}void Func(const Date& d){d.Print();        // 报错}
private:int _year; // 年int _month; // 月int _day; // 日
};

        但此时 d.Print() 会出现报错,因为成员函数默认含有 this 指针,调用 Func 时,相当于 d.Print(const Date* this),但 Print 函数的参数是 Print(Date* this),此时出现了权限的放大,所以出现报错。

        解决方法也很简单,把 Print 的 this 指针参数加上一个 const 就行了。

        我们将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

        上图中的 const 修饰的不是 this 指针本身,而是 this 指针指向的对象。

const Date* p1  -> 修饰指向的对象
Date const * p2 -> 修饰指向的对象
Date* const p3  -> 修饰指针本身

        在 const 成员函数中,不能修改成员变量,因为此时 this 指针指向的对象被 const 修饰,只读不可写。

        所以:非 const 成员函数和 const 成员函数都可以调用 const 成员函数,但是 const 成员函数不能调用非 const 成员函数。这是一个权限缩放的问题。

        那什么时候给成员函数加上 const ?

        结论:只要成员函数中不需要直接或间接修改成员变量最好都加上 const 。

2. 取地址及const取地址操作符重载

        这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

class Date
{
public:Date* operator&(){return this;}const Date* operator&()const{return this;}
private:int _year; // 年int _month; // 月int _day; // 日
};

        这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容。

http://www.xdnf.cn/news/19162.html

相关文章:

  • 【Leetcode hot 100】21.合并两个有序链表
  • Flutter MVVM+provider的基本示例
  • ceph配置集群
  • VGG改进(6):基于PyTorch的VGG16-SE网络实战
  • “我店模式“当下观察:三方逻辑未变,三大升级重构竞争力
  • 详解常见的多模态大模型指令集构建
  • vue表格底部添加合计栏,且能跟主表同时滑动
  • 「鸿蒙系统的编程基础」——探索鸿蒙开发
  • 机器视觉学习-day12-图像梯度处理及图像边缘检测
  • REST API 是无状态的吗,如何保障 API 的安全调用?
  • 中科院人机交互科研分享-田丰
  • OpenCV 轮廓分析实战:从检测到形状匹配的完整指南
  • 【后端】云服务器用nginx配置域名访问前后端分离项目
  • SpringBoot防止重复提交(2)
  • docker 部署Skywalking
  • 干掉抽取壳!FART 自动化脱壳框架与 Execute 脱壳点解析
  • OpenCV DNN 模块完全指南:从理论基础到实战应用 —— 图像分类与目标检测的深度学习实现(含 Python/C++ 代码与性能分析)
  • 一站式可视化运维:解锁时序数据库 TDengine 的正确打开方式
  • 微信小程序长按识别图片二维码
  • 【C语言】字符函数与字符串函数实战:用法原理 + 模拟实现
  • 零、2025 年软件设计师考试大纲
  • Citrix 零日漏洞自五月起遭积极利用
  • Redis-基数统计、位图、位域、流
  • LangChain.js 实战与原理:用 LCEL 构建可维护的 RAG / Agent 系统(含 4 套 30+ 行代码)
  • 大语言模型生成的“超龄劳动者权益保障制度系统化完善建议(修订版)”
  • Day17(前端:JavaScript基础阶段)
  • Elasticsearch:Semantic text 字段类型
  • PostgreSQL令牌机制解析
  • Linux从入门到进阶--第四章--Linux使用操作
  • TuringComplete游戏攻略(2.1算数运算)