在代码中:
struct Rep
{
const char* my_data_;
Rep* my_left_;
Rep* my_right_;
Rep(const char*);
};
typedef Rep& list;
ostream& operator<<(ostream& out, const list& a_list)
{
int count = 0;
list tmp = a_list;//----->HERE I'M CREATING A LOCAL COPY
for (;tmp.my_right_;tmp = *tmp.my_right_)
{
out << "Object no: " << ++count << " has name: " << tmp.my_data_;
//tmp = *tmp.my_right_;
}
return out;//------>HERE a_list is changed
}
我认为如果我要为a_list对象创建本地副本,我将在完全独立的对象上操作。为什么不是这样?
感谢。
答案 0 :(得分:4)
您typedef
'd list
是Rep &
。这意味着tmp
不是副本。这只是另一个参考。您对tmp
所做的任何操作都将在a_list
完成。
答案 1 :(得分:3)
const list& a_list
- 编译错误,对引用的引用是非法的。
tmp = *tmp.my_right_
非常糟糕。使用指针而不是引用。
问题在于tmp
是a_list
的引用。写作时a_list
会被更改
tmp = *tmp.my_right_
。
答案 2 :(得分:1)
我认为list
与Rep
相同。
您只是将指针复制到列表中的第一个节点。您没有复制数据,也没有复制列表的其余节点。您正在执行列表的第一个节点的浅拷贝。如果您还要复制对象本身,那么它将是深层复制。
答案 3 :(得分:0)
我假设你将自己的名单作为一项教育活动。当您真实地执行此操作时,请知道标准库为您提供了所有这些功能。
std::list<std::string> myData;
// One way to print everything in the list.
int count = 0;
for (std::list<std::string>::iterator i = myData.begin(); i != myData.end(); ++i)
{
std::cout << "Object no: " << ++count << " has name: " << *i;
}