类数据的重载+运算符

时间:2015-02-19 04:29:12

标签: c++ operator-overloading

假设我有以下基本类,我想重载operator +:

class foo {
private:
    arbitrary datatype

public:
    foo() { set private data; };
    virtual ~foo() {};

};

我一直使用这种格式:

foo operator+( const foo &rhs );

但是,我最近偶然发现了一些人专用的代码:

friend foo operator+( const foo &lhs, const foo &rhs );

那么,使用一个版本而不是另一个版本是标准的吗?是否存在强制进入一个版本的情况(这仅用于添加相同的对象类型)?我不熟悉汇编语言,但编译器是否会将这些语言转换为相同的指令列表(这个问题显然取决于前两个问题的答案)?

1 个答案:

答案 0 :(得分:3)

  1. 回答您的前两个问题

    建议(但不强制执行)对二元运算符使用friend方法,因为它允许在运算符的左侧具有可转换为类的对象。考虑一下:

    class Foo
    {
        // private members
    public:
        Foo(int) {/* ctor implementation */} // implicit convertible to int
        Foo(const Foo&) { /* copy ctor implementation */ }
        friend Foo operator+(const Foo& lhs, const Foo& rhs){/* implementation */}
    };
    

    现在你可以做到:

    Foo foo1{1};
    Foo foo2 = 1 + foo1; // 1 is implicitly converted to Foo here
    

    如果operator+成为成员函数,则上面的调用将失败(左侧,即使可转换为Foo,也不会被编译器自动转换),并且您&#39 ; d只能使用

    Foo foo2 = foo1 + 1;
    

    因此,总而言之,对二元运算符使用friend会使它们更加“对称”#34;

  2. 上一个问题:

    汇编程序不会生成相同的代码,因为朋友/成员operator+做的事情略有不同。

  3. 另请参阅关于重载运算符here非常良好指南。