即使我没有使用引用,值也会更改

时间:2010-04-05 14:52:57

标签: c++ reference

在代码中:

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对象创建本地副本,我将在完全独立的对象上操作。为什么不是这样?

感谢。

4 个答案:

答案 0 :(得分:4)

typedef'd listRep &。这意味着tmp不是副本。这只是另一个参考。您对tmp所做的任何操作都将在a_list完成。

答案 1 :(得分:3)

const list& a_list - 编译错误,对引用的引用是非法的。

tmp = *tmp.my_right_非常糟糕。使用指针而不是引用。 问题在于tmpa_list的引用。写作时a_list会被更改 tmp = *tmp.my_right_

答案 2 :(得分:1)

我认为listRep相同。

您只是将指针复制到列表中的第一个节点。您没有复制数据,也没有复制列表的其余节点。您正在执行列表的第一个节点的浅拷贝。如果您还要复制对象本身,那么它将是深层复制

答案 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;
}