一、学习复数类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;
}