我很难形成一个我想问的问题,所以让我举个例子:
假设我们正在开发一个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; …Run Code Online (Sandbox Code Playgroud)