运算符重载-复数类案例

一、学习复数类CComplex

#include  <iostream>
using namespace std;
/*C++运算符重载:是对象的运算表现的和编译器的内置类型一样
* <template>(typename T)
* T sum(T a,T b)
* {return a+b;//a.operator+(b)
}
*/
class CComplex
{
public:
	CComplex(int r = 0, int i = 0) :mreal(r), mimage(i){}
	//类的成员函数,指导编译器怎么进行对象的加法运算
	CComplex operator +(const CComplex &src)
	{
	/*	CComplex cmp;
		cmp.mreal = this->mreal + src.mreal;
		cmp.mimage = this->mimage + src.mimage;
		return cmp;*/
		//不能返回一个局部变量或局部指针的引用
		return CComplex(this->mreal + src.mreal, this->mimage + src.mimage);//优化
	}

	void show()
	{
		cout << "real:" << mreal << "image:" << mimage << endl;
	}
	CComplex operator++(int)//后置运算符
	{
		return CComplex(mreal++, mimage++);
	}
	CComplex& operator++()//前置运算符
	{
		mreal += 1;
		mimage +=1;
		return *this;
	}
private:
	int mreal;
	int mimage;
	friend CComplex  operator +(const CComplex& lhs, const CComplex& rhs);//声明为友元函数,即可对成员变量进行操作
	friend ostream& operator<<(ostream& out, CComplex& src);
	friend istream& operator>>(istream& in, CComplex& src);
};
CComplex  operator +(const CComplex & lhs, const CComplex& rhs)
{
	return CComplex(lhs.mreal + rhs.mreal, lhs.mimage + rhs.mimage);
}
ostream& operator<<(ostream& out, CComplex& src)//out是cout的别名,重载C++内置输出运算符,使之能够输出对象
{
	out << "mreal:" << src.mreal <<"mimage:" << src.mimage << endl;
	return out;
}
istream& operator>>(istream& in, CComplex& src)//in是cin的别名,重载输入运算符
{
	in >> src.mreal >> src.mimage;
	return in;
}
int main()
{
	CComplex cmp1(10, 10);
	CComplex cmp2(20, 20);
	CComplex cmp3 = cmp1 + cmp2;//cmp1.operator+(cmp2)
	cmp3.show();
	CComplex cmp4 = cmp1 + 12;
	cmp4.show();
	//编译器做对象运算的时候,会优先调用对象的运算符重载函数(对象的成员方法);
	//如果没有成员方法可调用,就在全局作用域找合适的运算符重载函数
	CComplex cmp5 = 30 + cmp1;
	cmp5.show();
	cmp5 = cmp1++;//单目运算符,operator++()不带参数是前置运算符,operator++(int)带参数是后置运算符
	cmp1.show();
	cmp5.show();
	cmp5 = ++cmp1;
	cmp1.show();
	cmp5.show();
	cout << cmp1<< cmp2 << endl;
	cin>> cmp1 >> cmp2;
	cout << cmp1 << cmp2 << endl;
	return 0;
}
posted @ 2021-04-12 21:21  西里小诸葛  阅读(169)  评论(0)    收藏  举报