c++ - 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/

相关文章:

c++ - COM 对象的 SAFEARRAY

c++ - 如何在 C++ gSOAP 生成的类中使用 SSL

c++ - QT Creator "This does not seem to be a Debug build."调试

c++ - 如何定义 is_iterator 类型特征?

C++:调用哪个合适的构造函数:构造函数还是复制构造函数?

c++ - 为什么 C++ 中没有基类?

c++ - <iostream> 标准 :cout within function not printing (FIXED:for loop issue)

c++ - 运行 Google 测试后获取错误消息

c++ - 游戏菜单不工作 C++

c++ - 在 boost::signals 中, 'slot_type' 和 'slot_function_type' 有什么区别?