簡體   English   中英

聲明對象和賦值運算符的引用

[英]Declaring a reference to object and the assignment operator

我覺得這個問題很基本,可以在某個地方出現,但我似乎無法找到答案。

假設我有這個代碼:

//class member function
std::map< std::string, std::string > myMap;

const std::map< std::string, std::string >& bar()
{
   return myMap;
}

void myFunc( std::map< std::string, std::string >& foo1 )
{
   foo1 = bar();
   std::map< std::string, std::string >& foo2 = bar();
}

我的理解是,如果我開始使用foo2,因為foo2是對bar()返回的同一實例的引用,我用foo2做的任何事都將反映在myMap中。 但是foo1怎么樣? foo1是否獲得了myMap的副本,還是指向與bar()返回的實例相同的實例? c ++標准庫說std :: map的賦值運算符會復制元素,但這是否意味着在foo2的聲明中沒有真正調用賦值運算符?

謝謝!

引用在C ++中不可重用。 這意味着一旦初始化,您就無法重新分配它們。 相反,任何賦值實際上都涉及被引用的對象。 所以在你的代碼中,

foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();

第一行調用std::map::operator=作為參數傳遞給myFunc 在那之后, foo1 stills引用同一個對象 - 但它的值(例如它所擁有的元素)可能已經被改變了。

請注意,如果懷疑它在您的腦海中,則第二行不是賦值。 相反,它是一個初始化。 由於bar的返回類型實際上是std::map<std::string, std::string> const& ,它不能綁定到std::map<std::string, std::string>&所以它是一個編譯錯誤。


為了擴展事物的“哲學”方面,C ++引用被設計為盡可能透明,並不像對象那樣存在。 這是使用術語的C ++標准含義(它與OOP無關):它表示例如引用類型沒有大小。 相反, sizeof(T&) == sizeof(T) 類似地,引用沒有地址,也不可能形成指針或對引用的引用:給定int& ref = i; ,然后&ref == &i

因此,有意地使用引用,就像所引用的對象本身被使用一樣。 在引用的生命周期中發生的唯一特定於引用的是它的初始化:它可以綁定到什么以及它在生命周期中意味着什么。

這條線

foo1 = bar();

創建一個副本(因為這是map的賦值運算符所做的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM