文章目录

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

一、概念

C++中运算符重载是为了实现对象之间进行各种运算的特定语法,在某些特定的场合起到重要的作用,新建重载方法需用operator关键字进行修饰。

可以重载运算符包括+、-、*、\、赋值运算符=、左移运算符<<、递增运算符++、递减运算符- -、关系运算符、函数调用运算符()等。

运算符重载需要遵守以下规则:
1 重载时不能违法运算符原来的句法规则。
2 只能重载C++定义的运算符。
3 不能改变运算符原有的优先级。
4 运算符的结合性不能被改变。
5 不能进行重载的运算符:成员运算符(.),(::),条件运算符,sizeof、强制类型转换运算符。
6 运算符的目数(又称“元数”,即运算符所需要的操作数的数目)不能被改变。
7 当重载“()”、“[]、“->”、=时,运算符重载函数必须被声明为类成员。


二、程序示例

1. 加减乘除重载

#include<iostream>
using namespace std;class MyFloat
{//成员函数重载运算符
public://MyFloat operator+(MyFloat& myf)//{//  MyFloat temp;// temp.N1 = this->N1 + myf.N1;// temp.N2 = this->N2 + myf.N2;// return temp;//}MyFloat operator-(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 - myf.N1;temp.N2 = this->N2 - myf.N2;return temp;}MyFloat operator*(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 * myf.N1;temp.N2 = this->N2 * myf.N2;return temp;}MyFloat operator/(MyFloat& myf){MyFloat temp;temp.N1 = this->N1 / myf.N1;temp.N2 = this->N2 / myf.N2;return temp;}public:float N1;float N2;
};//全局函数重载运算符
MyFloat operator+(MyFloat& Myf1, MyFloat& Myf2)
{MyFloat temp;temp.N1 = Myf1.N1 + Myf2.N1;temp.N2 = Myf1.N2 + Myf2.N2;return temp;
}MyFloat operator+(MyFloat& Myf1, int N)
{MyFloat temp;temp.N1 = Myf1.N1 + N;temp.N2 = Myf1.N2 + N;return temp;
}int main()
{MyFloat myf1;myf1.N1 = float(3.6);myf1.N2 = float(3.4);MyFloat myf2;myf2.N1 = float(3.6);myf2.N2 = float(3.4);/*MyFloat myf3 = myf1.operator+(myf2);*///本质写法/*MyFloat myf3 = operator+(myf1, myf2);*/MyFloat myf3 = myf1 + myf2;//简化写法MyFloat myf31 = myf1 + 1;MyFloat myf4 = myf1 - myf2;MyFloat myf5 = myf1 * myf2;MyFloat myf6 = myf1 / myf2;cout << myf3.N1 << " " << myf3.N2 << endl;cout << myf31.N1 << " " << myf31.N2 << endl;cout << myf4.N1 << " " << myf4.N2 << endl;cout << myf5.N1 << " " << myf5.N2 << endl;cout << myf6.N1 << " " << myf6.N2 << endl;
}
7.2 6.8
4.6 4.4
0 0
12.96 11.56
1 1

2. 赋值运算符重载

#include<iostream>
using namespace std;class MyFloat
{public:MyFloat(float n){N = new float(n);}//赋值运算符MyFloat& operator=(MyFloat &myf){//先判断是否有堆区的属性if (N != NULL){delete N;N = NULL;}//深拷贝N = new float(*myf.N);return *this;}//如果不加赋值运算符重载,对象的赋值操作会引发内存重复释放的异常。~MyFloat(){if (N != NULL){delete N;N = NULL;}}float *N;
};int main()
{MyFloat myf1(1.1415);MyFloat myf2(2.1415);MyFloat myf3(3.1415);myf3 = myf2 = myf1;cout << *myf3.N << endl;;cout << *myf2.N << endl;;}

3. 递增递减运算符重载

#include<iostream>
using namespace std;class MyFloat
{friend ostream& operator<<(ostream& cout, MyFloat myf);
public:MyFloat(){N = 3.1415;}//重载前置++运算符,返回类型为引用,是因为如果不加,返回值属于值类型,重载函数运行完后会销毁//运行完后N的值始终只会加一次1,如果再调用重载,N的值不会一直加1MyFloat& operator++(){//先进行++计算N++;return *this;}//重载后置++运算符,int代表占位参数,用于区分前置后置MyFloat& operator++(int){//先记录当时的结果MyFloat temp = *this;//后递增N++;return temp;}//重载前置--运算符MyFloat& operator--(){//先进行--计算N--;return *this;}//重载后置--运算符,int代表占位参数,用于区分前置后置MyFloat& operator--(int){//先记录当时的结果MyFloat temp = *this;//后递减N--;return temp;}private:float N;
};ostream& operator<<(ostream & cout, MyFloat myf)
{cout << myf.N;return cout;
}int main()
{//后置重载MyFloat myf;cout << myf++ << " " << endl;cout << myf << endl;cout << myf-- << " " << endl;cout << myf << endl;MyFloat myf1;cout << ++myf1 << " " << endl;cout << ++(++myf1) << " " << endl;//又调用一次++相当于先调用了一次拷贝构造函数,然后再调用重载,拷贝构造函数会重新创建一个拷贝的值的内存,再运行完后销毁。//如果重载返回值类型不加&,会直接销毁++myf1的拷贝值,加&,会创建一个指针常量,一直指向内存中的N,返回值也会一直是类中的N,而不是拷贝的N的值。cout << myf1 << endl;cout << --myf1 << " " << endl;cout << myf1 << endl;
}
3.1415
4.1415
4.1415
3.1415
4.1415
4.1415
3.1415
3.1415

