运算符重载的目的是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型。

一、加号运算符重载

作用:实现两个自定义数据类型的加法运算

1.1 通过成员函数重载+号

例:
class Person{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;
};

调用方法:

  1. 本质调用:Person p3 = p1.operator+(p2);
  2. 简化调用:Person p3 = p1 + p2;

1.2 通过全局函数重载+号

Person operator+(Person &p1, Person &p2){Person temp;temp.m_A = p1.m_A + p2.m_A;temp.m_B = p1.m_B + p2.m_B;return temp;
}
Person operator+(Person &p1, int num){Person temp;temp.m_A = p1.m_A + num;temp.m_B = p1.m_B + num;return temp;
}

调用方法:

  1. 本质调用:Person p3 = operator+(p1, p2);
  2. 简化调用:Person p3 = p1 + p2;

运算符重载也可以发生函数重载:

Person p3 = p1 + p2;
Person p4 = p1 + 100;

1.3 注意事项

  • 对于内置的数据类型的表达式的运算符是不可能改变的
  • 不要滥用运算符重载

二、左移运算符重载

通过全局函数重载<<左移运算符

ostream& operator<<(ostream &cout,Person &p){cout << "p.m_A = " << p.m_A << endl;cout << "p.m_B = " << p.m_B << endl;return cout;
}
  • 选中cout,右键转到声明,可以看到cout属于ostream这个类
  • 返回cout是为了实现链式编程,使得可以无限追加<<
  • 不通过成员函数重载是因为,成员函数重载只能实现p.operator<<(cout),即p<<cout,与预期不符。

调用方法:

cout << p << endl;

三、递增运算符重载

class MyInteger{
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;
};

前置++:

  • 返回值是引用,是因为需要实现++(++a),保证自增的都是同一个数据

后置++:

  • 因为后置++要先返回当前值,再递增。因此先把当前值记录下来,递增之后,再返回记录值。
  • 返回值以值传递形式,是因为返回的是局部对象temp,局部对象不能通过引用返回。

四、赋值运算符重载

c++编译器至少给一个类添加四个函数

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数,对属性进行值拷贝
  4. 赋值运算符 operator=对属性进行值拷贝

如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题。

解决方法:利用深拷贝,解决浅拷贝带来的问题

#include<iostream>
using namespace std;class Person{
public:Person(int age){m_Age = new int(age);}~Person(){if(m_Age != NULL){delete m_Age;m_Age = NULL;}}//重载赋值运算符Person& operator=(Person &p){//先判断是否有属性在堆区,如果有,先释放干净,再深拷贝if(m_Age != NULL){delete m_Age;m_Age = NULL;}//进行深拷贝m_Age = new int(*p.m_Age);return *this;}int *m_Age;
};void test01(){Person p1(18);Person p2(20);Person p3(24);p3 = p2 = p1;cout << "p1.m_Age = " << *p1.m_Age << endl;cout << "p2.m_Age = " << *p2.m_Age << endl;cout << "p3.m_Age = " << *p3.m_Age << endl;
}int main(){test01();system("pause");return 0;
}

注意事项:

  • 重载=的逻辑是,如p2=p1,先释放p2内的属性(因为浅拷贝p2和p1内的m_Age指向同一块内存),然后再重新开辟内存空间进行深拷贝。
  • 返回值是Person&,是为了连续赋值操作

五、关系运算符重载

**作用:**重载关系运算符时,可以让两个自定义类型对象进行对比操作。(如==、!=)

//例:重载==运算符
bool operator==(Person &p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}
}

六、函数调用运算符重载

  • 函数调用运算符是()
  • 由于重载后使用方式非常像函数的调用,因此称为仿函数
  • 仿函数没有固定写法,非常灵活
//例:重载()实现自定义打印
class MyPrint{
public:void operator()(string test){cout << test << endl;}
};
---------
//调用方法MyPrint myprint;myprint("hello world");

重载()很像函数调用,比如上面的功能也可以用函数实现

void myPrint(string test){cout << test << endl;
}
---------
myPrint("hello world")

参考:黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
链接:https://www.bilibili.com/video/BV1et411b73Z

