在类中定义友元函数或在内部声明和在类外部定义之间有什么区别。另外,为什么可以在类中放置定义,因为友元函数不是类的成员。
答案 0 :(得分:5)
只要在类中声明了friend函数(它必须是), 它的定义无关紧要。
此外,在类中定义friend
函数也会隐式地生成函数inline
。
另外(来自C ++ 11规范,§11.3/ 7):
类中定义的友元函数位于(词法)范围内 定义它的类。在课外定义的朋友函数不是
答案 1 :(得分:5)
在类中定义的朋友函数只能在从类外部调用时通过ADL查找。即使没有ADL,也可以找到在类外定义的函数。
答案 2 :(得分:0)
如果你在类中定义它是内联的,如果它在外面那么它就不是。
答案 3 :(得分:0)
如果和,可以在类的朋友声明中定义函数 只有当类是非本地类时,函数名才是 不合格,并且该函数具有命名空间范围。这样的功能是 隐式内联。在类中定义的友元函数在 (词汇)定义它的类的范围。朋友的功能 在课外定义的不是。
C ++ 11,[class.friend],¶6-7
答案 4 :(得分:0)
以下有关成员访问的隐含含义。
C ++ 11§11.4/ 5
在类中定义的朋友功能在的(词汇)范围内 定义它的类。定义在 类不是(3.4.1)。
从C ++ 17§14.3/ 7起仍然存在
此类函数隐式为内联函数(10.1.6)。一个朋友 在一个类中定义的函数在该类的(词法)范围内 它是定义的。在类外定义的朋友函数是 不是(6.4.1)。
请考虑来自cppreference [朋友函数定义]的简要示例,其中f1
查找类的静态成员,f2
查找全局变量。
int i = 3;
struct X {
friend void f1(int x) {
i = x; // finds and modifies X::i
}
friend inline void f2(int);
static const int i = 2;
};
inline void f2(int x) {
i = x; // finds and modifies ::i
}
当然,这不会影响对设计朋友功能的设计。选择之间的主要考虑因素是名称查找方面的差异,如the other答案中已经提到的。不要忘记f2
的内联匹配默认暗示的f1
的内联。
答案 5 :(得分:0)
在类内定义朋友功能是不恰当的。
我们使用friend函数将对类的私有成员的访问权限授予该函数。
如果我们在类内部定义了朋友函数,那么它以某种方式成为该类的数据成员,并且我们知道自己类的数据成员可以访问其私有成员。
因此,如果您真的想在C ++中使用友人概念,请在私有类之外声明它。