C++:运算符重载(=/==)

赋值运算符(=)重载

在C++中,赋值运算符可以被重载,允许用户定义类对象的赋值行为。通过重载赋值运算符,可以自定义对象的赋值操作,以便适应特定的需求和语义。当我们定义一个自定义的类时,比如一个简单的 MyString 类,可以通过重载赋值运算符来实现对象之间的赋值操作。

这里我将赋值运算符的重载简单的分成两类:

1.简单数值赋值时的重载 
2.字符串赋值时的重载
赋值运算符重载(数值):

首先熟悉以下我们的自定义类MyStringMyString 类具有两个公共成员变量 m_nNumberAm_nNumberB,分别表示整数类型的数据。类中包括两个构造函数,一个默认构造函数和一个带有两个参数的构造函数。

class MyString {
public:
    int m_nNumberA;
    int m_nNumberB;
public:
    MyString() {};
    MyString(int NumberA, int NumberB) :m_nNumberA(NumberA), m_nNumberB(NumberB) {};
}

接着重载赋值运算符来实现该类的对象之间的赋值操作:当对象进行赋值时只需要对m_nNumberAm_nNumberB进行赋值即可,代码如下;

    MyString operator=(const MyString &obj)
    {
        this->m_nNumberA = obj.m_nNumberA;
        this->m_nNumberB = obj.m_nNumberB;
        return *this;
    }

这个时候我们在程序中进行使用:

int main() {
    MyString StringObjA(20,30);
    MyString StringObjB;
    StringObjB = StringObjA;
    
    std::cout << StringObjB.m_nNumberA << std::endl;
    std::cout << StringObjB.m_nNumberB << std::endl;
​
    system("pause");
    return 0;
}

在main函数中首先创建了两个 MyString 对象 StringObjAStringObjB,并初始化了 StringObjA 的成员变量为 (20, 30)。然后,通过赋值操作 StringObjB = StringObjA;,将 StringObjA 的值赋给了 StringObjB。最后,打印了 StringObjB 的成员变量值。

运行结果:

注意:使用重载后的赋值运算符时不能将对象的声明与赋值运算符写在一行代码中,即不能在声明对象时初始化对象,如MyString StringObjB= StringObjA;这样写编译器会默认去调用类的拷贝构造函数而不会调用重载后的赋值运算符。

接着我们在上述重载的基础上接着阐述在遇到字符串时赋值运算符如何进行重载:

赋值运算符重载(字符串):

定义了一个名为 MyString 的类,其中包含了三个公共成员变量:m_nNumberAm_nNumberBszStr。前两个成员变量是整型数据,用于存储整数值;第三个成员变量是字符指针,用于存储字符串。

类中包括了两个构造函数:一个是默认构造函数,另一个是带有三个参数的构造函数,用于初始化对象的成员变量。在带有三个参数的构造函数中,进行了字符串的深拷贝操作,即动态分配了内存来存储字符串,并将参数 szBuf 中的字符串内容复制到了新分配的内存中。

class MyString {
public:
    int m_nNumberA;
    int m_nNumberB;
    char * szStr = nullptr;
​
public:
    MyString() {};
    MyString(int NumberA, int NumberB,char * szBuf) :m_nNumberA(NumberA), m_nNumberB(NumberB) {
        //深拷贝
        szStr = new char[strlen(szBuf) + 1];
        memset(szStr,0, strlen(szBuf) + 1);
        strcpy(szStr, szBuf);
    };
    
