首页 > 编程语言 >20C++的运算符重载

20C++的运算符重载

时间:2024-01-20 23:36:59浏览次数:26  
标签:mreal ++ CComplex C++ 运算符 int mimage operator 20

C++的运算符重载

编译器在做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法)。如果找不到合适的成员方法,则在全局作用域寻找合适的运算符重载函数.

#include<iostream>
using namespace std;
//复数类
class CComplex
{
private:
	int mreal;
	int mimage;
	//友元函数是为了访问private成员变量,不属于成员函数
	friend CComplex operator+(const CComplex& lhs, const CComplex& rhs);
public:
	CComplex(int real = 0, int image = 0):mreal(real), mimage(image)
	{
		cout << "construct" << endl;
	}
	~CComplex(){}
	CComplex(const CComplex& comp)
	{
		cout << "copy" << endl;
		mreal = comp.mreal, mimage = comp.mimage; 
	}
	CComplex operator+(const CComplex& comp)
	{
		return CComplex(this->mreal + comp.mreal, this->mimage + comp.mimage);
	}
	void show()
	{
		cout << "real" << mreal << "image" << mimage << endl;
	}
};

CComplex operator+(const CComplex& lhs, const CComplex& rhs)
{
	return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}

int main()
{
	CComplex comp1(10, 10);
	CComplex comp2(20, 20);
	//调用comp1.operator+(comp2) 即加法运算符的重载函数,然后在comp3初始化的基础上赋值,而非拷贝构造
	CComplex comp3 = comp1 + comp2; 
	comp3.show();
	//下一行的逻辑是:comp3后跟+,意味着调用CComplex operator+,然后可以注意到,这一行发生了两次构造,其中20->CComplex(20),即强制类型转换,最后执行operator+
	CComplex comp4 = comp3 + 20; 
	comp4.show();
	//下一行20不会调用CComplex operator+,转而寻找全局作用域下的运算符重载函数,但没有合适的,于是定义了全局的友元运算符重载函数CComplex operator+
	CComplex comp5 = 20 + comp3;
	comp5.show();
	return 0;
}

单目运算符的重载

  • operator++()代表前置++
  • 其重载形式operator++(int)代表后置++
  • 为了统一所有类型对象的输出,可以采用在其类中重载输入输出运算符的形式
#include<iostream>
using namespace std;
//复数类
class CComplex
{
private:
	int mreal;
	int mimage;
	//友元函数是为了访问private成员变量,不属于成员函数
	friend CComplex operator+(const CComplex& lhs, const CComplex& rhs);
	friend ostream& operator<<(ostream& out, const CComplex& src);
	friend istream& operator>>(istream& in, CComplex& src);
public:
	CComplex(int real = 0, int image = 0):mreal(real), mimage(image)
	{
		cout << "construct" << endl;
	}
	~CComplex(){}
	CComplex(const CComplex& comp)
	{
		cout << "copy" << endl;
		mreal = comp.mreal, mimage = comp.mimage; 
	}
	CComplex operator+(const CComplex& comp)
	{
		return CComplex(this->mreal + comp.mreal, this->mimage + comp.mimage);
	}
	CComplex operator++()
	{
		//++this->mimage, ++this->mreal;
		//return *this;
		return CComplex(++mreal, ++mimage);
	}
	CComplex operator++(int)
	{
		/*CComplex comp = *this;
		++this->mimage, ++this->mreal;
		return comp;*/
		return CComplex(mreal++, mimage++);
	}
	void operator+=(const CComplex& comp)
	{
		mreal += comp.mreal;
		mimage += comp.mimage;
	}
	void show()
	{
		cout << "real" << mreal << "image" << mimage << endl;
	}
};

CComplex operator+(const CComplex& lhs, const CComplex& rhs)
{
	return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}
ostream& operator<<(ostream &out, const CComplex& src)//提供输出符号的重载形式
{
	out << "real:" << src.mreal << "image:" << src.mimage;
	return out;
}
istream& operator>>(istream& in, CComplex& src)//提供输入符号的重载形式
{
	in >> src.mreal >> src.mimage;
	return in;
}

