【问题标题】:Can a function doing nothing change an object? [closed]什么都不做的函数可以改变对象吗? [关闭]
【发布时间】:2015-04-26 05:47:34
【问题描述】:

为什么什么都不做的函数会改变对象?

我有以下代码:

void sample(SList a)
{
    cout << "\nIn Function";
    a.print();
}

int main()
{
    srand(500);
    int total = 10;
    SList llist;

    for(int i = 0; i < total; i++)
    {
        llist.add_head(rand() % 100);
    }

    llist.print();
    llist.print();

    sample(llist);
    llist.print();
    return 0;
}

输出是:

70  69  14  3   18  71  70  17  57  98  
70  69  14  3   18  71  70  17  57  98  
In Function
70  69  14  3   18  71  70  17  57  98  
0   34365728    34365696    34365664    34365632    34365600    34365568    34365536    34365504    34365472

我的问题是,与 SList 没有任何关系的函数 sample 正在更改 SList。它是如何做到的? SList 是一个单链表。

我认为这与按值传递有关。如果有人向我展示我无知地遗漏的观点,那就太好了。

编辑:标题问题的答案是肯定的。请看答案。

【问题讨论】:

    标签: c++ pass-by-reference pass-by-value


    【解决方案1】:

    查看SList's 复制构造函数和析构函数。我没有看到它们的猜测是复制构造函数对数据进行了浅拷贝,而析构函数删除了该数据。问题是在调用sample 时调用了复制构造函数,然后在退出sample 时调用了析构函数。有几种方法可以解决此问题。

    您可以通过引用传递SList。这将阻止复制构造函数和析构函数被调用。

    您可以在复制构造函数中对数据进行深度复制。

    另一种解决方案是让SList 将其数据存储为shared_ptr,而不是原始数据。

    【讨论】:

    • 是的!明白了。谢谢!
    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2018-02-11
    相关资源
    最近更新 更多