C++类,友元运算符与外部运算符有什么区别

cod*_*ddy 0 c++ class friend operator-keyword

当我们在类中定义运算符函数时,我们也在类中定义了它,那么该函数就不是类的一部分。

但当该函数位于类外部并且我们将其声明为类内部的友元但不定义它时,也会实现相同的任务。

考虑一下这段代码,它有两个相同的运算符定义,其中一个在类内部,另一个在类外部:

版本 1(在类内部)

class MyClass
{
    // version 1 inside a class
    friend MyClass&& operator +(MyClass& a, MyClass& b)
    {
        return move(MyClass(a.x + b.x, a.y + b.y));
    }
    int x,y;

public:
    MyClass() {}
    MyClass(int,int){}
};

int main()
{
    MyClass a, b, c;
    c = a + b;
    cin.ignore();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

版本 2(在类之外)

class MyClass
{
      friend MyClass&& operator +(MyClass& a, MyClass& b);
    int x,y;

public:
    MyClass() {}
    MyClass(int,int){}
};

MyClass&& operator +(MyClass& a, MyClass& b)
{
    return move(MyClass(a.x + b.x, a.y + b.y));
}

int main()
{
    MyClass a, b, c;
    c = a + b;
    cin.ignore();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

Ben*_*igt 5

在您的情况下,两个版本都执行相同的操作(实际上返回悬空引用,导致未定义的行为),尽管一个是inline,两个不是。

\n\n

this一般来说,其主体在类中定义的友元函数也可以无条件地使用类成员(这些成员将是静态成员,可能在基类中,因为友元函数中没有指针)。

\n\n

以下是标准中的相关文本(第 11.3 节[class.friend]):

\n\n
\n

当且仅当该类是非本地类 (9.8)、函数名未限定且函数具有命名空间作用域时,才可以在类的友元声明中定义函数。

\n\n

这样的函数是隐式的inline。类中定义的函数friend位于它所在类的(词法)范围内。在类外部定义的函数friend不是 (3.4.1)。

\n
\n