【C++】类与对象(三)—运算符重载|const成员函数|取地址及const取地址操作符重载

在这里插入图片描述

前言
运算符重载,自增自减运算符重载,const成员函数,取地址及const取地址操作符重载


文章目录

  • 一、运算符重载
    • 自增和自减运算符重载
  • 二、const 成员函数
  • 三、取地址及const取地址操作符重载(了解即可)

一、运算符重载

运算符重载允许重新定义类对象的运算符行为。通过运算符重载,你可以使自定义类型的对象与内置类型一样,使用各种运算符进行操作,从而提高代码的可读性和灵活性。

语法:

//函数名:关键字operator后面接需要重载的运算符符号。
//函数原型:返回值类型 operator操作符(参数列表)
ReturnType operator+(参数) {// 重载的 + 运算符的实现// 返回类型可以是任何合适的类型}

运算符重载可以被重载成类的成员函数,也可以被重载成全局函数。重载成员函数形式的赋值运算符在使用时通过成员访问方式调用,而重载全局函数形式的赋值运算符则直接通过函数名调用。
1. 成员函数形式:

class MyClass {
public:// 成员函数形式的赋值运算符重载MyClass& operator=(const MyClass& other) {// 实现赋值操作// 返回当前对象的引用if (this != &other) {// 实现赋值操作,例如深拷贝资源}return *this;}
};// 调用
MyClass obj1, obj2;
obj1 = obj2;

在成员函数形式中,运算符重载是通过对象的成员访问方式调用的。左侧的对象(obj1)成为调用对象,右侧的对象(obj2)成为参数传递给成员函数。


2. 全局函数形式:
在全局函数的形式下,函数的参数中不会隐含this指针,因此要传两个参数。

class MyClass {// MyClass 的声明
};// 全局函数形式的赋值运算符重载
MyClass& operator=(MyClass& obj1, const MyClass& obj2) {// 实现赋值操作// 返回第一个对象的引用if (&obj1 != &obj2) {// 实现赋值操作,例如深拷贝资源}return obj1;
}// 调用
MyClass obj1, obj2;
obj1 = obj2;

在全局函数形式中,运算符重载是通过函数名直接调用的。左侧的对象(obj1)成为函数的第一个参数,右侧的对象(obj2)成为函数的第二个参数。


注意:

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型参数
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为成员函数重载时,第一个参数为隐藏的this
  • .* :: sizeof ?: . 这5个运算符不能重载。.* 用于访问类成员指针的操作符。

自增和自减运算符重载

前置和后置自增自减运算符的区分是通过参数列表的一个标识符来实现的。具体来说,前置版本没有任何参数,而后置版本有一个额外的(但不使用)int参数。

这里以自增为例:

重载前置自增运算符ReturnType operator++(){}重载后置自增运算符ReturnType operator++(int){}

前置和后置自增的实现:

  • 前置自增运算符重载:

    class MyClass {
    private:int value;
    public:// 重载前置自增运算符MyClass& operator++() {++value;return *this;}
    };
    
  • 后置自增运算符重载:

    class MyClass {
    private:int value;
    public:// 重载后置自增运算符MyClass operator++(int) {MyClass temp = *this; // 保存原始值++value;             // 执行自增操作return temp;         // 返回原始值}
    };
    

注意:

  • 前置自增运算符返回引用,使得可以对同一对象连续进行自增操作。
  • 后置自增运算符通过返回原始值的副本,再执行自增操作,以允许保留原始值。

二、const 成员函数

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

以日期类为例:
我们创建一个对象,同时加const修饰,变成常量对象。

class Date {
private:int _year;int _month;int _day;
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print() {cout << _year << "/" << _month << "/" << _day << endl;}
};int main() {//d1 被声明为常量对象,不可修改const Date d1(2024, 1, 31);//报错:“void Date::Print(void)”: 不能将“this”指针从“const Date”转换为“Date &”//d1.Print(); return 0;
}

当我们调用成员函数Print()时,编译器会报错,这是因为在通过对象调用成员函数时,this指针被隐式传参,d1是只读不可修改,但在Print()又没有办法对this指针进行限制,所以会出现权限放大的情况。权限只可以平移,缩小,但是不能放大。

//Date成员函数
void Print() {cout << _year << "/" << _month << "/" << _day << endl;}Date d1(2024, 1, 31);
//d1 是可读可修改,在Print()内同样是可读可修改的,这是权限平移
d1.Print();//---------------------------------------------------------------------void Print(const int a) {cout << _year << "/" << _month << "/" << _day << endl;}Date d1(2024, 1, 31);int a = 5;
//在Print()中a不可被修改,这是权限缩小
d1.Print(a);

所以提出了const成员函数的概念。在函数名后加const实际上限制了this指针。

//在函数名后面加上const
void Print() const {cout << _year << "/" << _month << "/" << _day << endl;}
//实际上是对this的修饰
void Print(/*const Date* this*/) {cout << _year << "/" << _month << "/" << _day << endl;}

另外,如果一个类有两个版本的成员函数,一个是const版本,一个是非const版本,它们可以根据需要被const和非const对象调用。这实际上是函数重载


思考这些问题:

  1. const对象可以调用非const成员函数吗?
  2. 非const对象可以调用const成员函数吗?
  3. const成员函数内可以调用其它的非const成员函数吗?
  4. 非const成员函数内可以调用其它的const成员函数吗?

  1. const对象可以调用非const成员函数吗?

    • 不可以。const 对象只能调用 const 成员函数,因为 const 对象的目的是确保对象的状态不被修改。调用非 const 成员函数会导致编译错误。
  2. 非const对象可以调用const成员函数吗?

    • 是的。非 const 对象可以调用 const 成员函数。这是因为 const 成员函数对对象的状态有只读的访问权限,不会修改对象的成员变量。因此,非 const 对象可以安全地调用 const 成员函数。
  3. const成员函数内可以调用其他的非const成员函数吗?

    • 是的。在 const 成员函数内部,可以调用其他非 const 成员函数,只要这些非 const 成员函数不会修改对象的成员变量。这是因为 const 成员函数对对象的状态有限制,但它可以调用其他不会修改状态的函数。
  4. 非const成员函数内可以调用其他的const成员函数吗?

    • 是的。非 const 成员函数内部可以调用 const 成员函数,因为非 const 成员函数对对象的状态没有限制,可以进行读写操作。因此,非 const 成员函数可以调用 const 成员函数,而不会导致问题。

三、取地址及const取地址操作符重载(了解即可)

Date* operator&(){return this;
}const Date* operator&()const{return this;
}

取地址及const取地址操作符重载也是默认成员函数,不需要显式提供,编译器可以自己生成。

class Date{
private:int _year;int _month;int _day;
public:Date(int year, int month, int day) {_year = year;_month = month;_day = day;}Date* operator&(){return this;}const Date* operator&()const{return this;}
};int main() {Date a(2024, 1, 31);const Date b(2024, 1, 3);cout << &a << endl;cout << &b << endl;return 0;
}

在这里插入图片描述


在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】深入理解隔离性

深入理解隔离性 一、数据库并发的场景二、多版本并发控制&#xff08; MVCC &#xff09;三、三个前提知识1、3个记录隐藏字段2、undo日志 四、快照的概念五、Read View六、隔离级别RR与RC的本质区别 一、数据库并发的场景 数据库并发的场景总共有三种&#xff1a; 读-读&…

JVM中一次完整的GC回收流程

JVM堆内存结构简述 JVM堆内存结构图 堆初体验 所有的对象实例以及数组都要在堆上分配&#xff0c;堆是垃圾收集器管理的主要区域&#xff0c;也被称为“GC 堆”&#xff0c;也是我们优化最多考虑的地方。因为在一个项目中&#xff0c;会不断地创建对象&#xff0c;都是在堆里…

DevOps 教程 (4) - CI/CD 整合

在本第四章的"DevOps 教程"系列中&#xff0c;我们将介绍CI/CD整合的概念和实践。我们会介绍DevOps所带来的好处&#xff0c;包括团队协作、开发效率和产品交付速度的显著提升。 我们还将讨论在DevOps中的不同角色&#xff0c;并理解每个角色在持续集成和持续交付中的…

微调实操一: 增量预训练(Pretraining)

1、前言 《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代…

浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?

专业视听领域尤其显示控制和坐席控制领域&#xff0c;最近几年最激动人心的技术&#xff0c;莫过于分布式了。 分布式从推出之日就备受关注&#xff1a;担心稳定性的&#xff0c;质疑同步性能的&#xff0c;怀疑画面质量的…… 诚然&#xff0c;我们在此前见多了带着马赛克的…

【C++】类和对象1:类的定义、访问限定符、作用域及对象大小

前言 本文主要是简单的介绍一下类是什么、如何使用 类的定义 class className { // 类体&#xff1a;由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字&#xff0c;ClassName为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面…

智慧文旅:驱动文化与旅游融合发展的新动力

随着科技的快速发展和人们生活水平的提高&#xff0c;文化和旅游的融合成为了时代发展的必然趋势。智慧文旅作为这一趋势的引领者&#xff0c;通过先进的信息技术手段&#xff0c;推动文化与旅游的深度融合&#xff0c;为产业的发展注入新的活力。本文将深入探讨智慧文旅如何成…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏9(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言回收物品素材绘制UI代码控制垃圾桶回收功能效果 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将…

低成本高效益,电子画册才是品牌的重要选择

​随着互联网的普及和数字化技术的进步&#xff0c;电子画册已成为许多品牌的重要选择。与传统印刷画册相比&#xff0c;电子画册具有低成本、高效益的优点&#xff0c;成为品牌宣传的新趋势。 具体来说&#xff0c;电子画册可以通过在线平台或移动设备轻松查看&#xff0c;无需…

logback自定义生成DB日志(java环境)

目的&#xff1a; 未来在生成日志写入数据库中加一个特殊的字段&#xff0c;官方老版本提供的DBAppender无法实现&#xff0c;并且好巧不巧&#xff0c;在新版本这个实现也被删除了&#xff0c;所以重写一个实现。 1. 安装依赖 安装logback maven依赖 注意&#xff1a; lo…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

[高阶·产品经理]业务建模和需求高阶2月26-3月1日晚8点

等级 高阶 介绍 软件开发中&#xff0c;需求是解决“系统怎样好卖”的问题&#xff0c;设计是解决“降低开发成本”的问题。 本训练聚焦第一个方面&#xff0c;在点上强化业务建模和需求的技能。每期的教材都会根据当期学员所整理的学习《软件方法》的过程中以及工作中碰到的…

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

产品经理必备知识——API接口(获取电商商品订单数据API)

前言 在古代&#xff0c;我们的传输信息的方式有很多&#xff0c;比如写信、飞鸽传书&#xff0c;以及在战争中使用的烽烟&#xff0c;才有了著名的烽火戏诸侯&#xff0c;但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代&#xff0c;我通过…

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用&#xff0c;从而对一个组织的资产或运行造成不利影响&#xff0c;如信息系统被攻击或控制…

关于node.js奇数版本不稳定 将11.x.x升级至16.x.x不成功的一系列问题(一)

据说vue2用16稳定一些 vue3用18好一点&#xff08;但之前我vue3用的16.18.1也可以&#xff09; 为维护之前的老项目 先搞定node版本切换 下载nvm node版本管理工具 https://github.com/coreybutler/nvm-windows/releases 用这个nvm-setup.zip安装包 安之前最好先将之前的nod…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

计算机网络自顶向下Wireshark labs-HTTP

我直接翻译并在题目下面直接下我的答案了。 1.基本HTTP GET/response交互 我们开始探索HTTP&#xff0c;方法是下载一个非常简单的HTML文件 非常短&#xff0c;并且不包含嵌入的对象。执行以下操作&#xff1a; 启动您的浏览器。启动Wireshark数据包嗅探器&#xff0c;如Wir…

2024年美国大学生数学建模竞赛(E题)财产保险建模|MCDA/随机森林建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮500人完成了建模与思路的构建的处理了&#xff5e; 本文运用利用时间序列和强化学习结合DQN算法&#xff0c;解决保险业可持续性问题&#xff1b;采用MCDA和随机森林&#xff0c;应对地产业保险挑战&…

电脑怎么录屏?打造专业级视频内容!

随着科技的进步&#xff0c;电脑已经深入到我们的日常生活和工作中。而在这个数字时代&#xff0c;录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧&#xff0c;还是记录重要的演示&#xff0c;录屏都是一个不可或缺的功能。可是电脑怎么录屏呢&#xff1f;本文将深入…