2012-02-29 149 views
2

我有一個用例 如果我有5類A,B,C,d,E和它們作爲A,B,C,d的實例,電子+運算符重載在C++

如果有一個表達 a = b + c + d + e;

調用operator +和operator =的順序是什麼? 什麼是創建的臨時對象。

能否請你幫我

+1

如果您重載這些操作符,則可以使用調試器或診斷輸出來確定順序。當你這樣做會發生什麼? – 2012-02-29 08:50:55

回答

2

+是左關聯的。 =是正確的聯想。該命令將

  • d + e使臨時de
  • de + c提供臨時cde。這是通過呼叫類C的運營商+採取任何類的參數臨時de是一個實例。
  • cde + b使臨時bcde。這是通過調用類B的運營商+來獲得cde類的參數。
  • bcde的值分配給變量a

這裏的臨時情況是一般情況,這取決於您實際上對您的過載會發生什麼。臨時的左邊的類將被稱爲使用臨時的參數,而不是相反。

使用+時,評估從左到右進行,但實際計算是另一種方式。

+0

因此,類D的operator +將首先被調用,就像operator +(E&e)一樣。那麼基於它返回的是什麼D/E對象,那個對象operator +將被稱爲或者C類的operator +被調用? – mSO 2012-02-29 08:55:36

+0

是的,它會從右到左,而且你不能確定臨時對象,因爲別人說它取決於你的實現和你正在使用的編譯器。試用一下調試器,它可能是最好的方式來看到它的行動! – Dervall 2012-02-29 08:57:19

+0

Class'C's operator +將被調用臨時返回類型。 – Dervall 2012-02-29 08:58:40

2
a = b + c + d + e; 

上的=的r.h.s表達將首先評估,然後=將被調用到結果分配給變量上l.h.s.

r.h.s上的表達式將從右到左進行評估。

檢查operator precedence

另外,還要注意代臨時在這種情況下,就會被取決於:

  • 重載+操作&
  • 編譯器的實現使用
+0

只是一個說明,但運算符優先級不**控制調用運算符重載函數的順序。 (除了間接的,在這裏,因爲優先級會創建操作數依賴關係。) – 2012-02-29 09:29:43

0

完全參考here

添加從右到左執行。該作業是最後執行的。根據優化,可能沒有任何臨時產生:

int x,y,z,k; 
    x = y = z = k = 3; 
    int l = x + y + z + k; 
    cout << l; 
00401000 mov   ecx,dword ptr [__imp_std::cout (402038h)] 
00401006 push  0Ch 
00401008 call  dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (40203Ch)] 
+0

我很好奇如何不能有一個臨時的。任何合理的'operator +'實現都會返回一個臨時的,並且沒有可以被刪除的非臨時的副本。所以我認爲至少應該有三個臨時對象。 – 2012-02-29 09:28:35

+0

@JamesKanze我用我能想到的最明顯的例子更新了我的答案。 – 2012-02-29 09:31:17

+0

你不能用int來判斷是否有臨時的。我們在這裏討論用戶定義的'operator +',返回一個類的類型。 (否則,關於臨時工的問題沒有意義。) – 2012-02-29 11:55:00

0

希望它不是一個功課

http://en.cppreference.com/w/cpp/language/operator_precedence

+ precedence is higher than = 

這樣+第一,它讀取從左到右

然後=,它從右讀取到左

對於臨時對象,抱歉,我不知道它。

+0

不!我有一個項目,我正在添加自定義數學對象。 Int,Complex Number,vector .... – mSO 2012-02-29 09:01:04

+0

我明白了。對於溫度。對象,顯然如果它是原始gcc沒有優化,b + c轉向臨時對象bc,然後繼續+ d等等。爲了計算,如果你的類中的所有變量都是原始類型,你不需要重載任何+或=運算符,C++會照顧你。否則你需要自己處理你的「加號」邏輯:) – Tommy 2012-02-29 09:13:58

1

沒有序列點,所以唯一的限制是運算符的參數必須在運算符本身調用 之前進行評估。你的情況:

a = b + c + d + e; 

表示:

a = (((b + c) + d) + e); 

成爲:

a.operator=(operator+(operator+(operator+(b, c), d), e)); 

(我假設這裏operator=是一個成員,是由 標準要求,但是operator+是通常的免費功能。)

碰巧,在這個特定的表達式中,操作數依賴關係 強加嚴格的順序。

對於臨時工,這取決於operator+實施, 而是給它的常用語義的運營商,這是必要的每個 調用返回一個臨時的(而不是引用)。在這種情況下,您將有 有3個臨時對象,一旦在每個對象operator+, 的返回處創建,並且在完整表達式的末尾都會被破壞。

+0

你確定這是對的,我認爲它會好像你寫了a = b +(c +(d + e));作爲+是從左到右聯想?我可能是錯的... – jcoder 2012-02-29 10:58:37

+0

@JohnB生產是_additive-expression_:_additive-expression_ + _multiplicative-expression_。所以在'a + b + c'中,'a + b'首先被減少。這也是我通過左聯合來理解的:左邊的操作符被首先分組。 (這也對應於維基百科的解釋。) – 2012-02-29 11:52:40

+0

這也是一個ANSEER – mSO 2012-02-29 12:44:00

0

執行的順序沒有因過載而改變。正常的C++運算符優先級和操作數評估規則適用。