如何在类包含指针时创建复制构造函数

时间:2018-02-17 09:52:46

标签: c++ copy-constructor

我有复制构造函数概念的问题。我写了一个这样的例子:

struct f1
{
     string x;
     string y;
     f1();
     ~f1();
};
struct f2
{
    int a;
    string b;
    f1 *ff;
    f2();
    ~f2();
};
class myclass{
    f2 *obj;
}

我发现struct f2应该有一个拷贝构造函数,因为该类包含一个指向已分配内存的指针。但我不知道应该如何创造它。

2 个答案:

答案 0 :(得分:0)

你有很多选择:

主要二:

  1. 只需复制指针(浅层复制),只需不编写构造函数,它就是隐式的,或者你可以写(在struct f2中)。

    f2(const f2 &original): f1(original.f1), a(original.a), b(original.b) { }
    
  2.   

    警告: 这将 NOT 复制f1成员变量的值。它只会复制引用,这会使f2.f1 s 引用到同一个f1对象。

    f2 a;
    ...
    f2 b(a); // Invokes the "copy" constructor
    a.f1->x = "Something here";
    std::cout << b.f1->x; // Will print "Something here"
    
    1. 制作深层副本,调用f1的复制构造函数,并将新创建的副本分配到this->f1

      ,将其分配给struct f2
      f2(const f2 &original): f1(new f1(*original.f1)), a(original.a), b(original.b) { }
      

      另外一位评论者建议,您必须也会进行复制分配,因为您制作了一个复制构造函数(例如,如果您的对象是不可变的,则除外)

      f2 &operator=(const f2 &other) {
          if (this == &other) return; // If "self-assignment" just return.
      
          if (f1) { delete f1; } // Deletes the old one if any.
                                 // The advisable alternative is to use
                                 //    a smart pointer
          f1 = new f1(*other.f1);
          a = other.a;
          b = other.b;
          return *this;
      }
      
    2. 无论如何,您应该考虑使用智能指针unique_ptrshared_ptrweak_ptr,因为原始指针可能会导致很多错误。但智能指针(部分)为您管理内存,让您有更多机会思考您的逻辑。一些现代C ++程序员说你应该很少使用delete,智能指针会做这项工作

答案 1 :(得分:-2)

它几乎是一个普通的构造函数,它将自己类型的实例作为参数

f2(const f2& other):a(other.a),b(other.b),ff(new f1()){
    memcpy(ff,other.ff,sizeof(f1));//makes copy of ff
}