C++ :运算符重载

运算符重载:

运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型

 

加号运算符重载: 作用:实现两个自定义数据类型相加的运算

1.成员函数实现 + 号运算符重载

 

#include <iostream>
using namespace std;

//加号运算符重载

class Person
{
public:

    //1 成员函数实现 + 号运算符重载
    Person operator+(Person& p)
    {
        Person temp;
        temp.m_A = this->m_A + p.m_A;
        temp.m_B = this->m_B + p.m_B;
        return temp;
    }

    int m_A;
    int m_B;
};

void test01() {
    Person p1;
    p1.m_A = 10;
    p1.m_B = 10;
    Person p2;
    p2.m_A = 10;
    p2.m_B = 10;

    Person p3 = p1 + p2;

    cout <<  "p3.m_A = " << p3.m_A<< endl;
    cout <<  "p3.m_B = " << p3.m_B<< endl;
}

int main() {
    test01();

    system("pause");
    return 0;
}

2.全局函数重载:

class Person
{
public:

    //1 成员函数实现 + 号运算符重载
    /*Person operator+(Person& p)
    {
        Person temp;
        temp.m_A = this->m_A + p.m_A;
        temp.m_B = this->m_B + p.m_B;
        return temp;
    }*/

    int m_A;
    int m_B;
};

//2.全局函数重载+号
Person operator+(Person& p1, const Person& p2)
{
    Person temp;
    temp.m_A = p1.m_A + p2.m_A;
    temp.m_B = p1.m_B + p2.m_B;
    return temp;
}

//3 运算符重载 可以发生函数重载
Person operator+(Person& p1, int num)
{
    Person temp;
    temp.m_A = p1.m_A + num;
    temp.m_B = p1.m_B + num;
    return temp;
}

void test01() {
    Person p1;
    p1.m_A = 10;
    p1.m_B = 10;
    Person p2;
    p2.m_A = 10;
    p2.m_B = 10;


    //成员函数方式
    Person p3 = p2 + p1; //相当于 p2.operaor+(p1)
    Person p3 = p1 + p2;


    //全局函数重载本质调用:
    Person p3 = operator+(p1, p2);
    Person p3 = p1 + p2;

    //

    cout <<  "p3.m_A = " << p3.m_A<< endl;
    cout <<  "p3.m_B = " << p3.m_B<< endl;
}



int main() 
{
    test01();

    system("pause");
    return 0;
}
2.左移运算符重载
作用:可以输出自定义数据类型
#include <iostream>
using namespace std;

//左移运算符重载

class Person
{
    friend ostream& operator<<(ostream& cout, Person& p);

public:
    Person(int a, int b)
    {
        this->m_A = a;
        this->m_B = b;
    }
private:
//成员函数 实现不了  p << cout 不是我们想要的效果
 //void operator<<(Person& p){
 //}
    int m_A;
    int m_B;
};

//全局函数实现左移重载
ostream& operator<<(ostream& cout, Person &p)  //本质 operator<<(cout,p) 简化cout<<p
{
    cout << "m_A = " << p.m_A << " m_B = " << p.m_B;
    return cout;
}


void test01()  
{
    Person p(10,10);
    //p.m_A = 10;
    //p.m_B = 10;

    cout << p<<"hello world"<<endl; //链式编程   输出一个对象就能打印他的属性
} 


int main() 
{
    test01();

    system("pause");
    return 0;
}

总结:重载左移运算符配合友元可以实现输出自定义数据类型

3.递增运算符重载

作用: 通过重载递增运算符,实现自己的整型数据
总结:前置递增返回引用,后置递增返回值
先写一个输出整形数据的:

class MyInteger 
{
    friend ostream& operator<<(ostream& cout, MyInteger myint);
public:
    MyInteger() {
        m_Num = 0;
    }



private:
    int m_Num;
};

//重载左移运算符
ostream& operator<<(ostream& cout, MyInteger myint)
{
    cout << myint.m_Num << endl;    //全局函数想要访问私有属性
    return cout;
}
void test01()
{
    MyInteger myint;
    cout << myint << endl;
    

}


int main() 
{
    test01();

    system("pause");
    return 0;
}

输出结果: 0

 

