我想知道为什么()运算符覆盖不能是“朋友”(所以它需要一个“this”附加参数),而+运算符需要像下面的例子中那样是朋友:
class fnobj
{
int operator()(int i);
friend int operator+(fnobj& e);
};
int fnobj::operator()(int i)
{
}
int operator+(fnobj& e)
{
}
我知道+运算符需要成为朋友以避免额外的此参数,但为什么operator()不需要呢?
答案 0 :(得分:4)
您已经超载了一元加运算符。你可能不想这样做。它不会添加两个对象,它描述了当+
出现在它之前如何解释单个对象,与int x = +10
将被解释相同。 (它的解释与int x = 10
)
对于添加运算符,“+运算符需要成为朋友”是不正确的。
以下是添加两个fnobj
对象的两种方法:
int operator+(fnobj& e);
friend int operator+(fnobj& left, fnobj& right);
在第一种形式中,this
被假定为+
左侧的对象。所以这两种形式都有效地采用了两个参数。
所以要回答您的问题,而不是认为“operator()不需要friend
”,请将其视为“operator()需要this
”或更好的是,“将对象视为一个函数需要一个对象”。
答案 1 :(得分:2)
您没有正确理解这一点(也没有正确使用它)。
C ++中有两种方法可以为类定义二元运算符,或者作为成员函数
class A
{
public:
int operator+ (A const& other);
};
或作为免费功能
class A {};
int operator+ (A const& lhs, A const& rhs);
你目前正在混淆的是你可以在类范围内声明和定义这个自由函数friend
,这将允许函数使用类的私有成员(一般不允许这样做)免费功能)。