2013-06-21 91 views
0

我有這樣的方法:初始化與引用的對象

MyClass& Smth::getMyClass() { 
    return myClassObj; 
} 

,現在這兩個例子的工作方式相同(vs2012):

MyClass& a = smthObj.getMyClass(); 
a.whatever(); 

MyClass a = smthObj.getMyClass(); 
a.whatever(); 

如何解讀?

+0

定義「以同樣的方式工作」。您希望他們以何種方式不同,以及代碼與您的期望有什麼不同? –

+1

在第二種情況下,對象仍將被複制。 – 2013-06-21 12:55:16

+0

@SebastianRedl我的意思是你可以用'。'來調用它,並且編譯不會失敗。 – tobi

回答

5

如何解釋?

MyClass& a = smthObj.getMyClass(); 
a.whatever(); 

a參考smthObj的數據成員。第二行在數據成員上調用whatever()

MyClass a = smthObj.getMyClass(); 
a.whatever(); 

asmthObj的數據部件的拷貝。第二行在該副本上調用whatever()

+0

'MyClass&'和'MyClass'是不是意味着另一種類型?正因爲如此,我認爲使用MyClass a時編譯應該失敗;因爲返回的類型是'MyClass&'。 – tobi

+1

@tobi'MyClass'和'MyClass的&'是不同的,但所發生的事情是,一個'MyClass'複製正在從基準到另一'MyClass'對象('Smth'的數據成員) – juanchopanza

+0

這是否意味着有一個隱含的演員? – tobi

4

他們不以相同的方式工作。在第一種情況下,函數返回一個引用,調用者將另一個引用綁定到同一個對象。 a上的任何操作將應用於myClassObj。在第二種情況下,調用者創建對象的副本,應用於a的任何操作將應用於該副本,並且不會影響原始對象。

+0

爲什麼在使用MyClass a = ...時會得到對象的副本?我在方法的簽名中指定了我想引用它。 – tobi

+1

您返回參考。但是,您然後繼續初始化一個完整的對象。因此,完整對象將複製引用的內容。 (你或許學前C++ PHP?因爲PHP的引用是瘋狂和一個壞的指導。) –

+0

@SebastianRedl這怎麼做出發?是否有任何隱式轉換還是什麼? – tobi