C++ ─── 操作符重载和赋值重载

目录

赋值运算符重载

 运算符重载

赋值运算符重载(赋值重载operator=)

前置++和后置++重载


赋值运算符重载

 运算符重载

        C++为了增强代码的可读性引入了运算符重载 运算符重载是具有特殊函数名的函数 ,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字 operator 后面接需要重载的运算符符号
函数原型: 返回值类型  operator 操作符 ( 参数列表 )
注意:
        不能通过连接其他符号来创建新的操作符:比如operator@
        重载操作符必须有一个类类型参数
        用于内置类型的运算符,其含义不能改变,例如:内置的整型+ ,不 能改变其含义
        作为类成员函数重载时,其形参看起来比操作数数目少1 ,因为成员函数的第一个参数为隐
藏的 this指针。
         .*    ::    sizeof    ?:    . 注意以上 5 个运算符不能重载。这个经常在笔试选择题中出现
// 全局的operator==
class Date
{ 
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}    
//private:int _year;int _month;int _day;
};
// 这里会发现运算符重载成全局的就需要成员变量是公有的,那么问题来了,封装性如何保证?
// 这里其实可以用我们后面学习的友元解决,或者干脆重载成成员函数。
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}
void Test ()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);cout<<(d1 == d2)<<endl;
}
class Date
{ 
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// bool operator==(Date* this, const Date& d2)// 这里需要注意的是,左操作数是this,指向调用函数的对象bool operator==(const Date& d2){return _year == d2._year;&& _month == d2._month&& _day == d2._day;}
private:int _year;int _month;int _day;
};

赋值运算符重载(赋值重载operator=)

        1. 赋值运算符重载格式
                参数类型:const &T ,传递引用可以提高传参效率
                返回值类型:T& ,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
                检测是否自己给自己赋值
                返回*this :要复合连续赋值的含义
class Date
{ 
public :
//构造函数Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//拷贝构造函数Date (const Date& d){_year = d._year;_month = d._month;_day = d._day;}//赋值重载函数Date& operator=(const Date& d)//引用{if(this != &d)//取地址判断是否是自己给自己赋值{_year = d._year;_month = d._month;_day = d._day;}return *this;}private:int _year ;int _month ;int _day ;
};

        2. 赋值运算符只能重载成类的成员函数不能重载成全局函数

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& right)
{if (&left != &right){left._year = right._year;left._month = right._month;left._day = right._day;}return left;
}
// 编译失败:
// error C2801: “operator =”必须是非静态成员
        原因:赋值运算符如果不显式实现(写出来),编译器会生成一个默认的。此时用户再在类外自己实现
一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故 赋值运算符重载只能是类的成员函数。
        3. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。(浅拷贝)
        注意:内置类型成员变量(int ,char)是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符 重载完成赋值。
class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time& operator=(const Time& t){if (this != &t){_hour = t._hour;_minute = t._minute;_second = t._second;}return *this;}
private:int _hour;int _minute;int _second;
};class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};int main()
{Date d1;Date d2;d1 = d2;return 0;
}

        既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了 ,还需要自己实
现吗?当然像日期类这样的类是没必要的。
        注意: 如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必
须要实现。

前置++和后置++重载

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// 前置++:返回+1之后的结果// 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率Date& operator++(){_day += 1;return *this;}// 后置++:// 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载// C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递// 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this+1//而temp是临时对象,因此只能以值的方式返回,不能返回引用Date operator++(int){Date temp(*this);_day += 1;return temp;}
private:int _year;int _month;int _day;
};int main()
{Date d;Date d1(2022, 1, 13);d = d1++;    // d: 2022,1,13   d1:2022,1,14d = ++d1;    // d: 2022,1,15   d1:2022,1,15return 0;
}

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助

欢迎各位点赞,收藏和关注哦

如果有疑问或有不同见解,欢迎在评论区留言哦

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

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

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

相关文章

某手滑块逆向流程分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3Byb2ZpbGUvM3h4Ymt3ZDhta250ZWFj 参数流程…

【刷题笔记】第五天