【C++笔记】运算符重载相关推荐

  1. 海贼班 胡船长第一次直播笔记 运算符重载 工程开发规范 编程范式 编译链接 谷歌测试框架

    海贼班 胡船长第一次直播笔记 运算符重载 工程开发规范 编程范式 编译&链接 谷歌测试框架 我个人觉得讲到的点都讲得挺清楚的 运算符重载 工程开发规范 # include <iostre ...

  2. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  3. C++学习笔记(九)——运算符重载

    C++学习笔记(九)--运算符重载 C++内部定义的数据类型(int , float, -)的数据操作可以用运算符号来表示,其使用形式是表达式:用户自定义的类型的数据的操作则用函数表示,其使用形式是函 ...

  4. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  5. C++阶段03笔记02【类和对象(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载、继承、多态)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 1.内存分区模型 2.引用 3.函数提高 4.类和对象 4.1.封装 4.1.1.封装的意义 --实例1:设计圆类 --实例2: ...

  6. C++学习笔记 - 阶段三:C++核心编程 - Chapter7:类和对象-C++运算符重载

    阶段三:C++核心编程 Chapter7:类和对象-C++运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 7.1 加号运算符重载 作用:实现两个自定义数 ...

  7. 复习笔记(六)——C++运算符重载(难点)

    运算符重载 运算符重载的概念 运算符重载类似于函数重载. 运算符重载允许把标准运算符(如+.-.*.<等)应用于定制数据类型的对象. 什么情况下需要考虑运算符重载? 需要用运算符操作自定义类的对 ...

  8. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  9. C++学习笔记:(四)运算符重载 类型转换

    目录 6.运算符重载 6.1运算符重载的基本概念 6.2成员函数重载运算符 6.3友元函数重载运算符 6.4成员函数重载运算符和友元函数重载运算符比较 6.5类型转换 6.运算符重载 面向对象程序设计 ...

  10. C++总结笔记(七)—— 运算符重载

    文章目录 一.概念 二.程序示例 1. 加减乘除重载 2. 赋值运算符重载 3. 递增递减运算符重载 4. 关系运算符重载 5. 左移运算符重载 6. 函数调用运算符重载 一.概念 C++中运算符重载 ...

最新文章

  1. MSI文件制作全过程
  2. 机器智能公司一览图 | 36氪
  3. 0421 版本适配和本地化
  4. C++ 中关于optional 使用过程中遇到的问题
  5. Android官方开发文档Training系列课程中文版:后台服务之IntentService的创建
  6. 聚簇索引与非聚簇索引的区别以及SQL Server查询优化技术
  7. Linux下QT创建项目错误处理
  8. 非均匀采样的kalman滤波
  9. java 声明数组_Java中的数组简介
  10. java 2d 图形_Java学习笔记--Swing2D图形
  11. Android黑科技之删除系统App
  12. bcm94352屏蔽第20针脚图_iOS13屏蔽系统更新教程-【转载】
  13. 论文检测_免费论文检测系统
  14. D3D9学习笔记之精灵变换篇
  15. 穿行测试工作底稿 软件行业,CPA审计预习书(第5话)——风险评估工作底稿之了解被审计单位的内部控制、穿行测试和控制测试...
  16. IPinfo上架uTools插件中心
  17. 佩伯尔幻像_幻像类型提高了编译时的安全性
  18. 封建制度与奴隶制度的区别
  19. Rom Redmi Note 4升级到Android11
  20. 【调剂】天津师范大学计算机与信息工程学院2020年硕士研究生调剂

热门文章

  1. 人群与网络:网络与图论
  2. 官网opencv练习题 最简单的多物体分离技术
  3. jenkins简介及docker部署
  4. matlab库函数大全
  5. 腾讯云配置Ubuntu使用SSH登录
  6. 清涟基因--顾大夫工作室相关网站
  7. 使用jdk的xjc命令由schema文件生成相应的实体类
  8. RxJAVA notes
  9. 支付宝集成——如何在回调地址中使用自定义参数
  10. SQL中datetime和timestamp的区别