參考視頻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;
}