2010-11-24 42 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 
}