4. 关系运算符重载

#include<iostream>
using namespace std;class MyFloat
{public:MyFloat(float n){N = n;}//等于运算符bool operator==(MyFloat& myf){if (this->N == myf.N){return true;}else{return false;}  }//大于运算符bool operator>(MyFloat& myf){if (this->N > myf.N){return true;}else{return false;}}float N;
};int main()
{MyFloat myf1(1.1415);MyFloat myf2(1.1415);MyFloat myf3(3.1415);if (myf1 == myf2){cout << "myf1与myf2相等" << endl;}if (myf3 > myf2){cout << "myf3大于myf2" << endl;}
}
myf1与myf2相等
myf3大于myf2

5. 左移运算符重载

#include<iostream>
using namespace std;class MyFloat
{friend ostream& operator<<(ostream& cout, MyFloat myf);
public:MyFloat(){N = 3.1415*N1;}private:float N;float N1 = float(2);
};//重载左移运算符,只能利用全局函数重载。成员函数重载时会发生cout在右侧。
//ostream类只能用引用的方式声明对象。
ostream& operator<<(ostream & cout, MyFloat myf)
{cout << myf.N;return cout;
}int main()
{MyFloat myf;cout << myf << endl;}
6.283

6. 函数调用运算符重载

#include<iostream>
using namespace std;class MyFloat
{public:MyFloat(float n){N = n;}//函数调用运算符float operator()(float n1,float n2){return n1 + n2;}float N;
};int main()
{MyFloat myf(0);float c = myf(float(1.1415), float(1.1415));//与函数调用相似,又称为仿函数cout << c << endl;cout << MyFloat(0)(float(1.1415), float(1.1415)) << endl;//匿名对象}

C++总结笔记(七)—— 运算符重载相关推荐

  1. (C++学习笔记七)运算符重载

    九.运算符重载 1.Code : #include<iostream> using namespace std;//运算符重载的意义: //对已有的 运算符 重新进行定义,赋予其另一项功能 ...

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

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

  3. 【C++笔记】运算符重载

    运算符重载的目的是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型. 一.加号运算符重载 作用:实现两个自定义数据类型的加法运算 1.1 通过成员函数重载+号 例: class Pers ...

  4. 北大郭炜《程序设计与算法(三)》Mooc笔记:运算符重载和继承

    文章目录 运算符重载 运算符重载的基本概念 赋值运算符的重载 为什么引入赋值运算符重载? 浅拷贝和深拷贝 对operator=返回值的讨论 复制构造函数的相同困境 运算符重载为友元函数 实例:可变长数 ...

  5. c++学习笔记之运算符重载

    1.重载运算符 void operator+(....)        //重载"+"运算符 (1)如果是成员函数形式,那么必须是非static (2)使用运算符必须重载,除了&q ...

  6. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

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

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

  8. 笔记②:牛客校招冲刺集训营---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 友元 友 ...

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

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

最新文章

  1. 递归遍历所有文件夹名称
  2. C++primer 10.2.1节练习
  3. Anywhere 随启随用的静态文件服务器
  4. 2016\Province_C_C++_C\1 报纸页数
  5. SAP Cloud for Customer Sales Lead明细页面视图的UI模型
  6. 牛客16426 玩具谜题
  7. python求圆柱体的体积_漫谈超球体的体积公式
  8. centos6中office及中文输入法安装 (转载)
  9. java 自定义异常实例分析_Java自定义异常类的实例详解
  10. secure CRT连接华三、华为模拟器
  11. 各尺寸学术会议海报模板[转]
  12. 2021《考研数学接力题典1800》勘误表(附学霸高分笔记)
  13. Sublime text3安装Emmet插件及PyV8
  14. 日常消费软件记账项目
  15. python数据分析房价预测_Kaggle入门级赛题:房价预测——数据分析篇
  16. 《幸福的勇气》笔记四——自立就是摆脱“自我”
  17. pc端常用电脑屏幕 媒体查询尺寸
  18. 【MVC、Spring MVC介绍、区别、执行流程】
  19. HALCON数组的删除 三
  20. 联发科技嵌入式_联发科技2018校园招聘

热门文章

  1. 关于企业管理信息系统
  2. JAVA中的日志框架-log4j的使用
  3. QQ,MSN,SKYPE等在线状态代码
  4. JS性能优化之文档碎片-document.createDocumentFragment
  5. TCP/IP(二):IP协议
  6. 第五周-第07章节-Python3.5-内置模块详解之OS模块
  7. filebeat 乱码
  8. CSS3:CSS3 文本效果
  9. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
  10. 关于window对象