运算符覆盖 - 何时使用好友



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

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

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

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

对于加法运算符,"+ 运算符需要是朋友"是不正确的。

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

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

在第一种形式中,this被假定为+左侧的对象。 因此,这两种形式实际上都采用两个参数。

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

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

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

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

或作为免费功能

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

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

最新更新