三行代码  ›  专栏  ›  技术社区  ›  Descode

如何实现该程序的复制构造函数?

  •  -2
  • Descode  · 技术社区  · 3 月前
    #include <iostream>
    
    using namespace std;
    
    class Point{
    private: 
      int x, y;
    public:
      Point(int x, int y) { this->x = x; this->y = y } 
      Point(const Point &p) { x = p.x; y = p.y; }
    
      int getX(void) { return x; }
      int getY(void) { return y; }
    };
    
    int main(){
        Point myPt(1,2);
        Point myPt2 = myPt;
    
        cout << myPt.getX() << " " << myPt.getY() << endl;
        cout << myPt2.getX() << " " << myPt2.getY() << endl;
        
      return 0;
    }
    

    我想将myPt2设置为不同的值,同时保持myPt值不变,即使在将myPt2设置为等于myPt后也是如此(这样做时会出现重新定义错误)。例如,点myPt(1,2);点myPt2=myPt。。。。打印输出,然后设置myPt2(5,5)并再次打印语句:我想要输出12\n5。

    2 回复  |  直到 3 月前
        1
  •  0
  •   Ranoiaetep    3 月前
    如果我理解正确,您正在寻找一种方法,使以下代码正常工作:
    int main(){
        Point myPt(1,2);
        Point myPt2 = myPt;
        myPt2(5, 5);
    
        cout << myPt.getX() << " " << myPt.getY() << endl;    // prints "1 2"
        cout << myPt2.getX() << " " << myPt2.getY() << endl;  // prints "5 5"
    }
    

    允许语法 myPt2(5, 5) ,您必须让呼叫接线员超负荷工作, operator() ,以接受2个整数:

    class Point {
      ⋮
    public:
      void operator()(int x, int y)
      {
          this->x = x; this->y = y;
      }
      ⋮
    };
    


    然而,我强烈建议不要采用这种方法。相反,当您想将值重新分配给 myPt2 ,您确实应该使用以下语法调用复制分配运算符:

    myPt2 = Point(5, 5);
    

    要编写自己的复制分配操作符,它将类似于:

    class Point {
      ⋮
    public:
      Point& operator=(const Point &p)
      {
          x = p.x;
          y = p.y;
          return *this;
      }
      ⋮
    };
    

    事实上,根据类的功能,实际上不需要编写复制构造函数或复制赋值运算符。这就是你所需要的:

    class Point{
    private: 
      int x, y;
    public:
      Point(int x, int y) { this->x = x; this->y = y; } 
    
      int getX(void) { return x; }
      int getY(void) { return y; }
    };
    

    任何类型的复制构造都将自动完成。如果您有不可复制的成员,或者您正在寻找一些自定义复制行为,例如深度复制指针,那么实际上只需要定义自己的复制构造函数。

        2
  •  0
  •   Chris Dodd    3 月前

    你的程序已经有了一个副本构造函数-- Point(const Point &p) --用于从另一个点对象构造新的点对象。

    要更改现有的点对象,需要使用“复制指定”操作符。您可以在Point类中将其定义为:

    Point &operator=(const Point &p) { x = p.x; y = p.y; return *this; }
    

    甚至只是

    Point &operator=(const Point &) = default;