我有一個用例 如果我有5類A,B,C,d,E和它們作爲A,B,C,d的實例,電子+運算符重載在C++
如果有一個表達 a = b + c + d + e;
調用operator +和operator =的順序是什麼? 什麼是創建的臨時對象。
能否請你幫我
我有一個用例 如果我有5類A,B,C,d,E和它們作爲A,B,C,d的實例,電子+運算符重載在C++
如果有一個表達 a = b + c + d + e;
調用operator +和operator =的順序是什麼? 什麼是創建的臨時對象。
能否請你幫我
+
是左關聯的。 =
是正確的聯想。該命令將
d
+ e
使臨時de
de
+ c
提供臨時cde
。這是通過呼叫類C
的運營商+
採取任何類的參數臨時de
是一個實例。cde
+ b
使臨時bcde
。這是通過調用類B
的運營商+
來獲得cde
類的參數。bcde
的值分配給變量a
。這裏的臨時情況是一般情況,這取決於您實際上對您的過載會發生什麼。臨時的左邊的類將被稱爲使用臨時的參數,而不是相反。
使用+
時,評估從左到右進行,但實際計算是另一種方式。
a = b + c + d + e;
上的=
的r.h.s表達將首先評估,然後=
將被調用到結果分配給變量上l.h.s.
r.h.s上的表達式將從右到左進行評估。
另外,還要注意代臨時在這種情況下,就會被取決於:
+
操作&只是一個說明,但運算符優先級不**控制調用運算符重載函數的順序。 (除了間接的,在這裏,因爲優先級會創建操作數依賴關係。) – 2012-02-29 09:29:43
完全參考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)]
我很好奇如何不能有一個臨時的。任何合理的'operator +'實現都會返回一個臨時的,並且沒有可以被刪除的非臨時的副本。所以我認爲至少應該有三個臨時對象。 – 2012-02-29 09:28:35
@JamesKanze我用我能想到的最明顯的例子更新了我的答案。 – 2012-02-29 09:31:17
你不能用int來判斷是否有臨時的。我們在這裏討論用戶定義的'operator +',返回一個類的類型。 (否則,關於臨時工的問題沒有意義。) – 2012-02-29 11:55:00
希望它不是一個功課
http://en.cppreference.com/w/cpp/language/operator_precedence
+ precedence is higher than =
這樣+第一,它讀取從左到右
然後=,它從右讀取到左
對於臨時對象,抱歉,我不知道它。
沒有序列點,所以唯一的限制是運算符的參數必須在運算符本身調用 之前進行評估。你的情況:
a = b + c + d + e;
表示:
a = (((b + c) + d) + e);
成爲:
a.operator=(operator+(operator+(operator+(b, c), d), e));
(我假設這裏operator=
是一個成員,是由 標準要求,但是operator+
是通常的免費功能。)
碰巧,在這個特定的表達式中,操作數依賴關係 強加嚴格的順序。
對於臨時工,這取決於operator+
實施, 而是給它的常用語義的運營商,這是必要的每個 調用返回一個臨時的(而不是引用)。在這種情況下,您將有 有3個臨時對象,一旦在每個對象operator+
, 的返回處創建,並且在完整表達式的末尾都會被破壞。
你確定這是對的,我認爲它會好像你寫了a = b +(c +(d + e));作爲+是從左到右聯想?我可能是錯的... – jcoder 2012-02-29 10:58:37
@JohnB生產是_additive-expression_:_additive-expression_ + _multiplicative-expression_。所以在'a + b + c'中,'a + b'首先被減少。這也是我通過左聯合來理解的:左邊的操作符被首先分組。 (這也對應於維基百科的解釋。) – 2012-02-29 11:52:40
這也是一個ANSEER – mSO 2012-02-29 12:44:00
執行的順序沒有因過載而改變。正常的C++運算符優先級和操作數評估規則適用。
如果您重載這些操作符,則可以使用調試器或診斷輸出來確定順序。當你這樣做會發生什麼? – 2012-02-29 08:50:55