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

文章目录

  • 一、概念
  • 二、程序示例
    • 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;//匿名对象}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net 加载xml到menu

XML File <?xml version"1.0" encoding"utf-8" ?> <Area iAreaID "0" cAreaName"城市"><Province iAreaID "1" cAreaName"北京市"/><Province iAreaID "2" cAreaName"上海…

前端lvs访问多台nginx代理服务时出现404错误的处理

前端lvs访问多台nginx代理服务时出现404错误的处理 环境描述&#xff1a;app --> lvs --> nginx --> server app访问页面购买流量页面(nginx服务器)代理到后端和服务器交互(多台server)刚开始访问没有问题&#xff0c;流量变大为了避免出现问题&#xff0c;nginx配置了…

使用numpy出现DeprecationWarning: The normed argument is ignored when density is provided. 解决方法忽略警告的方法

目录 1、从根本上进行解决 2、直接利用warning模块忽略警告 1、从根本上进行解决 “DeprecationWarning: The normed argument is ignored when density is provided. In future passing both will result in an error.” 这种一般是因为函数库或者是一些包package版本更新而…

iptables四个表与五个链间的处理关系

转载自&#xff1a;http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包过滤系统是一种功能强大的工具&#xff0c;可用于添加、编辑和除去规则&#xff0c;这些规则是在做信息包过滤决定时&#xff0c;防火墙所遵循和组成的规则。 这些规则存储在专…

C++总结笔记(八)—— 菱形继承

文章目录一、基本概念二、程序举例1. 虚继承2. 内在逻辑一、基本概念 菱形继承是指存在两个子类继承自同一个基类&#xff0c;同时有子类继承这两个子类。 二、程序举例 1. 虚继承 使用虚继承可以解决菱形继承资源浪费的问题&#xff0c;因为有两个子类继承基类&#xff0c…

Linux命令:mkdir

全称&#xff1a;make directories 用途&#xff1a;创建新目录 格式&#xff1a;mkdir [OPTION]... DIRECTORY... 类型&#xff1a;mkdir is hashed (/bin/mkdir) 说明&#xff1a; 创建文件目录&#xff0c;较常用的选项参数有两个&#xff1a; -m, --modeMODE&#xff1a;直…

InnoDB引擎与MyIASM的一点总结

InnoDB引擎&#xff1a; 提供了对数据库ACID事务的支持&#xff0c;并且实现了SQL标准的四种隔离级别 提供了行级锁和外键约束。 它的设计的目标是处理大容量数据库系统&#xff0c;用于缓冲数据和索引。 不支持FULLTEXT类型的数据&#xff0c;没有保存表的行数&#xff0c;当s…

C++总结笔记(九)—— 多态

文章目录一、多态是什么&#xff1f;二、使用步骤2.1. 静态多态2.1.1 函数重载2.1.2 模板2.2.动态多态2.2.1 示例2.2.2 原理分析总结一、多态是什么&#xff1f; 多态是面向对象的语言中都必须掌握的特性&#xff0c;其概念简单讲就是对同一种特性的方法有不同的实现功能&…

[转]c++类的构造函数详解

c构造函数的知识在各种c教材上已有介绍&#xff0c;不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法&#xff0c;故在此我根据自己的c编程经验总结了一下c中各种构造函数的特点&#xff0c;并附上例子&#xff0c;希望对初学者有所帮助。 c类的构造函数详解 …

结构体对齐问题

#pragma (1)typedef struct {};#pragma ()#pragma pack(1) 的意义是什么skypxl | 浏览 27771 次发布于2009-10-01 16:38最佳答案设置结构体的边界对齐为1个字节&#xff0c;也就是所有数据在内存中是连续存储的。比如你在C语言中定义下面这样的结构体&#xff1a;struct s {cha…

【机器学习】——纯Python建立BP模型

参考:https://blog.csdn.net/michael_f2008/article/details/103715699 https://developer.aliyun.com/article/614411 import pandas as pd import numpy as np import datetime from sklearn.utils import shuffle# 1.初始化参数 def initialize_parameters(n_x, n_h, n_y…

组件局域网中的无集线器、Windows XP、Windows 7、Windows 8的对等网

为什么要用对等网&#xff1f; 答&#xff1a;对等网采用分散管理的方式&#xff0c;网络中的每台计算机既作为客户机又可作为服务器来工作&#xff0c;每个用户都管理自己机器上的资源。 组建局域网中无集线器的对等网 组建局域网中Windows XP的对等网 组建局域网中Windows 7的…

datatable绑定comboBox显示数据[C#]

实现功能&#xff1a;datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法&#xff1a;    //dataSet 转 dataTable    1、生成datatable&#xff0c;并为combox绑定数据源&#xff1a;comboBox1.DataSource dt1;comboBox1.DisplayMember "用户编码"…

C++总结笔记(十)——堆区内存开辟数组和二级指针

文章目录一、堆区开辟数组1. 数组指针与指针数组的区别2. 1维数组3. 2维数组二、二级指针一、堆区开辟数组 1. 数组指针与指针数组的区别 数组指针是指指向数组的指针&#xff0c;它的本体是一个指针, 声明指针变量的时候一般用括号&#xff0c;因为括号的优先级高于[]&#…

阿里巴巴将赴NIPS 2017 3大事业部联袂展示AI全技能

被誉为国际顶级的机器学习和神经网络学术会议NIPS 2017将于12月4日-9日在美国加州长滩市举行。在本届会议上&#xff0c;阿里巴巴除有两篇论文入选Workshop并进行Oral和Poster形式报告外&#xff0c;3大技术事业部将连续3天&#xff08;5日-7日&#xff09;在阿里展区举行多场技…

【图像处理】——Python实现图像特征提取BP神经网络实现图像二分类

目录 一、图像特征提取 二、BP实现图像二分类 1、输入层、隐层、输出层结点个数设置

mysql sql语句大全

1、新建用户&#xff1a;>CREATE USER name IDENTIFIED BY ssapdrow; 2、更改密码&#xff1a; >SET PASSWORD FOR namePASSWORD(fdddfd); 3、权限管理 >SHOW GRANTS FOR name; //查看name用户权限 >GRANT SELECT ON db_name.* TO name;    //给name用户db_…

C++总结笔记(十一)—— Lambda表达式的应用

文章目录一、Lambda表达式是什么&#xff1f;二、程序示例1. 在STL中的使用一、Lambda表达式是什么&#xff1f; Lambda表达式时C11引入的语法&#xff0c;本质上是一个匿名函数&#xff0c;用[ ] () {}三个符号组成表达式。 格式为&#xff1a;[capture list] (params list) …

【文件处理】——字典写入json文件或TXT文件,读取文件中的字典TypeError: Object of type ‘ndarray‘ is not JSON serializable错误解决方法

目录 一、将字典写入json文件 二、json文件中读取字典 三、将字典写入TXT文件中 四、从TXT中读取字典 五、解决字典含数组存入json文件失败的方法 1、存入前将数组变成列表 2、扩展类方法 一、将字典写入json文件 import jsontest_dict {version: "1.0",exp…

js一些实用例子

1.获取焦点选中文本内容 $("#id").focus(function(){ this.select(); }); 2.表单提交方式 A.自动提交 setTimeout(function(){表单对象.submit();},2000); B.onclick事件提交(链接提交) <input type"submit" value"提交" οnclick"retur…