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


#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值不变,即使在将myPt设置为myPt之后也是如此(这样做时会出现重新定义错误(。例如,点myPt(1,2(;点myPt2=myPt。。。。打印输出,然后设置myPt2(5,5(并再次打印语句:I want the output 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 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; }
};

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

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

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

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

甚至只是

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

相关内容

最新更新