在静态数组中不使用重载赋值和复制构造函数的原因

reason for not using overloaded assignment and copy constructor in Static Array

本文关键字:复制 构造函数 赋值 重载 数组 静态      更新时间:2023-10-16

我对c++和这个网站很陌生,所以我不知道我的问题是否会被拒绝,但我有一个问题,我需要知道。这不是一个与"程序"相关的问题。

我的问题是:重载赋值操作符和复制构造函数不用于使用常规数组的类(称为静态数组)的原因是什么?我相信)我的理由是,由于静态数组中不需要内存管理,当函数结束时(或当它返回时),它们将被销毁,从而使重载赋值操作符和复制构造函数不可能。

我是对的还是错的?是的,我之前确实试着问过这个问题,但没有给出任何答案,但这是我能想到的。(基于不使用析构函数的原因)

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

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

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

如前所述,不清楚您想要找出什么,但我将根据您使用的语言指出一些事情。首先,内存管理总是需要——只是有时候,您不需要手工操作。我不确定您所说的"未使用"是什么意思,但是类中"静态"数据的要点是该类的所有实例都引用相同的数据——没有什么可复制的,因为每个类都引用相同的东西。重载操作符和构造函数仍然是可能的,只是与静态数据无关。同样,方法中的静态数据不是局部变量;它在该方法的调用中持续存在。