0

我对 C++ 和这个网站还很陌生,所以我不知道我的问题是否会被拒绝,但我有一个问题需要知道。它并不是一个真正的“程序”相关问题。

所以我的问题是:在使用常规数组的类中不使用重载赋值运算符和复制构造函数的原因是什么(它称为静态数组(?)我相信)我的原因是,因为静态不需要内存管理数组,它们在函数结束时(或返回时)被销毁,因此无法重载赋值运算符和复制构造函数。

我是正确的还是我错了?是的,我之前确实尝试过在没有提供任何答案的情况下提出这个问题,但这是我能想到的。(基于为什么不使用析构函数)

4

2 回答 2

0

默认的复制构造函数和复制赋值运算符只是将成员从一个对象复制到新对象。

考虑一个类,它的成员int* arr;指向在类的构造函数中分配的动态分配数组。当您为此类使用默认的复制构造函数或复制赋值运算符时,它只会复制 cross 的值int*。动态分配的数组不是对象的成员,因此不会被复制。这意味着副本和原件都将指向同一个动态分配的数组。现在,如果类的析构函数有delete arr;在其中(它应该),当每个对象被销毁时,它们都将尝试销毁相同的动态分配的数组。这是个坏消息。一旦其中一个执行了解除分配,另一个则不能。为了解决这个问题,您需要提供一个复制构造函数、赋值运算符和析构函数来处理动态分配的内存(参见三规则)。

相反,如果您的类有一个成员int arr[10];,例如,数组就是该类类型的对象的一部分。当您使用默认的复制构造函数或复制赋值运算符时,将复制数组本身。这意味着新对象中的元素是另一个类中元素的副本。这很好,不会导致任何问题。事实上,你甚至可以使用默认的析构函数,因为你什么都没有delete

于 2013-05-06T21:42:04.110 回答
0

如前所述,尚不清楚您要找出什么,但我会根据您使用的语言指出一些事情。首先,总是需要内存管理——只是有时,您不必手动进行。我不确定您所说的“未使用”是什么意思,但类中“静态”数据的意义在于该类的所有实例都引用相同的数据——没有什么可复制的,因为每个类都引用同样的事情。仍然可以重载运算符和构造函数,只是与静态数据无关。同样,方法中的静态数据不是局部变量;它在该方法的调用中持续存在。

于 2013-05-06T21:52:41.057 回答