4

我知道尽可能多地利用类非成员非朋友的接口是个好主意,而且我刚刚意识到对于我的 3D 矢量类“Vector3”,我可以移动 +=, -= 等运算符在类之外,只留下构造函数和复制赋值运算符。

问题是:这个操作符应该是什么样的?我见过许多其他运算符的规范形式并遵循了他们的建议,但我还没有看到这些运算符的规范形式。我已经给出了我认为应该在下面的内容。

第二个问题是:这些运算符到底叫什么?算术赋值运算符?

之前的(相关)代码:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

到目前为止,我已将其更改为:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
4

3 回答 3

2

你所拥有的对我来说看起来不错。

顺便说一下,当你谈到 operator+ 时,通常用 += 来实现它。(创建一个lhs的副本,然后调用lhs += rhs并返回结果)

不知道您是否已经知道这个技巧,但是由于您关心实现这些运算符的规范方法,因此提及它并没有什么坏处。:)

于 2009-05-16T20:41:21.940 回答
1

你所拥有的看起来不错。

直观地考虑这一点的基本方法是在编写代码时考虑您希望代码的外观。如果,在这种情况下,你可以写

Vector v, w;

v += w;
w += v;

等等,你在正确的轨道上。

有很多好的经验法则可以提供帮助;请参阅C++ 常见问题解答中的此条目以获取更多信息。

于 2009-05-16T20:44:01.780 回答
0

我不会说“尽可能多的界面”。operator+=让等operator-=成为非朋友非会员并没有什么好处。

有些人更喜欢让每个函数都成为非成员非友元函数,以抵制使用私有成员变量的诱惑。但是你是个成年人:你可以把函数写成公共成员,而不是使用私有成员变量。我更愿意知道该函数与类相关联,并将其设为公共成员使其显式。

旁注:
就个人而言,我发现使用私有成员而不是公共访问器通常是可以的(我知道——我会在地狱中燃烧)。不总是!——但经常。
事实上,如果您决定需要它,在少数情况下您无法在几分钟内切换到公共访问器。但我承认这不是一个流行的观点,我不要求人们遵循这种哲学。

确定函数和运算符“非朋友、非成员”是有具体原因的。例如,当用作“流插入运算符”时,不能将 operator<<() 设为成员,因为您必须更改 lhs 类(流)。

于 2009-05-16T20:43:40.703 回答