如果我们在类内部或外部定义友元函数,是否有任何区别

时间:2013-11-21 07:14:28

标签: c++

在类中定义友元函数或在内部声明和在类外部定义之间有什么区别。另外,为什么可以在类中放置定义,因为友元函数不是类的成员。

6 个答案:

答案 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 ++中使用友人概念,请在私有类之外声明它。