gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:44 29 4
gpt4 key购买 nike

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

假设我们正在开发一个 3d 系统,我们在其中定义了一个 vector 类 Vec3。我们为了明显的原因重载了一些算术运算符。其中,我们重载了 * 运算符,以便它返回两个 vector 的点积。现在我们的代码应该看起来像这样:

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

现在假设我们希望能够通过将 * 运算符与某些东西(比如 float )一起使用来缩放我们的 vector 。这可以通过声明以下内容来完成:

    Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);

这产生了两个重载,我想知道是否有一种方法可以只用一个重载,也就是说我们声明这个而不是上面的两行:

    friend Vec3 operator*(const Vec3&, const Vec3&);

然后为 Vec3 构造器添加默认值以处理从 float 的转换。

最后一个示例适用于:

    Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)

但不是为了这个:

    Vec3 someVec3 = otherVec3 * 1.0;

因为编译器不知道使用两者中的哪一个:

    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

有什么建议吗?

谢谢!

最佳答案

在这种情况下,我最初建议不要重载运算符,因为您的用户如何知道 * 代表点积或叉积(两者都是合理的含义,具体取决于预期的客户使用)。实际上,我建议不支持 operator*,而是使用 dotcrossscale 成员。这样您就不必担心多重过载,而且您的用户可以清楚地知道他们得到了什么。

但是,如果您确实想继续使用运算符,那么有两个重载也没有错。创建一个虚拟的 Vec3 来进行缩放不仅在语义上不正确,还会增加少量不必要的开销。

关于c++ - C++ 中的基本运算符重载语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164461/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com