2013-02-17 113 views
2

在這個簡化的例子中,我的問題是:我是否在Action :: setUser()內部進行合法賦值?此C++參考分配是否正確?

class User { 
private: 
    int age; 
public: 
    int getAge() { return age; } 
}; 

class Action { 
private: 
    User user; 
public: 
    void setUser(User &u) { 
     user = u; 
    } 
}; 

int main() { 
    User u; 
    Action a; 
    a.setUser(u); 
    return 0; 
} 

是什麼讓我噪音,

  • 時SETUSER被稱爲發生了什麼行動的 「用戶」 屬性?它被摧毀了嗎?它有史以來建造?
  • 如果我第二次調用setUser會發生什麼?
  • 如果我刪除setUser中的「&」符號,一切都會好的,對不對?因爲這就像傳遞參數的副本一樣,對吧?

我很擔心,我做內存瘋狂的事情,因爲屬性沒有被正確地摧毀...

謝謝


編輯於星期一2013年2月18日

非常感謝!我真的很感激你的迴應......

我不知道編譯器提供了一個默認的重載賦值操作符。現在我知道一切都非常有意義...

再次感謝。

+0

除了可能更好,如果這是'const User&u',那麼分配就很好。它將複製用戶而不需要中間副本到by-val參數。 Action的現有用戶不會被銷燬'setUser(u)',而是會通過賦值操作符「覆蓋」。如果你想要,你可以通過自己編寫一個'User :: operator =(const User&u)'來控制它是如何完成的。關於第二個電話,與第一個電話相同。最後,刪除&*將會*引入至少一個額外的副本。 – WhozCraig 2013-02-17 00:47:01

+0

我想知道你寫的最後一句話:*「我擔心我在記憶中做了瘋狂的事情,因爲屬性沒有被正確銷燬」* - 你是什麼意思?*「被正確銷燬」*?你如何看待這個問題? – LihO 2013-02-17 00:53:32

回答

4

當setUser被調用時,Action的「user」屬性會發生什麼?

賦值運算符(由編譯器提供,如還沒有定義的自定義一個)被調用時,它簡單地執行構件明智拷貝從uuser

它被摧毀了嗎?

是它有史以來建造?

是的。

如果我第二次調用setUser,會發生什麼?

同樣的事情。

如果我刪除SETUSER的「&」符號,一切都會好起來的,對不對?

user的任務而言,這沒有什麼區別。按引用傳遞僅僅意味着在調用該函數時不會創建參數副本。

+0

+1,簡單直接的答案。 – LihO 2013-02-17 00:51:25

1

是的,沒關係。它只是從u中指定您直接定義爲a.user。參考參數避免了將額外的副本傳遞給a.setUser

當您創建Action時,它包含一個默認構造的User對象。然後,您爲該User分配一個值。這不是(IMO)最好的設計(我寧願看到使用正確值構造的User),但它都是完全有效的。

該分配不會創建或破壞現有值。 Action對象在超出範圍時將被銷燬,並且會破壞它包含的User對象。

1

答案:

  • 它不被破壞,但覆蓋(拷貝賦值)。是的,它是以前建造的。
  • 與第一次相同。
  • 如果您刪除了&,則會傳遞副本。它並沒有讓事情錯誤或正確。

注:

  • 使用const的,無論在memberfunctions和傳遞的參數。
  • 您至少需要考慮控制複製和分配。這應該在任何更好的C++介紹或FAQ中解釋。
1
class Action { 
private: 
    User user; 
} 

定義User類型的私有成員。這是一個具有自動存儲持續時間的對象,它在Action類型的對象正在構建時構建。它的使用壽命與Action類型的對象的使用期限有關。

現在,在該方法中:

void setUser(User &u) { 
    user = u; 
} 

u是參照其屬性(成員)的對象將被用於通過使用所述賦值運算符設置的user屬性。

如果您在這裏刪除&,您將通過引用傳遞值來更改傳遞,這意味着傳遞給此方法的對象的副本將在其調用時創建。