complex类头文件
#pragma once
#ifndef _COMPLEX_
#define _COMPLEX_
class complex
{
public:
complex(double r=0,double i=0):re(r),im(i){}
complex& operator+=(const complex&);
double real() const{ return re; };//不需要改变参数加const
double imag() const{ return im; };
private:
double re, im;
friend complex& _doapl(complex*, const complex&);
};
#endif
complex类源文件
#include<iostream>
#include"complex.h"
using namespace std;
inline complex& _doapl(complex* t, const complex& R) //右边加到左边 右边不变加const
{
t->re += R.re;
t->im += R.im;
return *t;//此时应该返回的是t指针指向的内容
}
inline complex& complex::operator+=(const complex& r) //r不需要改变 所以前面加const
{
return _doapl(this, r);
}
inline complex operator+(const complex&x,const complex&y)//返回值是在函数体内新创建的 所以不能传引用
{
return complex(x.real()+y.real(),x.imag()+y.imag());//创建一个临时对象
}
inline complex operator+(const complex& x, double y)//返回值是在函数体内新创建的 所以不能传引用
{
return complex(x.real() + y, x.imag() );//创建一个临时对象
}
inline complex operator+(double x, const complex& y)//返回值是在函数体内新创建的 所以不能传引用
{
return complex(x + y.real(), y.imag());//创建一个临时对象
}
inline ostream& operator<<(ostream& os, const complex& x) //第一个ostream&不是函数体内创建的本来就有 所以可以传引用
{
return os << 'c' << x.real() << ',' << x.imag() << ')';
}
|