c++基礎--operator+定義在類內還是在類外
阿新 • • 發佈:2020-12-10
操作符重定義
若不用this,操作符應該定義在類外
#pragma once #ifndef _COMPLEX_ #define _COMPLEX_ class complex; complex& _doapl(complex* ths, const complex& r); class complex { public: complex(double r = 0, double i = 0) : re(r), im(i) {}; double real() const { return re; }; double img() const { return im; }; //出現問題,vs提示此運算子函式的引數太多 complex operator +(const complex,const complex&); //與之相比,+=沒有出現問題 complex& operator +=(const complex&); private: double re, im; }; complex complex::operator +(const complex&); #endif
在上述程式碼中,定義在類內的operator報錯
complex
operator +(const complex,const complex&);
operator+是一個雙目運算子,它的入參應該是兩個。定義在類內的時候,每一個函式會自動天界一個預設入參this。而很明顯 我們計算複數的時候 y = x + z。這種情況是不需要this的。所以在這種不需要this的情況下,我們需要將operator+ 定義為全域性函式。
與之相比,+=也為雙目運算子,為什麼它就能定義在類內了呢?
因為 y+=z。此時是需要y的值的,也就是說,在真正計算的時候,是需要this的值的,所以應該定義在類內。
編譯器會自動檢查,若雙目運算子定義在類內,則最多隻能有一個入參,因為this也算一個。
我們應該這樣定義:
#pragma once #ifndef _COMPLEX_ #define _COMPLEX_ class complex; complex& _doapl(complex* ths, const complex& r); class complex { public: complex(double r = 0, double i = 0) : re(r), im(i) {}; double real() const { return re; }; double img() const { return im; }; //與之相比,+=沒有出現問題 complex& operator +=(const complex&); private: double re, im; }; //定義為全域性函式 complex operator +(const complex&){ }; #endif