运算符重载

运算符重载

类对象不能直接参与运算,需要对运算符进行重载。
运算符预定义的操作只能针对基本数据类型,但是对于自定义类型,若需要类似的运算符操作,此时也可以重新定义这些运算符的功能,使其支持特定类型,完成特定的操作。
在这里插入图片描述

运算符重载函数的格式

返回值 operator 运算符(参数列表)
{
// 函数体
}

成员函数的格式:

给哪个类重载运算符,就把重载函数定义为哪个类的成员函数。

全局函数的格式:

需要在类内声明全局函数为友元函数。

成员函数版的运算符重载一定比全局函数版的运算符重载少一个参数,成员函数本身提供一个类对象。

运算符重载的目的、要求

目的:让自定义的类也能直接参与运算。
要求:
1、不能创造运算符,必须对已有的运算符重载;
2、不能更改运算符本身的功能,比如加法运算符“+”重载后实现乘法运算;
3、运算符重载本质上也是函数重载,但是不支持函数默认值设定;
4、不能改变重载后的运算符优先级和结合性,也不能改变运算符的操作数和语法结构。

算数运算符的重载

// 成员函数版#include <iostream>
using namespace std;class Complex
{int real;int virt;
public:Complex() { }Complex(int real, int virt) : real(real), virt(virt) { }void show(){cout << real << "+" << virt << "i" << endl;}Complex operator+(const Complex &other){Complex temp;temp.real = this->real + other.real;temp.virt = this->virt + other.virt;return temp;}
};int main()
{Complex com1(3,4);Complex com2(5,12);cout << "Com1: ";com1.show();cout << "Com2: ";com2.show();Complex com3 = com1 + com2;cout << "Com3: ";com3.show();return 0;
}
// 全局函数版#include <iostream>
using namespace std;class Complex
{int real;int virt;
public:Complex() { }Complex(int real, int virt) : real(real), virt(virt) { }void show(){cout << real << "+" << virt << "i" << endl;}friend Complex operator+(const Complex &c1, const Complex &c2);
};Complex operator+(const Complex &c1, const Complex &c2)
{Complex temp;temp.real = c1.real + c2.real;temp.virt = c1.virt + c2.virt;return temp;
}int main()
{Complex com1(3,4);Complex com2(5,12);cout << "Com1: ";com1.show();cout << "Com2: ";com2.show();Complex com3 = com1 + com2;cout << "Com3: ";com3.show();return 0;
}

在这里插入图片描述

赋值运算符的重载

#include <iostream>
using namespace std;class Complex
{int real;int virt;
public:Complex() { }Complex(int real, int virt) : real(real), virt(virt) { }void show(){cout << real << "+" << virt << "i" << endl;}Complex operator-=(const Complex &c1){this->real = this->real - c1.real;this->virt = this->virt - c1.virt;return *this;}
};int main()
{Complex com1(3,4);Complex com2(5,12);cout << "Com1: ";com1.show();cout << "Com2: ";com2.show();com2 -= com1;				// 左调右参,com2 调用了混合运算符重载,参数是com1cout << "Com2: ";com2.show();return 0;
}

在这里插入图片描述

如果不手动编写赋值运算符(=)的重载,则赋值运算符重载会被编译器自动添加,见拷贝赋值函数。
当类中出现指针类型的成员变量时,默认的赋值运算符重载函数类名 &operator=(const 类名 &变量),也会产生类似于默认的浅拷贝构造函数的问题。因此也手动编写解决“浅拷贝”问题。

比较运算符的重载

// 成员函数版#include <iostream>
#include <iomanip>
using namespace std;class Complex
{float a;
public:Complex() { }Complex(float a):a(a) { }bool operator>=(Complex &other){return this->a >= other.a;}
};int main()
{Complex num1(15);Complex num2(6);cout << boolalpha << "num1 > num2?" <<  endl << num1.operator >=(num2) << endl;return 0;
}
// 全局函数版#include <iostream>
#include <iomanip>
using namespace std;class Complex
{float a;
public:Complex() { }Complex(float a):a(a) { }friend bool operator>=(Complex &a, Complex &b);		// 友元
};bool operator>=(Complex &l, Complex &r)
{return l.a >= r.a;
}int main()
{Complex num1(15);Complex num2(6);cout << boolalpha << "num1 > num2?" <<  endl << operator >=(num1, num2) << endl;return 0;
}

