在我的C++類上,我寫了一個類,並且我重寫了加號運算符。不能顛倒運算符的順序
這是原型:
Var operator + (const Var& var);
爲什麼IDE告訴我,這是正確的:
Var a = 3;
a + 5; // Correct
但這不是?
Var a = 3;
5 + a; // error
我需要做的事情可以在這個順序上加上一個整數與我的對象?
在我的C++類上,我寫了一個類,並且我重寫了加號運算符。不能顛倒運算符的順序
這是原型:
Var operator + (const Var& var);
爲什麼IDE告訴我,這是正確的:
Var a = 3;
a + 5; // Correct
但這不是?
Var a = 3;
5 + a; // error
我需要做的事情可以在這個順序上加上一個整數與我的對象?
原因是運營商作爲成員函數是不對稱的。您定義運算符的類的對象應始終位於左側。
你需要的是 - 你應該把你的操作函數放在類之外。
Var operator+(const Var&, const Var&);
如果你需要訪問私人領域聲明它作爲一個朋友功能。
我需要做的事情可以在這個順序上加上一個整數與我的對象?
它將需要一個非成員:
Var operator + (const Var& var1, const Var & var2);
這允許類型轉換被應用到任何一個操作數,而不是僅僅在右側一個。
如果需要訪問班級的私人,那麼它也需要成爲朋友。
對於後者你需要一個免費的功能
Var operator + (int, const Var& var);
另一種形式表明您瓦爾具有隱式轉換,所以
Var operator + (const Var& lhs, const Var& rhs);
可能會更好。
請記住,成員函數從不允許在lhs上進行轉換。
當您將運算符重載爲成員函數時,運算符不是對稱的。原因是在第一個參數上調用了重載操作。因此,如果您將+
運算符重載爲成員函數,並且編寫了a1+a2
,則它將轉換爲a1.operator+(a2)
。這意味着a1必須是該類的成員。
如果你想要對稱功能,你應該在類之外實現它,如果它需要訪問類的私有數據成員,將它聲明爲friend
。
Var operator+(const Var& first, const Var& second);
http://www.cprogramming.com/tutorial/operator_overloading.html - 基本上,你需要一個自由函數'運營商+'。 – Jon