<分区>
这是一个一般性问题,我已经问了一段时间,但无法得到明确的答案。当此类中的所有实例数据字段都是标准内置的 C++ 数据类型时,我是否需要为该类编写复制构造函数?
标签 c++
<分区>
这是一个一般性问题,我已经问了一段时间,但无法得到明确的答案。当此类中的所有实例数据字段都是标准内置的 C++ 数据类型时,我是否需要为该类编写复制构造函数?
最佳答案
成员变量的类型对于(1) 并不重要,它们的语义 很重要。规则很简单:
如果您不提供复制构造函数,编译器将尝试为您生成一个。这个默认生成的会对所有成员变量进行默认的复制操作。对于类类型,这意味着调用复制构造函数。对于原始类型,这意味着按位复制。
如果默认生成的构造函数满足您的需要,请不要声明您自己的构造函数。如果它不能满足您的需要,请自己声明一个。可以创建一个具有非原始成员变量和完美的默认复制语义的类:
struct PersonId
{
std::string surname;
std::vector<std::string> givenNames;
};
同样,可以创建一个具有原始类型成员变量的类,其中默认复制语义不是可以的:
class UniqueNamed
{
int id;
UniqueNamed() : id(0) {}
public:
UniqueNamed(const UniqueNamed &src) : id(src.id + 1) {}
int getId() const { return id; }
static UniqueNamed initial;
};
所以它取决于类的语义,而不是它的数据成员的类型。
这涉及复制、移动和归属的语义的一般概念,以及它们在 C++ 中的实现。您可能想阅读有关 rules of zero, three, and five 的内容.
(1) 当然,如果任何成员变量是不可复制的类型,而你希望你的类是可复制的,你必须自己提供复制构造函数,作为默认-声明的一个将被定义为已删除。
关于c++ - C++中的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30054152/