我怎样才能为这个程序实现一个复制构造函数?

How can I implement a copy constructor to this program?

#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);点 m​​yPt2 = myPt; ....打印输出,然后设置 myPt2(5, 5) 并再次打印语句:我想要输出 1 2 \n5 5.

如果我对你的理解正确,你正在寻找一种方法来使下面的代码工作:
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 所做的,您确实不需要编写复制构造函数或复制赋值运算符。这就是您所需要的:

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; }
};

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

您的程序已经有一个复制构造函数 -- Point(const Point &p) -- 用于从另一个 Point 对象构造一个新的 Point 对象。

要更改现有的 Point 对象,您需要复制赋值运算符。您可以在点 class 中将其定义为:

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

甚至只是

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