繁体   English   中英

成员与非成员运营商重载

[英]Member vs Non-member 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个成员?

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

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

运营商的实施将在课外。

friend声明注入到它所出现的类定义周围的命名空间中。 也就是说,声明(命名空间添加到后面的澄清):

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

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

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

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

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运算符附加类成员运算符,允许以下表达式

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM