我对C ++和这个网站都很陌生,所以我不知道我的问题是否会被拒绝,但我有一个我需要知道的问题。它不是真正的“程序”相关问题。
所以我的问题是: 在使用常规数组的类中没有使用重载赋值运算符和复制构造函数的原因是什么(我相信它叫做静态数组(?)) 我的理由是,由于静态数组中不需要内存管理,因此当函数结束时(或返回时)它们会被破坏,从而无法重载赋值运算符和复制构造函数。
我是正确还是离开? 是的,我确实在没有提供任何答案的情况下尝试提出这个问题,但这是我能想到的。 (基于为什么不使用析构函数)
答案 0 :(得分:0)
默认的复制构造函数和复制赋值运算符只需将成员从一个对象复制到新对象。
考虑一个具有成员int* arr;
的类,该成员指向在类的构造函数中分配的动态分配数组。当您为此类使用默认的复制构造函数或复制赋值运算符时,它只会复制int*
的值。动态分配的数组不是对象的成员,因此不会被复制。这意味着副本和原始文件都指向同一个动态分配的数组。现在,如果类的析构函数中有delete arr;
(它应该),当每个对象被销毁时,它们都会尝试销毁同一个动态分配的数组。这是个坏消息。一旦其中一个人执行了解除分配,另一个则不能。要解决这个问题,您需要提供一个复制构造函数,赋值运算符和析构函数来处理动态分配的内存(请参阅the rule of three)。
相反,例如,如果您的类具有成员int arr[10];
,则该数组该类类型的对象的的一部分。使用默认的复制构造函数或复制赋值运算符时,将复制数组本身。这意味着新对象中的元素是另一个类中元素的副本。这非常好,并没有问题。事实上,你甚至可以使用默认的析构函数,因为你没有delete
。
答案 1 :(得分:0)
如上所述,目前尚不清楚您要查找的是什么,但我会根据您使用的语言指出一些内容。首先,内存管理始终需要 - 有时,您不必手动执行。我不确定“未使用”是什么意思,但是类中“静态”数据的意思是该类的所有实例引用相同的数据 - 没有什么可复制的,因为每个类都指的是同一个东西。仍然可以重载操作符和构造函数,这与静态数据无关。同样,方法中的静态数据不是局部变量;它在呼叫中持续存在于该方法中。