c ++中的基本运算符重载语法

mus*_*bob 7 c++ operator-overloading operator-keyword

我很难形成一个我想问的问题,所以让我举个例子:

假设我们正在开发一个3d系统,我们已经定义了一个矢量类Vec3.我们重载一些算术运算符以获得明显的重复.其中我们重载*运算符,以便它返回两个向量的点积.现在我们的代码看起来像这样:

class Vec3{
private:
    float x, y, z;
public:
    float operator*(const Vec3&) const; //dot product
.
.
.
Run Code Online (Sandbox Code Playgroud)

现在说我们希望能够通过使用*运算符来扩展我们的向量,比如浮点数.这可以通过声明以下内容来完成:

    Vec3 operator*(const float) const;
    friend Vec3 operator*(const float, const Vec3&);
Run Code Online (Sandbox Code Playgroud)

这有两个重载,我想知道是否有办法只用一个,即我们声明这而不是上面两行:

    friend Vec3 operator*(const Vec3&, const Vec3&);
Run Code Online (Sandbox Code Playgroud)

然后为Vec3 ctor添加默认值以处理来自float的转换.

最后一个例子适用于:

    Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
Run Code Online (Sandbox Code Playgroud)

但不是为了这个:

    Vec3 someVec3 = otherVec3 * 1.0;
Run Code Online (Sandbox Code Playgroud)

因为编译器不知道要使用哪两个:

    friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
    float operator*(const Vec3&) const; //the one for the dot product
Run Code Online (Sandbox Code Playgroud)

有什么建议?

谢谢!

Mar*_*k B 5

在这种情况下,我最初建议不要对运算符进行重载,因为您的用户如何知道是否*代表点或交叉产品(两者都是合理的含义,取决于预期的客户端使用).我实际上建议不要支持operator*和做dot,cross以及scale成员.然后,您不必担心多次重载,并且您的用户可以清楚地知道他们正在获得什么.

但是,如果你想继续操作,那么有两个重载是没有错的.创建一个虚拟Vec3来进行缩放不仅在语义上不正确,而且会增加少量不必要的开销.