class MyInteger 
{
    friend ostream& operator<<(ostream& cout, MyInteger myint);
public:
    MyInteger() {
        m_Num = 0;
    }
    //重载前置++运算符 返回引用为了一直对一个数据进行递增操作
   MyInteger& operator++()
    {
       //先++
        m_Num++;
        //再返回
        return *this;
    }
    //重载后置++运算符  
    //int代表占位参数,可以用于区分前置和后置递增
   MyInteger operator++(int)
   {
      //先记录当时结果
       MyInteger temp = *this;
       //后递增
       m_Num++;
       //最后将记录结果做返回
       return temp;
   }

private:
    int m_Num;
};

//重载左移运算符
ostream& operator<<(ostream& cout, MyInteger myint)
{
    cout << myint.m_Num << endl;    //全局函数想要访问私有属性
    return cout;
}
void test01()
{
    MyInteger myint;

    cout << ++myint << endl;
 
}

void test02()
{
    MyInteger myint;
    cout << myint++ << endl;
    cout << myint << endl;
}


int main() 
{
   // test01();
    test02();
    system("pause");
    return 0;
}

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

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

相关文章

恋上数据结构与算法之二叉堆

文章目录 需求分析Top K 问题堆堆的基本接口设计二叉堆(Binary Heap)最大堆添加思路交换位置的优化实现 删除思路流程图解实现 replace批量建堆自上而下的上滤自下而上的下滤效率对比复杂度计算实现 完整代码 最小堆比较器解析Top K 问题问题分析代码实现内部方法分析问题 2 堆…

智慧科研助力科研数据的分析处理

如今&#xff0c;科研领域的发展日新月异&#xff0c;数据量也越来越大。这时&#xff0c;智慧科研可视化技术不仅为科研人员提供了快速高效的数据分析手段&#xff0c;而且为科研工作的推进提供了新的思路和方法。通过可视化手段&#xff0c;我们可以将各种数据、信息、知识以…

可行性研究:2023年废旧金属回收行业前景及市场数据分析

废品收购是再生资源行业的重要业务之一。是指将各种废弃物品分类后按不同种类和性能卖给不同的生产厂商或直接出售给再制造厂家&#xff08;如重新使用报废汽车拆解的零件&#xff09;。废旧金属是指暂时失去使用价值的金属或合金制品&#xff0c;一般的废旧金属都含有有用的金…

unity学习笔记12

一、物理系统 如何让一个球体受到重力的影响&#xff1f; 只要给物体添加刚体组件&#xff08;Rigidbody&#xff09;&#xff0c;就可以使其受到重力影响 1.刚体&#xff08;Rigidbody&#xff09;&#xff1a; 刚体是一个组件&#xff0c;用于使游戏对象受到物理引擎的控制。…

Antd可编辑表格初始数据为空,单元格不能编辑的解决办法

