一个什么都不做的函数可以改变一个对象吗?

Can a function doing nothing change an object?

本文关键字:函数 改变 一个对象 一个 什么      更新时间:2023-10-16

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

我有以下代码:

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 是一个单链表。

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

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

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

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

可以在复制构造函数中深层复制数据。

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