在这里插入图片描述

() 运算符的重载

强转功能(只有成员函数版)

#include <iostream>
#include <iomanip>
using namespace std;class Complex
{float a;
public:Complex() { }Complex(float a):a(a) { }void show_int();operator int()		// operator 类型(),强转功能重载的固定格式,只有成员函数版的重载函数{return this->a;}
};void Complex::show_int()
{cout << (int)this->a << endl;		// 这里的 (int) 必须带着
}int main()
{Complex num1(15.7);
//    Complex num2(6);cout << "(int)num1.a: ";num1.show_int();return 0;
}

在这里插入图片描述

伪函数(可重载)

#include <iostream>
#include <iomanip>
using namespace std;class Complex
{float a;
public:Complex() { }Complex(float a):a(a) { }void operator()()		// 重载()运算符,调用函数功能的(),实现一个伪函数{cout << 250 << endl;}void operator()(string name){cout << name;}
};int main()
{Complex num1(15.7);
//    Complex num2(6);num1.operator ()("He Yanwei is a ");num1.operator ()();return 0;
}

在这里插入图片描述

自增自减运算符的重载

// 成员函数版的前自增#include <iostream>
#include <iomanip>
using namespace std;class Complex
{int a;
public:Complex() { }Complex(float a):a(a) { }void show();Complex &operator++(){++this->a;return *this;}
};void Complex::show()
{cout  << ++this->a << endl;
}int main()
{Complex num1(15);cout << "++num1.a: ";num1.show();return 0;
}

在这里插入图片描述
在这里插入图片描述

