C++运算符重载的学习笔记

加号运算符重载

  • 两种方式
  1. 成员函数重载加号
#include  <iostream>  
using namespace std;  
//加号运算符重载  
 
class Person  
{  
public:  
//    1.成员函数重载加号  
   Person operator+(Person&p)  
   {  
       Person tmp;  
       tmp.m_A = this->m_A + p.m_A;  
       tmp.m_B = this->m_B + p.m_B;  
       return tmp;  
   }  
public:  
   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.operator+(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;  
}
  1. 全局函数重载加号
#include  <iostream>  
using namespace std;  
//加号运算符重载  
  
class Person  
{  
public:  
    int m_A;  
    int m_B;  
};  
  
//2.全局函数重载  
Person operator+(Person&p1, Person& p2)  
{  
    Person tmp;  
    tmp.m_A = p1.m_A + p2.m_B;  
    tmp.m_B = p1.m_B + p2.m_B;  
    return tmp;  
}  

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

  
  
    //全局函数重载的本质调用  
    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;  
}

3.在运算符重载中也可以发生函数重载

#include  <iostream>  
using namespace std;  
//加号运算符重载  
  
class Person  
{  
public:  
    int m_A;  
    int m_B;  
};  
  
//函数重载的版本  
Person operator+(Person& p1, int a)  
{  
    Person tmp;  
    tmp.m_A = p1.m_A + a;  
    tmp.m_B = p1.m_B + a;  
    return tmp;  
}  
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;  
  
    //运算符重载,也可以发生函数重载  
    Person p4 = p1 + 100; 
  
    cout << "p4.m_A = " << p4.m_A << endl;  
    cout << "p4.m_B = " << p4.m_B << endl;  
}  
  
  
int main()  
{  
    test01();  
    system("pause");  
    return 0;  
}
  • 由于编译器不知道我们的自定义类型是如何进行相加的,所以我们必须要创建一个全局的或者构造的函数来重载这个加号,以实现我们的目的

左移运算符重载

#include <iostream>
using namespace std;
class Person
{
    friend ostream& operator <<(ostream& cout, Person& p);
public:
    Person(int a, int b)
    {
        m_A = a;
        m_B = b;
    }
private:
    int m_A;
    int m_B;
};
ostream & operator <<(ostream& cout, Person& p)
{
    cout << p.m_A << "  " << p.m_B << endl;
    return cout;
}
void test01()
{
    Person p(10, 10);
//    p.m_A = 10;
//    p.m_B = 10;
//    cout << p.m_A << "  " <<p.m_B << endl;
    cout << p << "  GUET" << endl;
}
int main()
{
    test01();
    return 0;
}

  • 因为要保持cout << 这样的格式,所以在左移运算符重载中我们只用全局函数来进行重载
  • 由于我们要保留链式的特性,那么重载函数的返回值必须是对ostream&这种类型,保证返回的是同一个“东西“,才能在原来的基础上继续输出
  • 由于类中的成员变量为私有,我们必须在类中声明一下重载函数为友元

赋值运算符重载

#include <iostream>
using namespace std;
class MyInt
{
    friend ostream& operator<<(ostream& cout, MyInt myInt);
public:
    MyInt()
    {
        m_Num = 0;
    }
    MyInt& operator--()
    {
        //先--
        m_Num--;
        //再返回
        return *this;
    }
    MyInt operator--(int)
    {
        MyInt tmp = *this;
        m_Num--;
        return tmp;
    }
private:
    int m_Num;
};
//写后置的时候会报错
ostream& operator<<(ostream& cout, MyInt myInt)//这里的MyInt我用了引用会怎么样?
{
    cout << myInt.m_Num << endl;
}
void test01()
{
    MyInt myint;
    cout << --(--myint) << endl;
}
void test02()
{
    MyInt myint;
    cout << myint-- << endl;
    cout << myint << endl;
}

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

  • 在赋值运算符的重载中要注意前置和后置的区别。
    MyInt& operator--()
    {
        //先--
        m_Num--;
        //再返回
        return *this;
    }
    MyInt operator--(int)
    {
        MyInt tmp = *this;
        m_Num--;
        return tmp;
    }
  1. 返回值类型不一样,一个是返回同一个东西,另一个则是返回–之前的值
  2. 由于函数的重载不能仅靠返回值不同来区分,所以有一个函数的形参部分有个int类型来区分两个函数

