为什么在 Vector3D class 中相同的操作有两种不同类型的运算符重载?

Why are there two different types of operator overloading for the same operation in Vector3D class?

我在审查某人的代码时想出了两个有趣的运算符重载方法。我不完全清楚为什么编码人员必须编写第二种方法。

第一个:

inline Vector3D operator-(const Vector3D &a, const Vector3D &b) {
        return Vector3D(a.getX() - b.getX(), a.getY() - b.getY(), a.getZ() - b.getZ());
    }

第二个:

inline Vector3D operator-(const Vector3D &a) {
        return Vector3D(-a.getX(), -a.getY(), -a.getZ());
    }

我明白第一种方法在这里做什么,但是第二种方法有必要吗?如果是,它有什么作用?

第二个是一元运算符。它允许您取反矢量,将其反射到原点到相反的八分圆。

如果我们猜测class有一个合理的构造函数和拷贝构造函数,那么:

Vector3D v( 1,1,1 );
Vector3D negatedV = -v;