我怎样才能为这个程序实现一个复制构造函数?
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);点 myPt2 = 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;
#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) 并再次打印语句:我想要输出 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;