首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在静态数组中不使用重载赋值和复制构造函数的原因

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

Stack Overflow用户
提问于 2013-05-07 05:33:24
回答 2查看 98关注 0票数 0

我是C++和这个网站的新手,所以我不知道我的问题是否会被拒绝,但我有一个我需要知道的问题。这真的不是一个“程序”相关的问题。

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

我说得对吗?还是说错了?是的,我以前确实试过问这个问题,但没有提供任何答案,但这就是我能想到的。(基于不使用析构函数的原因)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-07 05:42:04

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-07 05:52:41

正如前面提到的,不清楚你想要找出什么,但我会根据你使用的语言指出一些事情。首先,总是需要内存管理--只是有时候,您不必手动完成。我不确定您所说的“未使用”是什么意思,但类中“静态”数据的要点是该类的所有实例都引用相同的数据--没有什么可复制的,因为每个类都引用相同的内容。重载运算符和构造函数仍然是可能的,只是与静态数据无关。同样,方法中的静态数据不是局部变量;它在该方法中从一个调用到另一个调用都是持久化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16407658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档