参考视频https://www.bilibili.com/video/BV1cb411B7fk?p=6
代码如下:
//
// Created by zlc on 2020/3/28.
//data一定放在private里面。
//参数尽可能使用pass by reference。//
//返回值尽可能使用return by reference。//
//在类的body中的函数,应该加const的要加const。//
//构造函数中的,尽量使用初始化列表initialization list
//
//防卫式声明
#ifndef UNTITLED_COMPLEX_H
#define UNTITLED_COMPLEX_H
class complex;
class complex {
public:
complex(double a=0,double b =0)
:re(a),im(b) //初值列
{ }
//函数在 class body 內定义完成,便自动 成為 inline 候选人
//在类成员函数的声明和定义中//const的函数不能对其数据成员进行修改操作。
//const的对象,不能引用非const的成员函数。
double real() const { return re;} //函数不需要改变里面的值,加const
double imag() const { return im;}
//操作符重载
complex& operator +=(const complex&);
private:
double re,im;
//对外宣称这是个友元,可以取私有的data
friend complex& __doapl(complex*,const complex&);
};
//右边加到左边,右边不会变,所以加个const ,因为左边不是临时变量,可以传引用
//返回值是 complex& 会不会inline 看编译器
inline complex&
complex::operator+=(const complex& r)
{
return __doapl(this,r);
}
//非成员函数,全局函数
//因为左边是会变的,不用const
inline complex&
__doapl(complex* ths,const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths; //这么传引用出去
}
//全局函数,返回complex类型,此处不能传出引用,因为是临时对象
inline complex
operator + (const complex& x, const complex& y)
{
//相当于构造出一个complex
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());
}
//输出复数
//complex c1(9,8);
//cout << c1 << endl;
#include <iostream>
using namespace std;
inline ostream& //返回的就是os 可以传引用
operator <<(ostream& os, const complex& x)
{
return os << '('<<x.real()<<","<<x.imag()<<'i'<<')';
}
#endif //UNTITLED_COMPLEX_H
main函数:
#include "complex.h"
int main() {
complex c1(1,-1);
complex c2;
complex c3(12,34);
double a = 12;
c2+=c1;
cout<< c3+a<<endl;
cout<< c2 <<endl;
cout<< c2+c3<<endl;
return 0;
}