以vector、list或map为成员的类需要复制构造函数

Are copy constructors required for classes which have vector, list or map from the stl as members

本文关键字:构造函数 复制 成员 vector list map      更新时间:2023-10-16

我正在编写一个使用stl类映射作为成员的类。我在课堂上没有指针。我是否需要编写一个自定义的复制构造函数,或者默认的复制构造函数可以正常工作?

看完答案后,我添加了一些更多的信息。我有静态const变量,但它们在构造过程中没有初始化。我没有参考成员。其他都是64位整数。我还有一个map迭代器作为类中的成员。

默认复制构造函数将始终有效(它只是调用所有类成员的复制构造函数)。

一般来说,唯一可能出现问题的时候是当你使用带有重要构造/析构的成员时(如管理全局资源的对象,如文件/内核服务的文件描述符和内存指针),这些成员将(并且需要)被析构函数清除,并由复制构造函数重新分配。

我知道一些优化可以使复制构造函数更快,如果你实现它,但他们真的不是必要的。

指针成员并不是这里唯一会引起问题的东西。有几个因素可能要求您使用自定义复制构造函数,包括但不限于:

  • 引用成员,因为它们需要显式初始化
  • const成员变量,原因相同
  • 不提供复制构造函数的类型的任何成员变量

c++中有一种方法可以禁止复制特定类型的对象。包括STL在内的编写良好的库只允许类型是可复制的,如果它是安全的,并且对该类型有意义。因此,如果您可以复制它(编译器不会生成错误),那么它是安全的。在您自己的程序中遵循这一点是一个很好的实践,即使它不是那么大。

默认的复制构造函数就可以了。