    MyString operator=(const MyString &obj){
    //数值赋值
        this->m_nNumberA = obj.m_nNumberA;
        this->m_nNumberB = obj.m_nNumberB;
​
    //字符串赋值(深拷贝)
        this->szStr = new char[strlen(obj.szStr) + 1];
        memset(szStr,0, strlen(obj.szStr) + 1);
        strcpy(this->szStr, obj.szStr);
        return *this;
    }

接着,代码尝试重载了赋值运算符。在赋值运算符的重载函数中,首先进行了数值的赋值操作,即将右侧对象的整数成员变量值赋给了左侧对象的相应成员变量。然后进行了字符串的赋值操作,同样进行了深拷贝,以确保每个对象都拥有独立的字符串内存空间。

在程序中进行使用:

int main() {
    char szString[] = "wolven";
​
    MyString StringObjA(20,30, szString);
    MyString StringObjB;
    StringObjB = StringObjA;
    
    std::cout << StringObjB.m_nNumberA << std::endl;
    std::cout << StringObjB.m_nNumberB << std::endl;
    std::cout << StringObjB.szStr << std::endl;
​
​
    system("pause");
    return 0;
}

在这段 main 函数中,我们首先声明了一个字符数组 szString,其中存储了字符串 "wolven"。然后,我们创建了两个 MyString 类的对象 StringObjAStringObjB。对于 StringObjA,我们使用带有三个参数的构造函数进行初始化,分别传入整数值 2030,以及字符数组 szString,这个构造函数会对传入的字符数组进行深拷贝。对于 StringObjB,我们使用默认构造函数进行初始化。接着,我们将 StringObjA 的值赋给了 StringObjB,这会调用赋值运算符重载函数,将 StringObjA 的成员变量值复制给 StringObjB 的相应成员变量,同时进行了字符串的深拷贝操作。

运行结果:

对象成功进行赋值

!!注意:使用重载后的赋值运算符时不能将对象的声明与赋值运算符写在一行代码中,即不能在声明对象时初始化对象,如MyString StringObjB= StringObjA;这样写编译器会默认去调用类的拷贝构造函数而不会调用重载后的赋值运算符。

相等比较运算符(==)重载

在C++中,== 是,用于比较两个值是否相等。如果两个值相等,则表达式的结果为真(true),否则为假(false)。

示例:

定义一个名为 MyString 的类,其中包含两个整数成员变量 m_nNumberAm_nNumberB,以及一个指向字符数组的指针 szStr。它重载了 == 运算符,以便在对象之间进行相等性比较。

class MyString {
public:
    int m_nNumberA;
    int m_nNumberB;
    char * szStr = nullptr;
​
    MyString() {};
    MyString(int NumberA, int NumberB,char * szBuf) :m_nNumberA(NumberA), m_nNumberB(NumberB) {
        //深拷贝
        szStr = new char[strlen(szBuf) + 1];
        memset(szStr,0, strlen(szBuf) + 1);
        strcpy(szStr, szBuf);
        
    };
    
