在静态数组中不使用重载赋值和复制构造函数的原因
reason for not using overloaded assignment and copy constructor in Static Array
我对c++和这个网站很陌生,所以我不知道我的问题是否会被拒绝,但我有一个问题,我需要知道。这不是一个与"程序"相关的问题。
我的问题是:重载赋值操作符和复制构造函数不用于使用常规数组的类(称为静态数组)的原因是什么?我相信)我的理由是,由于静态数组中不需要内存管理,当函数结束时(或当它返回时),它们将被销毁,从而使重载赋值操作符和复制构造函数不可能。
我是对的还是错的?是的,我之前确实试着问过这个问题,但没有给出任何答案,但这是我能想到的。(基于不使用析构函数的原因)
默认的复制构造函数和复制赋值操作符只是将成员从一个对象复制到新对象。
考虑一个具有成员int* arr;
的类,该成员指向在类的构造函数中分配的动态分配数组。当您使用该类的默认复制构造函数或复制赋值操作符时,它将只复制int*
的值。动态分配的数组不是对象的成员,因此不会复制。这意味着副本和原始数组都指向同一个动态分配的数组。现在,如果类的析构函数中有delete arr;
(它应该),当每个对象被销毁时,它们都将尝试销毁同一个动态分配的数组。这是个坏消息。一旦其中一个执行了释放操作,另一个就不能了。要解决这个问题,需要提供复制构造函数、赋值操作符和析构函数来处理动态分配的内存(参见三的规则)。
int arr[10];
,例如,数组是该类类型的对象的部分。当使用默认复制构造函数或复制赋值操作符时,会跨数组本身进行复制。这意味着新对象中的元素是另一个类中的元素的副本。这是非常好的,不会导致任何问题。实际上,您甚至可以使用默认的析构函数,因为您没有delete
。
如前所述,不清楚您想要找出什么,但我将根据您使用的语言指出一些事情。首先,内存管理总是需要——只是有时候,您不需要手工操作。我不确定您所说的"未使用"是什么意思,但是类中"静态"数据的要点是该类的所有实例都引用相同的数据——没有什么可复制的,因为每个类都引用相同的东西。重载操作符和构造函数仍然是可能的,只是与静态数据无关。同样,方法中的静态数据不是局部变量;它在该方法的调用中持续存在。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用