只实现拷贝构造函数,没有赋值构造函数

只实现拷贝构造函数,没有赋值构造函数

问题描述:

当有一个成员是一个指针的类时,我们需要为它实现一个拷贝构造函数。我有一个问题,如果我们已经实现了一个拷贝构造函数,我们是否也应该实现一个赋值构造函数呢?只实现拷贝构造函数,没有赋值构造函数

最好的问候,

+0

将指针指定为成员只需要您覆盖默认的复制/分配行为*(如果指针对象在逻辑上是对象*的成员)。我敢肯定,有很多迭代器有指针作为成员,没有用户定义的副本/赋值。 :) – sellibitze 2010-06-21 10:01:12

这不叫的分配构造而是一个赋值运算符,是的你应该。经验法则是:如果你需要编写析构函数,那么你还应该提供一个拷贝构造函数和赋值操作符(或者阻止编译器生成一个)

+2

+1提到“阻止编译器生成一个”。它总是一个选项。 – SadSido 2010-06-21 07:40:54

+0

经验法则,这是相当古老的,不应该在两个方向从字面上。在某些情况下,您应该编写复制构造函数和赋值运算符,并且不必手动编写析构函数 - 但是销毁并不重要。 – 2010-06-21 07:59:30

另一个选择是使用一些适合你的任务的智能指针。通过选择正确的智能指针,您可以依靠编译器生成的析构函数,复制构造函数和赋值运算符(并且不会自行编写)...

+1

智能指针有助于处理破坏,而不是施工。考虑一个通过(智能)指针存储数据的类。 'shared_ptr'只会帮助你释放一次数据(当最后一个引用超出范围时),所以破坏很好。问题在于副本的更改会影响原稿 - 副本会很浅。 – 2010-06-21 07:55:02

+0

好点。无论如何,我可以想象一个智能指针,当指针本身被复制时,它会创建一个对象的副本。这就是为什么我提到“适合你的任务”...... =) – SadSido 2010-06-21 11:24:44

每当类有一个动态分配内存的成员变量时,每个人都应该实现以下

  1. 拷贝构造函数
  2. 赋值运算符
  3. 析构函数

注意:如果指针变量是静态的,则不需要全部这些。

+0

不只是记忆。如果班级负责管理任何类型的资源,则应该实施这三种资源。 (或者声明他们是“私人的”:) – MSalters 2010-06-21 11:59:45