C++ C++;运算符和参数

C++ C++;运算符和参数,c++,operator-overloading,C++,Operator Overloading,假设我有一个课堂分数: class Point { int x, y; public: Point& operator+=(const Point &p) { x=p.x; y=p.y; return *this; } }; 为何我不能这样称呼: Point p1; p1 += Point(10,10); 还有什么方法可以做到这一点,同时仍然有一个引用作为论点 为何我不能这样称呼: Point p1; p1 += Point(10,10); 因为您忘记声明匹

假设我有一个课堂分数:

class Point {
    int x, y;
public:
    Point& operator+=(const Point &p) { x=p.x; y=p.y; return *this; }
};
为何我不能这样称呼:

Point p1;
p1 += Point(10,10);
还有什么方法可以做到这一点,同时仍然有一个引用作为论点

为何我不能这样称呼:

Point p1;
p1 += Point(10,10);
因为您忘记声明匹配的构造函数。除此之外,这个电话看起来不错


(另外,
运算符+=
中的代码是错误的:它会覆盖值,而不是进行加法)。

您的运算符代码非常好。您需要创建一个接受两个整数的构造函数:

class Point {
public:
  Point() : x( 0 ), y( 0 ) { }
  Point( int _x, int _y ) : x( _x ), y( _y ) { }
// rest of the code
};
请注意,如果您声明了一个构造函数,其中包含一些参数,那么为了进行实例化,例如
点x您需要自己声明一个默认构造函数


请看康拉德的回答。是的,您可能希望为您的成员使用
+=
而不是
=
。)

以下是您需要的代码:

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

正如康拉德指出的,你需要一个构造函数。您还需要在运算符重载中显式执行加法。

可能他没有执行加法,因为他不想使用当前未定义的值:)值得注意的是,还需要一个默认构造函数。@markh44:编译器将提供一个默认构造函数(虽然不是一个有用的构造函数)@Daniel不在+=操作中进行加法在技术上可能是可行的,但这是一个逻辑错误。Martin:是的,有一个默认构造函数,但前提是没有手动编写其他构造函数,这可能就是Mark的意思。如果剪切并粘贴上述代码,请不要忘记在构造函数声明后添加分号。