原因
因为我们进行前置–,要对类创建的对象的成员变量进行修改,所以我们直接修改它本身然后返回它本身。而后置,我们不能先return否则函数提前结束,所以只能用一个临时变量来存储它被修改之前的值,然后对它本身进行修改再返回那个临时值。
同时,由于临时变量在函数结束时会销毁,那么再用引用会导致非法访问


关系运算符重载

#include <iostream>
using namespace std;
class Person
{
public:
    Person(string name, int age)
    {
        m_Name = name;
        m_Age = age;
    }

    bool operator==(Person& p)
    {
        if (m_Name == p.m_Name && m_Age == p.m_Age)
        {
            return true;
        }
        return false;
    }

    bool operator!=(Person& p)
    {
        if (m_Name == p.m_Name && m_Age == p.m_Age)
        {
            return false;
        }
        return true;
    }


    string m_Name;
    int m_Age;
    //重载 == 号
};
void test01()
{
    Person p1("Tom", 19);

    Person p2("Tom", 18);

    if (p1 == p2)
    {
        cout << "p1 和 p2 是相等的" << endl;
    }
    else
    {
        cout << "p1 和 p2 不相等" << endl;
    }
}
int main()
{
    test01();
    return 0;
}


函数调用运算符重载

#include <iostream>
using namespace std;
//函数调用运算符重载

//打印输出类
class MyPrint
{
public:
    void operator() (string text)
    {
        cout << text << endl;
    }
};
//相加类
class MyAdd
{
public:
    int operator() (int a, int b)
    {
        return a + b;
    }
};
void test01()
{
    MyPrint p;
    p("hello GUET");
}
void test02()
{
    MyAdd add;
    cout << add(100, 200) << endl;
    //匿名函数对象
    cout << MyAdd()(200, 500) << endl;
}
int main()
{
    //test01();
    test02();
    return 0;
}

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

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

相关文章

白帽子讲Web安全资源下载

资源简介 本仓库提供《白帽子讲Web安全》一书的资源下载。这本书由阿里巴巴安全专家刺总编写&#xff0c;是网络安全领域的经典之作&#xff0c;对于从事网络安全工作的专业人士来说是必备的参考资料。 资源描述 书名: 白帽子讲Web安全作者: 阿里巴巴刺总适用人群: 网络安全…

深度学习架构Seq2Seq-添加并理解注意力机制(一)

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…

基于springboot的丢失儿童的基因比对系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本丢失儿童的基因比对系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java进行编写&#xff0c;使用了Spring Boot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户主要功能包括&#xff1a;用户注册、登…

Mysql面试篇笔记:

优化&#xff1a; 1.如何定位慢查询&#xff1a; 首先压测接口&#xff0c;查看那个接口比较慢&#xff0c;可以通过多种工具&#xff0c;比如Skywaking 可以查看各个接口响应时间&#xff0c;查看接口最慢&#xff0c;然后去跟踪接口&#xff0c;查看详细信息&#…

嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)

Ultra-small size gaming console。 超小尺寸游戏机-Pico This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the fo…

计算机网络-实验四子网划分

三、实验内容及步骤 1.要求 【题目】某单位申请了⼀个 C 类⽹络&#xff0c;单位内部有3个部门&#xff0c;各部门约50台主机&#xff0c;需要划分为3个⼦⽹&#xff0c;各部门接⼊到汇聚交换机&#xff0c;在汇聚层进⾏路由连通。假定申请到的C类网络为200.200.200.0。 2.实…

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

SQL Server2022版+SSMS安装教程(保姆级)

