2013-06-21 135 views
0

在我的C++類上,我寫了一個類,並且我重寫了加號運算符。不能顛倒運算符的順序

這是原型:

Var operator + (const Var& var); 

爲什麼IDE告訴我,這是正確的:

Var a = 3; 
a + 5; // Correct 

但這不是?

Var a = 3; 
5 + a; // error 

我需要做的事情可以在這個順序上加上一個整數與我的對象?

+0

http://www.cprogramming.com/tutorial/operator_overloading.html - 基本上,你需要一個自由函數'運營商+'。 – Jon

回答

2

原因是運營商作爲成員函數是不對稱的。您定義運算符的類的對象應始終位於左側。

你需要的是 - 你應該把你的操作函數放在類之外。

Var operator+(const Var&, const Var&); 

如果你需要訪問私人領域聲明它作爲一個朋友功能。

1

我需要做的事情可以在這個順序上加上一個整數與我的對象?

它將需要一個非成員:

Var operator + (const Var& var1, const Var & var2); 

這允許類型轉換被應用到任何一個操作數,而不是僅僅在右側一個。

如果需要訪問班級的私人,那麼它也需要成爲朋友。

+0

但後來我需要刪除此覆蓋: 瓦爾運營商+(const的無功& var); 並更換白衣的是: 瓦爾運營商+(const的無功&VAR1,const的無功和VAR2); – pava91

+0

,我需要聲明的是覆蓋? ?不在類聲明中? – pava91

+1

@ pava91:如果它是朋友,那麼它可以在類定義中;否則,在周圍的名稱空間中 –

1

對於後者你需要一個免費的功能

Var operator + (int, const Var& var); 

另一種形式表明您瓦爾具有隱式轉換,所以

Var operator + (const Var& lhs, const Var& rhs); 

可能會更好。

請記住,成員函數從不允許在lhs上進行轉換。

0

當您將運算符重載爲成員函數時,運算符不是對稱的。原因是在第一個參數上調用了重載操作。因此,如果您將+運算符重載爲成員函數,並且編寫了a1+a2,則它將轉換爲a1.operator+(a2)。這意味着a1必須是該類的成員。

如果你想要對稱功能,你應該在類之外實現它,如果它需要訪問類的私有數據成員,將它聲明爲friend

Var operator+(const Var& first, const Var& second);