int main()
{
	CComplex comp1(10, 10);
	CComplex comp2 = comp1++;
	CComplex comp3 = ++comp1;
	comp1.show();
	comp2.show();
	comp3.show();
	comp1 += comp1;
	comp1.show();
	cout << comp1 << endl;
	cin >> comp1 >> comp2;
	cout << comp1 << endl << comp2 << endl;
	return 0;
}

标签:mreal,++,CComplex,C++,运算符,int,mimage,operator,20
From: https://www.cnblogs.com/sio2zyh/p/17977356

相关文章

  • 风标设计2024中的主副区计算
    风标设计2024中提供了主副区结构的自动化评估功能,通过本文,对这部分功能的使用方法进行介绍。一、背景知识主副区结构是飞行程序设计中的一个基础概念,它的形式受导航设备、导航规范以及飞行阶段的影响。具备航迹引导的直线段的飞行程序保护区,通常会是类似下图中的结构。......
  • 代码随想录算法训练营第 十 一 天| 20. 有效的括号 1047. 删除字符串中的所有相邻重
    LeetCode 20.有效的括号题目链接:20.有效的括号思路:采用栈数据结构解题;遇到左括号,压右括号入栈 LeetCode 1047.删除字符串中的所有相邻重复项题目链接:1047.删除字符串中的所有相邻重复项注意:Java中队列实现类API的使用 LeetCode 150.逆波兰表达式求值题目链......
  • C++多线程3
    1利用栈特性自动释放锁RAII1.1什么是RAIIRAII(ResourceAcquisitionIsInitialization),使用局部对象管理资源的技术称为资源获取既初始化,它的生命周期由操作系统管理,无需人工干预。为什么要引入自动释放锁,因为我们有时会因为忘记释放锁,而造成死锁或内存泄漏。我们先来手动实......
  • c++函数模板
    一.模板概念:就是建立通用的摸具,大大提高复用性特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的c++提供两种模板机制函数模板和类模板二.函数模板作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表作用:建立一个通用函数......
  • 2020年终总结(技术篇),重整心情、扬帆起航
    大二上篇突如其来的疫情打破了以往的平静,哪都不能去只能呆在家里,因此我收获了有史以来最长的一个寒假,在宅在家的这4个月里面,我独立做了一个大项目嘿嘿,还有一个烂大街的后台管理系统,虽然很普通但是确实我一个个敲出来的东西,很有成就感,期间历时一个多月,每天除了和家人的交际,那段时间......
  • 1.20闲话
    推歌:葬歌/洛天依byilem听凭风引(指\(\textbf{K8He}\)),我打算板刷\(\textbf{ABC}\)的\(\text{ABCD}\)题从ABC的333开始刷啦\(\textbf{ABC333}\)\(\text{Problem:A}\)$here$题意输出\(n\)个\(n\)思路按照题意模拟即可代码没有人曾体会#include<bits/st......
  • Ubuntu20.04静态编译Boost记录
    下载Boost源码地址:https://www.boost.org/users/history/version_1_72_0.html指定安装位置./bootstrap.sh--prefix=/usr/local/boost-1-72-0编译release版本的boost库./b2toolset=gcclink=staticruntime-link=staticthreading=multi开始编译sudo./b2install--......
  • Luogu P1563 [NOIP2016 提高组] 玩具谜题
    [NOIP2016提高组]玩具谜题\(link\)题目背景NOIP2016提高组D1T1题目描述小南有一套可爱的玩具小人,它们各有不同的职业。有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:这时singer告诉小南一个谜题:“......
  • 闲话1.20
    系统维护,该内容暂不可见。找lbx帮忙写了个这玩意,很好玩啊......
  • Luogu P1042 [NOIP2003 普及组] 乒乓球
    [NOIP2003普及组]乒乓球\(link\)题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中\(11\)分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图......