Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类运算符重载_C++_Class_Overloading - Fatal编程技术网

C++ 类运算符重载

C++ 类运算符重载,c++,class,overloading,C++,Class,Overloading,这是一个非常基本的运算符重载问题。 比如说我上过这样的课 class xy { public: double x, y; XY(double X, double Y) { x = X; y = Y;} XY operator+(const XY & add) const { return XY(this->x + add.x, this->y + add.y); } XY & operator+=(con

这是一个非常基本的运算符重载问题。 比如说我上过这样的课

class xy
{
    public:
    double x, y;
    XY(double X, double Y) { x = X; y = Y;}
    XY operator+(const XY & add) const {
        return XY(this->x + add.x, this->y + add.y);
    }
    XY & operator+=(const XY & add) const {?}
    }
}
我想让操作符+=做它应该做的事情(你知道,加上x和y的当前值)。运算符+和运算符+=”的代码是否相同?

是的,执行添加操作(坚持使用
+=
运算符),然后返回对自身的引用。哦,这不可能是一个
const
方法

XY & operator+=(const XY & add) {
   this->x += add.x;
   this->y += add.y;
   return *this;
}
是的,执行add操作(坚持使用
+=
操作符),并返回对自身的引用。哦,这不可能是一个
const
方法

XY & operator+=(const XY & add) {
   this->x += add.x;
   this->y += add.y;
   return *this;
}

否。通常,
运算符+
将结果存储在新对象中并按值返回,而
运算符+=
将右侧添加到
*此
并通过引用返回
*此


这两个运算符是相关的,通常可以彼此实现,但它们具有不同的语义,因此不能有相同的实现。

否。按照惯例,
运算符+
将结果存储在新对象中,并按值返回,而
操作符+=
将右侧添加到
*this
并通过引用返回
*this


这两个操作符是相关的——通常可以彼此实现——但它们的语义不同,因此不能有相同的实现。

怎么可能相同?他们做不同的事情

如果您不关心优化,可以在
+
操作符实现中使用
+=

XY operator + (const XY& right) const
{
    XY left(*this);
    left += right;
    return left;
}

怎么会是一样的呢?他们做不同的事情

如果您不关心优化,可以在
+
操作符实现中使用
+=

XY operator + (const XY& right) const
{
    XY left(*this);
    left += right;
    return left;
}

哈哈,当我试图更改“this”指向的任何东西时,“const”把我搞砸了哈哈,当我试图更改“this”指向的任何东西时,“const”把我搞砸了,只要你将它们声明为内联函数(就像它们在类中定义时自动发生的那样)它甚至不应该降低性能。@LeftAround它取决于复制构造函数的实现。调用默认构造函数并手动构造值可能会更快。对。我指的是这个只有两个双变量的特定类,其中默认构造函数+手动赋值不应该比复制构造函数快。当然,这并不适用于所有类。只要将它们声明为内联函数(就像它们在类中定义时自动声明),它甚至不会降低性能。@LeftAround它取决于复制构造函数的实现。调用默认构造函数并手动构造值可能会更快。对。我指的是这个只有两个双变量的特定类,其中默认构造函数+手动赋值不应该比复制构造函数快。当然,这并不适用于所有类。我喜欢本教程:我建议使用boost操作符库来实现这种操作符重载。它允许您定义最小操作集(+=在本例中),然后自动填充其他操作集(如运算符+)。我喜欢本教程:我建议使用boost运算符库来实现这种运算符重载。它允许您定义最小操作集(+=在本例中),然后自动填写其他操作集(如运算符+)。