成员与非成员运营商重载

时间:2013-12-15 21:54:09

标签: c++ operator-overloading

我试图理解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个成员?

3 个答案:

答案 0 :(得分:1)

此行宣布op+为非会员朋友。这意味着尽管它是非会员,但它可以看到Imaginary的私人会员。

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

运营商的实施将在课外。

答案 1 :(得分: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);

答案 2 :(得分:0)

这两个运营商之间存在很大差异

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

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

在第一个类成员运算符中,左操作数始终是Imaginary类型。第二个操作数可以是double类型,因为有转换构造函数

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

允许隐式地将double值转换为Imaginary类型的对象。

friend运算符允许指定一个double数作为操作的第一个操作数。再次,如果将一个双数字指定为第一个操作数,则将调用转换构造函数,实际上您将获得表达式

虚构+虚构。

因此,friend运算符附加了类成员运算符,允许使用以下表达式

Imaginary + Imaginary // class member operator will be called
Imaginary + double// class member operator will be called
double + Imaginary // the friend operator will be called