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