黑科技超简单: 给table表格增加行className rowClassName{() > editable-row} 然后设置可编辑表格的行样式 .editable-row:hover .editable-cell-value-wrap {border: 1px solid #d9d9d9;border-radius: 4px;padding: 4px 11px;}.editable-cell-value-wrap {padding: 5px…

网站使用高防CDN进行防护有哪些优势

随着互联网的快速发展&#xff0c;个人网站、企业网站也越来越多&#xff0c;网站之间的竞争也越来越强。网站间越来越大的竞争压力&#xff0c;也时长会衍生一些不法行为&#xff0c;如以攻击为手段&#xff0c;使对方网站陷入瘫痪。针对网站的攻击&#xff0c;市场也是有推出…

【趣味篇】Scratch之管道马里奥

【作品展示】管道马里奥 操作&#xff1a;点击小绿旗进入游戏主页面&#xff0c;通过鼠标控制马里奥左右移动踩在管道上拿到更多金币。

开启虾皮购物新旅程,快速注册买家号

想要在shopee上畅享丰富的购物体验吗&#xff1f;那就让我们一起迈出第一步&#xff0c;注册一个属于你自己的虾皮买家号吧&#xff01; 1. 访问虾皮平台 首先&#xff0c;打开你的浏览器&#xff0c;输入虾皮平台网址&#xff0c;点击注册或登录按钮。这将引导你进入注册界面…

【虚拟机】Docker基础 【一】

1.1.部署MySQL 首先&#xff0c;我们利用Docker来安装一个MySQL软件&#xff0c;大家可以对比一下之前传统的安装方式&#xff0c;看看哪个效率更高一些。 如果是利用传统方式部署MySQL&#xff0c;大概的步骤有&#xff1a; 搜索并下载MySQL安装包上传至Linux环境编译和配置…

Retrobatch for mac图片批处理软件

Retrobatch是一款功能强大的图片批量操作软件&#xff0c;提供了批量加水印、裁剪、压缩等功能&#xff0c;而且处理速度非常快。 在Retrobatch中&#xff0c;用户可以通过拖动相应动作到工作区形成节点(Nodes)&#xff0c;并将节点连接起来形成一个Workflow&#xff0c;最后运…

chrome vue devTools安装

安装好后如下图所示&#xff1a; 一&#xff1a;下载vue devTools 下载链接https://download.csdn.net/download/weixin_44659458/13192207?spm1001.2101.3001.6661.1&utm_mediumdistribute.pc_relevant_t0.none-task-download-2%7Edefault%7ECTRLIST%7EPaid-1-13192207…

Lesson 08 string类 (中)

C&#xff1a;渴望力量吗&#xff0c;少年&#xff1f; 文章目录 二、string类的介绍与使用2. 使用&#xff08;5&#xff09;string类对象的修改操作 三、拷贝1. 引入2. 浅拷贝3. 深拷贝 总结 二、string类的介绍与使用 2. 使用 &#xff08;5&#xff09;string类对象的修改…

网络通信概述

文章目录 IP地址端口号协议三要素作用 五元组协议分层OSI七层模型TCP/IP 五层模型应用层传输层网络层数据链路层物理层 封装和分用发送方 - 封装中间转发接收方 - 分用 一般认为计算机网络就是利用通信线路和通信设备将地理上分散的、具有独立功能的多个计算机系统按不同的形式…

QT学习_16_制作软件安装包

1、准备软件exe及其运行环境 参考&#xff1a;Qt学习_12_一键生成安装包_江湖上都叫我秋博的博客-CSDN博客 这篇博客记录了&#xff0c;如何用window的脚本&#xff0c;一键生成一个可以免安装的软件压缩包&#xff0c;解压缩后&#xff0c;点击exe文件就可以直接运行。 这一…

基于SSM实现的图书管理系统

一、系统架构 前端&#xff1a;jsp | js | css | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 借阅管理 04. 图书管理 05. 读者管理 06. 类型管理…

宽量程双计数器测量方法

如要测量计数器信号的数字频率或周期&#xff0c;可使用双计数器方法测量宽量程信号。该方法适于待测量信号的范围较广且整个范围都需要较高测量精度的情况。关于使用宽量程测量方法提高测量精度的详细信息&#xff0c;见量化误差章节。也可使用该方法测量比计数器时基频率更高…

阿里云RDS标准版(x86) vs 经济版(ARM)性能对比

概述 阿里云数据库在去年云栖大会上发布了基于阿里倚天芯片&#xff08;ARM架构&#xff09;的RDS实例&#xff0c;后正式命名为经济版。本文通过标准的sysbench测试&#xff0c;来看看相比与标准版&#xff0c;经济版是否更加“经济”&#xff0c;以帮助开发者选择适合自己的…

什么是API? (应用程序编程接口)

我们经常听到 API 这个专业名称。那么什么是 API 呢&#xff1f; 定义 API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软…

信号收尾.

sigaction 信号捕捉 它也是信号捕捉&#xff0c;不仅能处理普通信号还能处理实时信号&#xff0c;但我们不管实时信号 我们发现函数名和形参中结构体名一样都是sigaction&#xff0c;这在c/c中允许吗&#xff1f; 不建议&#xff0c;但是可以 signo你要捕捉几号信号 输入型参…

《一带繁花一路歌》趣味化讲述“一带一路”故事,生动化展现“文明互鉴”美好图景

2023年&#xff0c;总台《艺览天下》推出“一带一路”10期特别节目《一带繁花一路歌》&#xff0c;节目邀请“一带一路”沿线国家驻华大使等重量级嘉宾&#xff0c;在地标推介、故事分享、现场互动等环节里趣味化讲述“一带一路”故事&#xff0c;生动地展现出“文明互鉴”的美…