[英]How does C++ cope with vector of objects with the same name?
假設我在某個本地范圍內創建了一個對象,並將其添加到該范圍外的矢量中。
std::vector<sometype> Vec;
for( int i = 0, etc... )
{
sometype Object;
Vec.push_back(Object);
}
現在,對象的副本將傳遞給Vec,對象本身將被銷毀。
但是,如果繼續這樣做,我將繼續創建存儲在向量中的許多名稱為“ Object”的對象。 現在,我可以通過它們的索引訪問它們,但是C ++如何處理我顯然有許多同名對象的事實?
sometype
對象的名稱無關緊要。 您是正確的,每次調用push_back
都會將Object
的副本放置到Vec
上,但這不是放置在矢量上的對象的名稱。 實際對象放置在向量中,可以通過正確索引向量來引用。
對象的名稱不是Object
。 那是變量的名稱。 用於復制構造vector元素的變量的名稱與該元素沒有任何關系。
對象通常沒有名稱。 有些確實如此,尤其是那些由變量命名的對象。 但是動態構造的對象卻沒有。 即使對象的變量和名稱之間的連接也很松散。 例如,如果您只有一個對象的指針,則無法找出該對象是否由變量命名。
只需將變量名視為某些內存地址的替代表示即可(對您來說是透明的!)。 您已經在內存中的某個特定位置創建了一個對象,該對象由您的變量名引用。 現在,您將對象復制到一個新的位置,該地址具有一個不同的地址,該地址與原始對象所處的地址完全無關,因此它也將獲得一個新的“名稱”,而變量名仍引用舊地址(只要仍在范圍內)。
當然,在向量內部,這個新的“名稱”不僅是地址,而且是如何找到它的秘訣( vec[someIndex]
:“轉到向量內部數據的開頭,您將在距向量的給定偏移量處找到對象那里”,這是;荒唐地說的,索引運算符的實際作用-再次對您透明)。
C ++如何處理具有相同名稱的對象向量。
不合邏輯的推論。
在您的for循環中,單詞“ Object”出現2次。
a)第一個出現的“ sometype Object;”是對“自動”內存區域的聲明和初始化。 在這種情況下,“對象”一詞在有限的范圍和生存期內標識實例的位置。
b)第二次出現“ Vec.push_back(Object);”是編譯器生成代碼以將實例傳遞給函數“ push_back”的命令。 在這里,它是通過引用(而不是值)傳遞的,這意味着函數“接收”的地址,而不是實際實例。
區別是:
(基於cppreference.com,其中函數以正式名稱“值”聲明為std :: vector :: push_back(const T&value)。)
(根據您的代碼)
因此,您的問題得出的結論是“結論或陳述在邏輯上不遵循先前的論點或陳述。”
摘要:
a)您的代碼中沒有什么叫做“值”或“ T”。
b)如果檢查了std :: vector代碼,則不會找到“ sometype”或“ Object”。
名稱不一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.