    // == 类内重载
    bool operator==(const MyString &obj){
    if (!strcmp(this->szStr, obj.szStr)) {
        if (this->m_nNumberA == obj.m_nNumberA && this->m_nNumberB == obj.m_nNumberB) {
            return true;
        }
    }
    return false;
    }
};

operator== 函数中,首先使用 strcmp 函数比较两个对象的 szStr 指向的字符串是否相等。如果字符串相等,则进一步比较两个对象的整数成员变量 m_nNumberAm_nNumberB 是否也相等。如果字符串和两个整数都相等,则返回 true,否则返回 false

使用:

int main(){
    MyString StringObjA(20,30, szString);
    MyString StringObjB(20,30, szString);
​
    if (StringObjA == StringObjB) {
        std::cout << "SAME" << std::endl;
    }
}

main 函数中,首先创建了两个 MyString 类的对象 StringObjAStringObjB,它们的成员变量都被初始化为相同的值。然后通过 == 运算符将它们进行比较,如果相等则输出 "SAME"。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;

说说你对盒子模型的理解?

一、是什么 当对一个文档进行布局&#xff08;layout&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff08;box&#xff09; 一个盒子由四…

开源推荐榜【MalusAdmin基于 Vue3/TypeScript/NaiveUI 和 NET7 Sqlsugar 开发的后台管理框架】

简介 Malus是海棠的意思&#xff0c;顾名思义&#xff0c;海棠后台管理系统&#xff0c;读音与【马卢斯】相近&#xff0c;也可称作为马卢斯后台管理系统。 基于NET Core | NET7/8 & Sqlsugar | Vue3 | vite4 | TypeScript | NaiveUI 开发的前后端分离式权限管理系统,采用…

2024SCVN南方时尚之夜:童模冰雪之境惊艳亮相

在广州黄埔君澜酒店&#xff0c;璀璨的灯光下&#xff0c;一场主题为“雪山”、“童模”与“时尚”的盛宴于2024年5月1日至5月3日华丽上演。这场名为“2024SCVN南方时尚之夜&绽放冰雪之境”的活动&#xff0c;如同一颗璀璨的明珠&#xff0c;镶嵌在初夏的广州&#xff0c;熠…

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

【电影】【指环王】【中土世界】影碟播放记录

一、写在前面 笔者于5月5日&#xff08;昨天&#xff09;在新加坡淘到了一套《指环王 The Lord of the Rings》DVD光碟&#xff0c;今天却听闻噩耗&#xff0c;Rohan国王Theoden的扮演者&#xff0c;英国演员Bernard Hill去世&#xff08;享年79岁&#xff09;&#xff0c;发文…

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…

Windows环境下VSCode C无法跳转自动补全

前言&#xff1a; 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置&#xff08;MinGW&#xff09;调用第三官方库…

鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案

官方概述 先看官方对事件的描述. 事件&#xff08;Event&#xff09;是一种任务间通信的机制&#xff0c;可用于任务间的同步。 多任务环境下&#xff0c;任务之间往往需要同步操作&#xff0c;一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型…

冯喜运:5.6周一国际黄金实时盘面走势分,原油最新操作

【黄金消息面分析】&#xff1a;周一(5月6日)亚市盘中&#xff0c;黄金市场出现大行情。现货黄金短线加速飙升&#xff0c;金价一度触及2315美元/盎司&#xff0c;较日内低点大幅反弹逾20美元/盎司&#xff0c;目前交投于2310.61美元/盎司附近。COMEX最活跃黄金期货合约北京时间…

集合定义和使用方法

一.集合的长度 集合的长度,可以添加和删除,长度也会跟着去发生改变,数组一旦创建完成他的长度就不会发生改变。 二.集合的定义方式 ArrayList<String> list new ArrayList(); 三.集合能存储的数据类型 集合能够存储引用数据类型,存储基本数据类型需要使用包装类: 四…

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳&#xff0c;今年4月才开门营业&#xff0c;但从开业到今天&#xff0c;刮刮乐总共就来了一回货——开业时发的20本。 那之后&#xff0c;刮刮乐就彻底断供了。原本&#xff0c;陆诗想把刮刮…

文件加密软件排行榜前四名(2024年4大好用的加密软件推荐)

说到文件加密&#xff0c;想必大家都很熟悉&#xff0c;文件加密已经普遍应用&#xff0c;文件加密是一种重要的安全措施&#xff0c;可以确保数据的机密性、完整性和可用性&#xff0c;降低因数据泄露或丢失带来的风险 。 下面小编给大家分享几款常用的加密软件&#xff0c;…

深入C语言:文件操作实现局外影响程序

一、什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&#xff0c;叫做文件名。文件通常是驻留在外部介质(如磁盘等)上的&#xff0c;在使用时才调入内存中来。 文件一般讲两种&#xff1a;程序文件和数据文件&#xff1a; 程序文件&#xff1a;包括源程…

Android Studio实现简单的自定义钟表

项目目录 一、项目概述二、开发环境三、详细设计3.1、尺寸设置3.2、绘制表盘和指针3.3、动态效果 四、运行演示五、总结展望六、源码获取 一、项目概述 在安卓开发中&#xff0c;当系统自带的View已经无法满足项目需求时&#xff0c;就要自定义View。在Android中是没有与钟表有…

Linux PXE高效批量网络装机

系统初始化 systemctl disable --now firewalld.service setenforce 0 vim /etc/selinux/config 安装软件 yum install -y tftp-server xinetd dhcp vsftpd syslinux 复制 vmlinuz initrd.img pxelinux.0 到 /var/lib/tftpboot/ 目录 [rootlocalhost ~]# cd /mnt/…

OWASP 发布开源软件OSS的十大风险,已知漏洞排名第一,首次汇齐了10大类型的攻击案例

尽管软件供应链严重依赖开源软件&#xff0c;但业界缺乏一致的方法来理解和衡量开源软件的风险。 OSS&#xff08;Open Source Sofware&#xff0c;开源软件&#xff09;的风险管理从许可证管理开始&#xff0c;然后发展到CVE&#xff0c;但我们仍然缺乏涵盖安全、法律和运营方…

Java请求第三方接口的一些步骤

一、前言 Java请求第三方接口的一些步骤。 在Java中请求第三方接口通常涉及以下步骤。这些步骤涵盖了从准备请求到处理响应的整个过程。 1. 确定接口详情 接口URL&#xff1a;你要请求的URL。请求方法&#xff1a;如GET、POST、PUT、DELETE等。请求参数&#xff1a;包括URL…

git tag 相关操作

文章目录 前言一、git里面的Tag二、Tag 类型1. 轻量级标签&#xff08;Lightweight Tag&#xff09;2. 注释标签&#xff08;Annotated Tag&#xff09; 其他常用操作git taggit show <tagname>git push origin <tagname>删除tag使用 gitk 查看效果 总结 前言 一般…