我为+重载定义了一个全局非成员方法
喜欢
ClassA operator+(const ClassA& a, const ClassB& b);
{
blah blah ;
}
在交际中,我可以使用
1)
ClassA operator+(const ClassB& b, const ClassA& a)
{
return operator+(a,b);
}
2)
ClassA operator+(const ClassB& b, const ClassA& a)
{
return a + b;
}
1和2之间有什么区别?
答案 0 :(得分:1)
除了@barakmanos在评论中首先指出的显而易见的差异(“第二个更具可读性”),还有另一个技术差异。
假设一秒钟,以下定义:
struct B;
struct A
{
void operator+(B const&) const { ::std::cout << "member\n"; }
friend void operator+(A const&, B const&) { ::std::cout << "friend\n"; }
};
struct B { };
现在,请考虑以下三个陈述:
operator+(A(), B());
A().operator+(B());
A() + B();
第一个显然叫朋友(免费)功能,第二个叫成员。但是,如果另一个没有定义,第三个将调用。在这种特殊情况下,它找不到更好的匹配,因此会形成错误。有几种方法可以修改此行为,例如如果成员函数在const
- 要求中不同,则表达式可能是正确的,只会导致更大的过载集。
这证明了两个表达式的区别:operator+(a,b)
只考虑自由函数而不是成员函数重载二元加运算符。
事实上,C ++标准有另一个例子:
A() + B()
仅执行与参数相关的查找,而operator+(A(), B())
执行常规函数查找。这意味着以下是一个错误(取自C ++11§13.3.1.2.10):
struct A { };
void operator + (A, A);
struct B {
void operator + (B);
void f ();
};
A a;
void B::f() {
operator+ (a,a); // error: global operator hidden by member
a + a; // OK: calls global operator+
}