2010-11-24 17 views
1
list<string> l; 
string s; 

getline(cin, s); 
l.push_back(s); 
getline(cin, s); 
l.push_back(s); 

使用輸入插入到列表之前重用相同的字符串似乎通過值?

123 
test 

打印清單 'L' 的結果:

123 
test 

不應該在該打印:

test 
test 

我作爲一個有點困惑爲什麼字符串是按值傳遞的。

+2

沒錯。你爲什麼要這樣呢? – 2010-11-24 06:26:19

+2

我認爲克里斯托弗是令人困惑的Java列表和C++列表 – 2010-11-24 06:29:03

+1

@ user440336:驚人的如何有人可以期望的東西如此破碎:-)。 C++的行爲更直觀,Java/C#/ Ruby行爲是一種嘗試編寫代碼的方式,而不用考慮所有權的行爲是否正常(因爲這通常是無形的),假設人們在結果錯誤時學會克隆東西這更可能被注意到)。但僅限於對象,對,因爲如果字符串和數字表現得那麼明顯太奇怪了 - > ...! – 2010-11-24 06:49:22

回答

1

push_back拷貝傳給它的字符串對象s。因此,您對s所做的修改不會影響推回的值。

1

它不應該,因爲將字符串添加到列表l時被複制。 string參數通過引用傳遞到getline

istream& getline (istream& is, string& str); 
0

您的標題有誤導性;您在發佈的代碼中沒有任何循環。

該字符串正在按值傳遞給push_back,該副本在list中複製。你得到的結果正是我期望的結果。

0

僞代碼:

void list::push_back(string& s) 
{ 
    list_.add(new string(s)); // copy string 
} 

你看,串中的push_back方法複製。它僅供參考,以避免冗餘複製。

void list::push_back(string s) // copy string 
{ 
    list_.add(new string(s)); // copy string 
} 
相關問題