代码之家  ›  专栏  ›  技术社区  ›  Ben Hymers

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

  •  4
  • Ben Hymers  · 技术社区  · 16 年前

    我知道尽可能多地使用类的非成员非友元接口是一个好主意,我刚刚意识到对于我的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 回复  |  直到 16 年前
        1
  •  2
  •   Stack Overflow is garbage    16 年前

    你所拥有的对我来说很好。

    顺便说一句,当您使用运算符+时,通常会使用+=来实现它。(创建lhs的副本,然后调用lhs+=rhs并返回结果)

    不知道您是否已经知道这个技巧,但是由于您关心实现这些操作符的规范方法,所以一提到它就不难了。:)

        2
  •  1
  •   chrisb2244    10 年前

    你的东西看起来不错。

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

    Vector v, w;
    
    v += w;
    w += v;
    

    等等,你走对了。

    有很多好的经验法则可以帮助;看 this entry 在C++FAQ中对其进行大量的FAQ。

        3
  •  0
  •   Euro Micelli    16 年前

    我不会说“尽可能多的接口”。没有什么可以通过制造 operator+= , operator-= 等。不是朋友不是成员。

    有些人喜欢让每个函数都成为可能的非成员非友元函数,以抵御使用私有成员变量的诱惑。但您是成年人:您可以将函数作为公共成员编写,而不使用私有成员变量。我更愿意知道该函数与类绑定,并将其作为公共成员使其显式化。

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

    有具体的理由 确定性 函数和运算符“非友元,非成员”。例如,当用作“流插入运算符”时,运算符<<()。 不能 成为成员,因为您必须更改lhs类(流)。

    推荐文章