操做符重定義c++
若不用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報錯this
complex operator +(const complex,const complex&);
operator+是一個雙目運算符,它的入參應該是兩個。定義在類內的時候,每個函數會自動天界一個默認入參this。而很明顯 咱們計算複數的時候 y = x + z。這種狀況是不須要this的。因此在這種不須要this的狀況下,咱們須要將operator+ 定義爲全局函數。code
與之相比,+=也爲雙目運算符,爲何它就能定義在類內了呢?blog
由於 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