规范形式的+ =运算符用于类

时间:2009-05-16 20:22:11

标签: c++ operators canonical-form

我知道尽可能多地创建一个类非成员非朋友的界面是个好主意,我刚刚意识到对于我的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;
}

3 个答案:

答案 0 :(得分:2)

你对我看起来很好。

顺便说一句,当你来到运营商+时,通常用+ =来实现。 (创建lhs的副本,然后调用lhs + = rhs并返回结果)

不知道你是否已经意识到这个技巧,但是由于你担心实现这些操作符的规范方法,所以提起它并不会有什么坏处。 :)

答案 1 :(得分:1)

你看起来很棒。

直观地思考这个问题的基本方法是考虑编写代码时的代码。在这种情况下,如果你可以写

Vector v, w;

v += w;
w += v;

依此类推,你走在正确的轨道上。

有很多好的经验法则可以提供帮助;请参阅C ++常见问题解答中的this entry

答案 2 :(得分:0)

我不会说“尽可能多的接口”。将operator+=operator-=等作为非朋友非成员,并没有多少收获。

有些人倾向于使每个功能成为非成员非朋友功能,以抵制使用私有成员变量的诱惑。但您是成年人:您可以将该函数编写为公共成员,而不是使用私有成员变量。我更喜欢知道该函数与类绑定,并使其成为公共成员使其明确。

除了注意:
就个人而言,我发现使用私人成员而不是公共访问者通常是可以的(我知道 - 我会在地狱中燃烧)。不总是! - 但经常 实际上,如果您确定需要,几乎没有几分钟您无法以分钟的方式切换到公共访问者。但我认识到这不是一种流行的观点,我不会要求人们遵循这一理念。

有明确的理由使确定功能和操作员“非朋友,非会员”。例如,当用作“流插入运算符”时,运算符<<()不能成为成员,因为您必须更改lhs类(流)。