// 全局函数版后自减#include <iostream>
#include <iomanip>
using namespace std;class Complex
{int a;
public:Complex() { }Complex(float a):a(a) { }void show();friend Complex &operator--(Complex &com, int);		// 必须是 int型 的哑元};void Complex::show()
{cout  << (this->a)-- << endl;
}Complex &operator--(Complex &com, int)
{static Complex temp = com;   	// 使用 temp 获取自减前的值com.a--;return temp;  					// 返回自减前的值
}int main()
{Complex num1(17);Complex num2 = num1--;cout << "num1.a: ";num1.show();cout << "num2.a--: ";num2.show();return 0;
}

在这里插入图片描述

插入/提取运算符的重载

<<

// 全局函数实现提取运算符的重载#include <iostream>
using namespace std;class Complex
{int real;int virt;
public:Complex() { }Complex(int real, int virt) : real(real), virt(virt) { }void show(){cout << real << "+" << virt << "i" << endl;}friend ostream &operator<<(ostream &out, Complex &com);
};ostream &operator<<(ostream &out, Complex &com)
{out << com.real << "+" << com.virt << "i" << endl;return out;
}int main()
{Complex num1(17, 4);cout << "num1: ";operator<<(cout, num1);			// 会返回一个 cout 继续输出// cout 是 ostream 类的类对象,不能自定义,但是可以通过引用 传入函数 再返回// cout << a << b;   	// 先输出a,再输出b  	// operator<<(cout, a)<<breturn 0;
}

>>

// 全局函数实现插入运算符的重载#include <iostream>
using namespace std;class Complex
{int real;int virt;
public:Complex() { }Complex(int real, int virt) : real(real), virt(virt) { }void show(){cout << real << "+" << virt << "i" << endl;}friend ostream &operator<<(ostream &out, Complex &com);friend istream &operator>>(istream &in, Complex &com);
};ostream &operator<<(ostream &out, Complex &com)
{out << com.real << "+" << com.virt << "i" << endl;return out;
}
istream &operator>>(istream &in, Complex &com)
{in >> com.real >> com.virt;return in;
}int main()
{Complex num1(17, 4);cout << "num1: ";operator<<(cout, num1);Complex num2;operator>>(cin, num2);cout << "num2: ";operator<<(cout, num2);return 0;
}

在这里插入图片描述

不能重载的运算符

sizeof()
成员访问运算符 .
指针访问运算符 *
域限定符 ::
三目运算符 ? :

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

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

相关文章

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本&#xff0c;是发展之基&#xff0c;也是安国之策。2020 年新冠肺炎疫情的爆发&#xff0c;稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展&#xff0c;互联网…

这个变量要不要用volatile修饰呢?

正文 大家好&#xff0c;又见面了&#xff0c;我是bug菌~ 在嵌入式软件开发过程中&#xff0c;如果对volatile不熟&#xff0c;那可以你应该是个"假嵌入式程序员"&#xff0c;因为一个变量需不需要使用volatile考虑的场景挺多的&#xff0c;如果在某些场景下乱用&…

(附源码)基于NET学生信息管理系统-计算机毕设 24077

基于NET学生信息管理系统 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用C#技术建…

【vue ui 一直卡在 Starting GUI..】

vue ui 解决问题 1.如果项目一直卡在 Starting GUI..2.解决方法 (切换数据源)3.成功解决 1.如果项目一直卡在 Starting GUI… 2.解决方法 (切换数据源) 直接在cmd中输入如下 npm config set registry http://registry.npm.taobao.org/3.成功解决

璞华大数据产品入选中国信通院“铸基计划”

武汉璞华大数据技术有限公司HawkEye设备数字化管理平台产品&#xff0c;凭借优秀的产品技术能力&#xff0c;通过评估后&#xff0c;入选中国信通院“铸基计划”《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》的工业数字化领域。 “铸基计划”是中国信通院…

MS1242/MS1243:24bit 高精度、低功耗模数转换器

产品简述 MS1242/MS1243 是一款高精度、宽动态范围、 ∆-Σ 模数转 换芯片&#xff0c;其工作电压为 2.7V 至 5.25V &#xff0c;可以达到 24bit 无失码转 换&#xff0c;有效精度可达 21bit 。 MS1242/MS1243 可以广泛使用在工 业控制、称重、液体 / 气体化学分析、血液分…

IMO国际奥林匹克数学竞赛推出AI-MO,奖金高达1000万美元; SDXL Turbo: 新一代文本到图像模型

&#x1f989; AI新闻 &#x1f680; IMO国际奥林匹克数学竞赛推出AI-MO&#xff0c;奖金高达1000万美元 摘要&#xff1a;IMO国际奥林匹克数学竞赛推出新的AI竞赛AI-MO&#xff0c;旨在推动大语言模型的数学推理能力&#xff0c;鼓励开发能与人类数学天才相媲美的AI模型。比…

Ubuntu Linux玩童年小霸王插卡游戏

1.下载安装模拟器 在Windows平台模拟器非常多&#xff0c;而且效果也很优秀&#xff0c;Linux平台的用户常常很羡慕&#xff0c;却因为系统的缘故&#xff0c;无法使用这样的模拟器&#xff0c;但是随着时代的发展&#xff0c;Linux平台也出现了许多优秀的模拟器&#xff0c;现…

webGL开发虚拟实验室

开发虚拟实验室是一个具有挑战性但也非常有趣和有价值的任务。通过 WebGL&#xff0c;你可以创建交互式、沉浸式的虚拟实验室&#xff0c;使用户能够进行实验和学习。以下是一些步骤和关键考虑因素&#xff0c;帮助你开始开发虚拟实验室&#xff0c;希望对大家有所帮助。北京木…

android viewpager 禁止滑动

android viewpager 禁止滑动 前言一、viewpager 禁止滑动是什么&#xff0c;有现成方法吗&#xff1f;二、使用setOnTouchListener三、使用自定义viewpager总结 前言 本文介绍了本人有一个相关的需求需要实现这一功能&#xff0c;在过程中发现自己之前没做过&#xff0c;然后记…

OpenCV | 傅里叶变换——低通滤波器与高通滤波器

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 傅里叶变换 傅里叶变换的作用 高频&#xff1a;变化剧烈…

【古月居《ros入门21讲》学习笔记】13_服务数据的定义与使用

目录 说明&#xff1a; 1. 服务模型 2. 实现过程&#xff08;C&#xff09; 自定义服务数据 Person.srv文件内容 Person.srv文件内容说明 编译配置 在package.xml文件中添加功能包依赖 在CMakeLists.txt中添加编译选项 编译生成语言相关文件 创建服务器代码&#xf…