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