2011-08-09 109 views
1

問題1>以下代碼含義和賦值順序是什麼?如何支持(a = b)= c?

ClassName a1, a2, a3; 
a1 = a2 = a3; 

這是否意味着首先將a3的值賦給a2然後賦值??到a1。

問題2>下面的代碼是什麼意思?

ClassName a1, a2, a3; 
(a1 = a2) = a3; 

問題3> 給出一個類,如下所示:

class A 
{ 
    ... 
} 

什麼運營商,以支持以下操作來界定?

A a1, a2, a3; 
(a1 = a2) = a3; 
+10

只是閱讀這些問題讓我決心永遠不要使用這樣的語法。 –

+0

@大衛,我不喜歡那些:) +1 – q0987

+1

聞起來像一個測驗。 –

回答

9

問題1

此:

a1 = a2 = a3; 

等效於此:

a1 = (a2 = a3); 

對於原始類型,或用於吊艙,這相當於:

a2 = a3; 
a1 = a2; 

對於用戶定義的類型,它等同於:

a1.operator=(a2.operator=(a3)); 

如果你沒有定義自己的operator=重載,那麼這將是相同的基本類型。

問題2

此:

(a1 = a2) = a3; 

僅適用於用戶定義類型。它相當於:如果您使用的編譯器,爲運營商提供

a1.operator=(a2).operator=(a3); 

,那麼這相當於:

a1 = a2; 
a1 = a3; 

問題3

沒有運營商已經被定義爲如果您不寫自己的代碼,編譯器會提供一個複製分配操作符實現。

+1

「,相當於這個:'a2 = a3; a1 = a2;'」假設一個合理的'operator ='實現。如果'ClassName :: operator ='是用戶定義的,以返回對'a2'以外的引用,這是不明智的,但它打破了等值... –

+0

@Steve:好點。讓我把它解釋爲我的答案。 –

3

問題1:

是由右至左進行

評價順序,因此​​相當於a2 = a3; a1 = a2;

問題2:

如果operator=還沒有被重新定義,這意味着a1 = a3

問題3:

沒什麼,它的工作原理是是。

+0

也許你的意思是說**重載**不重**重新定義** –

相關問題