1. 程式人生 > 實用技巧 >c++基礎--operator+定義在類內還是在類外

c++基礎--operator+定義在類內還是在類外

操作符重定義

若不用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