2010-07-13 97 views
0

不,這不是每個人傳遞給當地人的錯誤。我只是試圖理解返回一個對你傳入的對象的引用(我正在閱讀引用)。關於返回對象的引用

所以,如果我有這樣的功能:

const foo & foo::function2(const foo & val) const 
{ 
    using namespace std; 
    return *this; 
} 

,然後我在主這樣做:

foo object1; 
object1.someproperty = 7; 

foo object2 = object1.function2(object1); 
object2.someproperty = 5; 

cout << &object1 << endl; 
cout << &object2 << endl; 

當我返回由參考,不應該對象2具有相同地址(和屬性)爲object1?不應該改變一個對象中的「某些屬性」來改變另一個對象中的值嗎?或者,返回對象的引用是否簡單地將值複製到新對象中?

似乎同樣的事情正在發生,就像我剛纔說的那樣,我將返回一個foo對象而不是一個引用。

+0

不,因爲你聲明瞭兩個不同的對象在堆棧上並複製它們的值。 – cpx 2010-07-13 00:44:13

回答

6
foo object2 = object1.function2(object1); 

function2()返回對object1的引用;然後調用foo拷貝構造函數將object1拷貝到object2中,因爲object2被聲明爲foo對象。

如果聲明object2爲const引用來代替:

const foo& object2 = object1.function2(object1); 

然後object2object1參考。

+0

好吧,有意義的是,一些事情隱藏在引擎蓋下。感謝大家的快速和徹底的反應。 – Ilya 2010-07-13 00:51:31

0

的代碼行:

foo object2 = object1.function2(object1); 

做兩件事情。

  1. 的引用(這恰好是指object1)從function2()
  2. 返回的object2初始化會創建function2()
1

返回的對象的副本,你碰到了自動拷貝構造函數,當你分配給object2。有效事情的經過是:

foo object2(object1.function2(object1)); 

凡自動生成的拷貝構造函數是這樣的:

class foo { 
public: 
    foo(const foo& other) { 
    //shallow copy other to this 
    } 
} 

爲了讓代碼做你認爲它應該做的,你需要申報對象2作爲const引用:

const foo& object2 = object1.function2(object1); 
//&object2 == &object1