文章目录 [705. 设计哈希集合](https://leetcode.cn/problems/design-hashset/)实现一&#xff1a;纯数组实现实现二&#xff1a;数组链表实现三&#xff1a;位运算 [A B Problem II ](https://vjudge.net.cn/problem/HDU-1002)[DNA sequence](https://vjudge.net.cn/problem/…

开发工具:推荐一款实用的浏览器查看json插件(附下载)

目录 插件简介 支持的 mime类型 插件特点 “Tree”视图支持的快捷键列表: “Code”视图支持的快捷键列表: 安装方法 使用效果 插件简介 “JSON Beautifier”扩展程序是一个实用工具&#xff0c;可方便查看、编辑、格式化、验证和导出JSON页面。该扩展程序无需任何设置即可运行…

# Nacos 服务发现-Spring Cloud Alibaba 综合架构实战(四) -实现 service2 子模块。

Nacos 服务发现-Spring Cloud Alibaba 综合架构实战&#xff08;四&#xff09; -实现 service2 子模块。 1、在 service2 子模块下的 service-2-api 二级子工程中&#xff0c;定义服务接口 创建 ProviderService.java /*** C:\java-test\idea2019\nacos_discovery\nacos-mi…

【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 Java 空行强制类型转换Java 基本数据类型内置数据类型引用类型 Java 空行 空白行或者有注释的行&#xff0c;Java 编译器都会忽略掉。 强制类型转换 当需要将一个数据类型转换为另一个数据类型时&#xff0c…

全新升级数智化招标采购平台V7.0亮点,助推管理提升

数智化招标采购平台V7.0是郑州信源凭借18年以来在招采领域累积的深厚行业经验和业务洞察&#xff0c;迭代升级的全新产品&#xff0c;平台融合云原生、微服务、大数据、人工智能、物联网等先进技术&#xff0c;构建业务中台、数据中台、AI中台三大核心基座&#xff0c;以采购为…

rabbitMQ如何保证消息有序性

单队列&#xff08;Single Queue&#xff09;与单消费者&#xff08;Single Consumer&#xff09;&#xff1a; 如果只有一个生产者向单一队列发送消息&#xff0c;并且这个队列只连接了一个消费者&#xff0c;则RabbitMQ默认情况下就能够保证消息的有序性。因为RabbitMQ会按照…

Cat6 屏蔽与非屏蔽:决定最佳选择

Cat6 电缆通常用于现代网络中的高速以太网数据传输。它们有两种类型&#xff1a;屏蔽 &#xff08;STP&#xff09; 和非屏蔽 &#xff08;UTP&#xff09;。这两种电缆之间的主要区别在于它们对电磁干扰 &#xff08;EMI&#xff09; 和串扰的抵抗力。 屏蔽 Cat6 电缆具有额外…

python代码打包exe文件

创建和激活虚拟环境 创建虚拟环境 首先让我们创建一个虚拟环境。你可以使用 venv 模块来创建一个虚拟环境。以下是创建虚拟环境的步骤&#xff1a; 打开终端&#xff08;或命令提示符&#xff09;&#xff1a;进入你想要创建虚拟环境的目录。 运行以下命令来创建虚拟环境&a…

谷歌pixel6/7pro等手机WiFi不能上网,显示网络连接受限

近期在项目中遇到一个机型出现的问题,先对项目代码进行排查,发现别的设备都能正常运行,就开始来排查机型的问题,特意写出来方便后续查看,也方便其它开发者来自查。 设备机型:Pixel 6a 设备安卓版本:13 该方法无需root,只需要电脑设备安装adb(即Android Debug Bridge…

protobuf 编码原理

简介 Protocol Buffers&#xff08;protobuf&#xff09;&#xff0c;它是 Google 开发的一种数据序列化协议&#xff08;与 XML、JSON 类似&#xff09;。 优点&#xff1a; 效率高&#xff1a;Protobuf 以二进制格式存储数据&#xff0c;比如 XML 和 JSON 等文本格式更紧凑…

Swift中的条件语句

在Swift中&#xff0c;条件语句用于根据条件的真假来执行不同的代码块。Swift提供了以下几种条件语句&#xff1a; if语句&#xff1a; if语句根据一个条件来执行代码块。如果条件为真&#xff0c;执行if代码块中的内容&#xff1b;如果条件为假&#xff0c;则跳过if代码块。 语…

同一个类中,对于@Transactional注解的方法调用,事务传播行为不会生效

Service public class MyService { Transactional public void methodA() { // some database operations methodB(); } Transactional(propagation Propagation.REQUIRES_NEW) public void methodB() { // some other database operations } }这里&#xff0c;即使…

基于机器学习的安全检测 网络入侵检测概述

1.概述 入侵检测是网络安全中的经典问题,入侵是指攻击者违反系统安全策略,试图破坏计 算资源的完整性、机密性或可用性的任何行为。由定义可见,入侵并非一种特定的入侵行 为,而是一类入侵行为的统称。常见的网络攻击方式包括拒绝服务攻击、伪装身份入侵等。 入侵检测系统(Intru…

C++这个编程语言以后会消失吗,就像以前70后学的编程语言?

随着AI自举编程的到来&#xff0c;绝大多数人类编程语言都会消失&#xff0c;只有 Scratch 这类启智语言作为儿童玩具保留下来。目前看来这一天不远了。 AI自举编程首先无需遵循这种可读文本变为二进制操作码的套路&#xff0c;它本身就是二进制的。而后&#xff0c;一旦智能制…

全局视角观看Python备忘录-英文版

全局视角观看Python备忘录-英文版

如何使用spring-AI?

Spring AI 简介 1、概览 Spring 通过 Spring AI 项目正式启用了 AI&#xff08;人工智能&#xff09;生成提示功能。本文将带你了解如何在 Spring Boot 应用中集成生成式 AI&#xff0c;以及 Spring AI 如何与模型互动。 2、Spring AI 的主要概念 首先回顾一下一些关键…

Qt中的槽(slot)和机器视觉的算子(operator)

Qt中的槽&#xff08;slot&#xff09;和机器视觉中的算子&#xff08;operator&#xff09;都是方法或函数&#xff0c;它们都是在软件中用于执行特定任务的代码块。 在Qt中&#xff0c;槽是一段可以被信号触发的代码&#xff0c;用于响应特定的事件。槽是对象的一部分&#…

十分钟搞定4G转Uart网关:FlexLua低代码助力

在当今的物联网应用中&#xff0c;各种设备之间的连接变得日益重要&#xff0c;而4G转Uart网关设备的出现为设备之间的通信提供了简便的解决方案&#xff0c;推动了物联网技术的不断发展。 4G转Uart网关的通信原理相对简单清晰。它通过4G网络接收数据&#xff0c;然后将数据转换…

Nginx内存池相关源码剖析(六)外部资源释放和内存池销毁

ngx_destroy_pool函数 先执行回调函数释放所有的外部资源&#xff0c;然后free释放所有的大块内存和小块内存。 // 释放外部资源&#xff0c;销毁内存池 void ngx_destroy_pool(ngx_pool_t *pool) {ngx_pool_t *p, *n;ngx_pool_large_t *l;ngx_pool_cleanup_t *…