我试图理解C ++中的运算符重载,并且遇到了这段代码:

class Imaginary {
    double re,im ;
    public:
    Imaginary ( double r, double i=0 ) : re(r), im(i) {}

    Imaginary operator - ( void ) const;                // member
    Imaginary operator + ( const Imaginary& x ) const;  // member

    friend Imaginary operator + ( double a, const Imaginary& b ); // non-member ?
};


应该显示non-member重载的用法。但是我不明白在类内部声明它是非成员的吗?还是它取决于参数的数量,因为+是二进制操作,因此对于2个参数,它被视为非成员,而对于1个成员,它被视为非成员?

最佳答案

friend声明被注入到类定义所在的名称空间中。也就是说,声明(在以后的说明中添加了名称空间):

namespace foo {
    class Imaginary {
        // ...
        friend Imaginary operator+ (double a, Imaginary const& b);
    };
}


实际上有两件事:它声明一个函数,并声明允许该函数访问类Imaginary的所有成员。声明的函数是

foo::Imaginary foo::operator+ (double a, foo::Imaginary const& b);

关于c++ - 成员与非成员运算符重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20600288/

10-11 23:08