操作员覆盖 - 何时使用朋友?

时间:2012-10-06 23:15:47

标签: c++ friend

我想知道为什么()运算符覆盖不能是“朋友”(所以它需要一个“this”附加参数),而+运算符需要像下面的例子中那样是朋友:

class fnobj
{
    int operator()(int i);
    friend int operator+(fnobj& e);
};

int fnobj::operator()(int i)
{

}

int operator+(fnobj& e)
{

}

我知道+运算符需要成为朋友以避免额外的参数,但为什么operator()不需要呢?

2 个答案:

答案 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,这将允许函数使用类的私有成员(一般不允许这样做)免费功能)。