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
我作爲一個有點困惑爲什麼字符串是按值傳遞的。
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
我作爲一個有點困惑爲什麼字符串是按值傳遞的。
push_back
拷貝傳給它的字符串對象s
。因此,您對s
所做的修改不會影響推回的值。
它不應該,因爲將字符串添加到列表l
時被複制。 string
參數被通過引用傳遞到getline:
istream& getline (istream& is, string& str);
您的標題有誤導性;您在發佈的代碼中沒有任何循環。
該字符串正在按值傳遞給push_back
,該副本在list
中複製。你得到的結果正是我期望的結果。
僞代碼:
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
}
沒錯。你爲什麼要這樣呢? – 2010-11-24 06:26:19
我認爲克里斯托弗是令人困惑的Java列表和C++列表 – 2010-11-24 06:29:03
@ user440336:驚人的如何有人可以期望的東西如此破碎:-)。 C++的行爲更直觀,Java/C#/ Ruby行爲是一種嘗試編寫代碼的方式,而不用考慮所有權的行爲是否正常(因爲這通常是無形的),假設人們在結果錯誤時學會克隆東西這更可能被注意到)。但僅限於對象,對,因爲如果字符串和數字表現得那麼明顯太奇怪了 - > ...! – 2010-11-24 06:49:22