2

我想知道为什么 () 运算符覆盖不能是“朋友”(因此它需要一个“this”附加参数),而 + 运算符需要是朋友,如下例所示:

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

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

}

int operator+(fnobj& e)
{

}

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

4

2 回答 2

4

您已经重载了一元加号运算符。你可能不想那样做。它不添加两个对象,它描述了当 a+出现在单个对象之前时如何解释单个对象,与int x = +10将被解释的相同。(其解释与 相同int x = 10

对于加法运算符,“+ 运算符需要成为朋友”是不正确的。

以下是添加两个fnobj对象的两种方法:

int operator+(fnobj& e);
friend int operator+(fnobj& left, fnobj& right);

在第一种形式中,this假定为 . 左侧的对象+。所以这两种形式都有效地采用了两个参数。

因此,要回答您的问题,不要认为“operator() 不需要friend”,而是将其视为“operator() 需要this”,或者更好的是,“将对象视为函数需要对象”。

于 2012-10-06T23:28:57.080 回答
2

您没有正确理解这一点(也没有正确使用它)。

在 C++ 中有两种方法可以为类定义二元运算符,或者作为成员函数

class A
{
public:
    int operator+ (A const& other);
};

或作为自由功能

class A {};

int operator+ (A const& lhs, A const& rhs);

您目前混淆的是,您可以在类范围内声明和定义这个自由函数 as friend,这将允许该函数使用类的私有成员(这对于自由函数通常是不允许的)。

于 2012-10-06T23:33:03.733 回答