#ifndef _COMPLEX_ //防卫式声明 ,预防头文件重复声明 ,名字自己写的
#define _COMPLEX_
#include<iostream>
using namespace std;
class complex
{
private :
int re,im;
public :
//1.注:1与2不可同时存在,因为在声明变量不输入参数时,对于选择调用哪个函数系统会产生混乱,其中方法2包括方法1
/* //方式1:在无参时调用该方法
complex()
:re(0),im(0)
{ }
*/
//方式2:
complex(int r = 0,int i =0) //传递方式可以为value/引用
: re(r),im(i) //构造函数内独特的赋值方式
{ }
int real() const {return re;} //const表示函数不会改变数据
int imag() const {return im;}
//
inline complex& operator +=(const complex& x);
//
friend inline complex& _doapl(complex*,const complex&);//取得实部与虚部
};
//成员函数:修改+=
//complex&// 返回类型 ( 左面存在可以传引用)
//imag real 不带class 代表全域
inline int
imag (const complex &x)
{
return x.imag();
}
inline int
real(const complex &x)
{
return x.real();
}
//思考:返回类型为什么选择引用
inline complex&
_doapl(compl x* ths,const complex& r)
{
ths->re+=imag(r);
ths->im+=real(r);
return *ths;
}
// 返回类型可以为void类型,但是在c3+=c2+=c1;情况下c2+=c1会返回一个void类型;
inline complex& complex::operator +=(const complex& r)
{
return _doapl(this,r);//带括号的为临时对象,
}
//非成员函数:
//+函数返回类型不可以为引用,因为它的返回值必定为
//带括号的为临时对象,函数调用完或下一行代码,临时对象就死掉,传递的引用就毫无意义。
//为何重写+=时就可以传递引用呢?
//+=时两个变量相加,将值赋给被加变量,而这个变量函数外的,并不会随着函数调用结束为死亡。
//tip:如果将+函数写到class里称为成员函数,只能应付复 数加复数的情况
inline complex operator + (const complex& x,const complex& y)
{
return complex(real(x)+real(y),imag(x)+imag(y));
}
//重写正负号,复数的求正负的方法
inline complex operator -(complex & x)
{
return complex(-x.real(),-x.imag());
}
inline complex operator +(const complex & x)
{
return x;
}
//输出
inline ostream& operator <<(ostream & os,const complex& x)
{
return os<<'('<<x.real()<<','<<x.imag()<<')'<<endl;
}
#endif
int main()
{
int a=1,b=2;
int p[10];
complex clo(1,3);
cout<<"clo="<<clo;
complex clo_2(10,-11);
cout<<"clo_2="<<clo_2;
complex clo_3;
clo_3=(clo+clo_2);
cout<<"clo_3="<<clo_3;
cout<<"-clo_3="<<-clo_3;
cout<<"+clo_3="<<+(-clo_3);
return 0;
}