一个什么都不做的函数可以改变一个对象吗?
Can a function doing nothing change an object?
为什么一个什么都不做的函数会改变一个对象?
我有以下代码:
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
而不是原始数据。
相关文章:
- 变量没有改变?通过向量的函数调用
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 为什么我的函数接受"std::string"进行排序不会改变它?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 有没有办法创建一个不改变程序中参数的函数
- 为什么我的函数不改变对象的属性
- 类中的枚举在调用自己的函数时不会改变
- C - 如何将各处的静态函数称为改变其私有变量
- 基于继承的类型参数改变父虚拟函数的行为
- 对列表中的每个对象调用成员函数,以改变对象所在的列表
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 当函数应该改变对象的状态时,是选择成员函数还是朋友函数
- 一个什么都不做的函数可以改变一个对象吗?
- ifstream 函数"get"如何改变其字符参数?
- 为什么一个函数的末尾有常量这个词,即使它确实改变了一个变量
- visual C++未执行的代码会改变函数行为
- 不被类函数改变的私有int值
- 谷歌模拟函数改变参数值
- 被非const成员函数改变的可变变量