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

【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.dtcms.com/a/358076.html

相关文章:

  • 数据结构 03(线性:单链表)
  • 强化学习-CH6 随机近似
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • 2025年9月计算机二级C++语言程序设计——选择题打卡Day11
  • 如何取得专案/设计/设定/物件的属性
  • mysql权限user表赋权操作修改
  • 《潮汐调和分析原理和应用》之四S_Tide使用2
  • 整体设计 的语言设计:通用模型语言的标准模板语言的规格模式语言(搜狗汪仔答问)
  • 【计算机网络】生产问题排查:如何使用Wireshark抓包/读取抓包文件进行网络分析
  • 使用AI大模型Seed1.5-VL精准识别开车接打电话等交通违法行为
  • TensorFlow深度学习实战(35)——概率神经网络
  • k8s(自写)
  • Kafka 4.0 生产者配置全解析与实战调优
  • STM32手动移植FreeRTOS
  • 算法(②排序算法)
  • 吴恩达机器学习作业八:SVM支持向量机
  • react代码分割
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:二维数组较简单题目的解析
  • Redis(自写)
  • LeetCode第438题 - 找到字符串中所有字母异位词
  • C++ 面试高频考点 力扣 34. 在排序数组中查找元素的第一个和最后一个位置 二分查找左右端点 题解 每日一题
  • 为什么vue3会移除过滤器filter
  • JUC并发编程10 - 内存(02) - volatile
  • 生成对抗网络(GAN):深度学习领域的革命性突破
  • DriveDreamer4D
  • YOLOv11 训练参数全解析:一文掌握 epochs、batch、optimizer 调优技巧
  • MySQL-事务(下)-MySQL事务隔离级别与MVCC
  • 检索优化-混合检索
  • 捡捡java——2、基础07
  • 使用git bash ,出现Can‘t get terminal settings: The handle is invalid. 的解决方法与思路