当我们在一个类中定义一个运算符函数时,我们也在一个类中定义它,那么这个函数就不是类的一部分。
但是,当该函数位于类之外,并且我们将其声明为类中的朋友,而不是定义它时,同样的任务也会被完成。
考虑这段代码,它有两个相同的操作符定义,其中一个在类中,另一个在类之外:
版本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;
}版本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;
}这两种方法有什么区别?
发布于 2012-01-19 22:11:00
在您的示例中,两个版本都执行相同的操作(实际上,返回一个悬空引用会导致未定义的行为),尽管其中一个是inline,两个不是。
通常,在类中定义主体的朋友函数也可以使用没有限定条件的类成员(这些成员可能是静态成员,可能在基类中,因为朋友函数中没有this指针)。
以下是标准中的相关文本(第11.3节[class.friend]):
A函数在类的朋友声明中可以是defined当且仅当该类是一个非本地类(9.8),函数名是不限定的,并且该函数具有命名空间范围。
这样的函数是隐式的inline。类中定义的friend函数位于其所属类的(词法)范围内。类外定义的friend函数不是(3.4.1).。
https://stackoverflow.com/questions/8933699
复制相似问题