SQL Server2022版SSMS安装教程&#xff08;保姆级&#xff09; 一&#xff0c;安装SQL Server数据库 1.下载安装包 &#xff08;1&#xff09;百度网盘下载安装包 链接&#xff1a;https://pan.baidu.com/s/1A-WRVES4EGv8EVArGNF2QQpwd6uvs 提取码&#xff1a;6uvs &#…

Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具

地址:https://github.com/MartinxMax/pany 关于Pany-v2 Pany-v2 是一款 LFI&#xff08;本地文件包含&#xff09;漏洞探测工具&#xff0c;具备自动识别敏感文件的能力。它能够利用 LFI 漏洞检测并提取 id_rsa 私钥、系统密码文件以及其他可能导致安全风险的敏感信息。该工具…

【音视频】视频基本概念

一、视频的基本概念 1.1 视频码率&#xff08;kb/s&#xff09; 视频码率是指视频文件在单位时间内使用的数据流量&#xff0c;也叫码流率。码率越大&#xff0c;说明单位时间内取样率越大&#xff0c;数据流进度也就越高 1.2 视频帧率&#xff08;fps&#xff09; 视频帧率…

三维数据可视化与表面重建:Marching Cubes算法的原理与应用

1. 引言 随着现代医学影像技术的飞速发展&#xff0c;三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中&#xff0c;Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…

探秘基带算法:从原理到5G时代的通信变革【七】FFT/DFT

文章目录 2.6 FFT/DFT2.6.1 离散傅里叶变换&#xff08;DFT&#xff09;2.6.2 快速傅里叶变换&#xff08;FFT&#xff09;2.6.3 方法论与分类体系2.6.4 优缺点与应用2.6.5 实现细节 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;v…

水仙花数(华为OD)

题目描述 所谓水仙花数&#xff0c;是指一个n位的正整数&#xff0c;其各位数字的n次方和等于该数本身。 例如153是水仙花数&#xff0c;153是一个3位数&#xff0c;并且153 13 53 33。 输入描述 第一行输入一个整数n&#xff0c;表示一个n位的正整数。n在3到7之间&#x…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

极简Redis速成学习

redis是什么&#xff1f; 是一种以键值对形式存储的数据库&#xff0c;特点是基于内存存储&#xff0c;读写快&#xff0c;性能高&#xff0c;常用于缓存、消息队列等应用情境 redis的五种数据类型是什么&#xff1f; 分别是String、Hash、List、Set和Zset&#xff08;操作命…

ADC采集模块与MCU内置ADC性能对比

2.5V基准电压源&#xff1a; 1. 精度更高&#xff0c;误差更小 ADR03B 具有 0.1% 或更小的初始精度&#xff0c;而 电阻分压方式的误差主要来自电阻的容差&#xff08;通常 1% 或 0.5%&#xff09;。长期稳定性更好&#xff0c;分压电阻容易受到温度、老化的影响&#xff0c;长…

python数据容器切片

从一个序列中取出一个子序列 序列[起始位置:结束位置:步长] 起始位置和结束位置 省略,表示从头取到尾 步长省略表示1 步长负数,表示从后往前取 步长-1 等同于将序列反转了

【网络安全 | 渗透测试】GraphQL精讲一:基础知识

未经许可,不得转载, 文章目录 GraphQL 定义GraphQL 工作原理GraphQL 模式GraphQL 查询GraphQL 变更(Mutations)查询(Queries)和变更(Mutations)的组成部分字段(Fields)参数(Arguments)变量别名(Aliases)片段(Fragments)订阅(Subscriptions)自省(Introspecti…

005-Docker 安装 Redis

Docker 安装 Redis 1.从镜像官网拉取Redis镜像2.创建实例并启动3.测试连接4.设置开机启动 1.从镜像官网拉取Redis镜像 镜像官网地址&#xff1a;https://hub.docker.com执行命令 -- 拉取最新的版本 docker pull redis查看镜像 docker images2.创建实例并启动 先创建好需要的…

【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断

【星云 Orbit- • STM32F4】04. 一触即发&#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源&#xff0c;并在中断回调函数中处理按键事件&#xff0c;实现了按键控制LED状态翻转的功能。本文旨…