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