首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++类,朋友运算符与外部运算符的区别是什么?

C++类,朋友运算符与外部运算符的区别是什么?
EN

Stack Overflow用户
提问于 2012-01-19 21:39:49
回答 1查看 1.2K关注 0票数 0

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

但是,当该函数位于类之外,并且我们将其声明为类中的朋友,而不是定义它时,同样的任务也会被完成。

考虑这段代码,它有两个相同的操作符定义,其中一个在类中,另一个在类之外:

版本1(类内)

代码语言:javascript
复制
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;
}

版本2(类外)

代码语言:javascript
复制
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;
}

这两种方法有什么区别?

EN

回答 1

Stack Overflow用户

发布于 2012-01-19 22:11:00

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

通常,在类中定义主体的朋友函数也可以使用没有限定条件的类成员(这些成员可能是静态成员,可能在基类中,因为朋友函数中没有this指针)。

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

A函数在类的朋友声明中可以是defined当且仅当该类是一个非本地类(9.8),函数名是不限定的,并且该函数具有命名空间范围。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8933699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档