非成员朋友功能始终是内联的

Mol*_*y P 9 c++ inline friend

我是C++的新手,当我试图学习朋友函数时,我从Cppreference的朋友描述中看到:

2)(仅在非本地类定义中允许)定义非成员函数,并使其同时成为此类的朋友.这种非成员函数始终是内联的.

class X {
  int a;
  friend void friend_set(X& p, int i) {
    p.a = i; // this is a non-member function
  }
  public:
  void member_set(int i) {
      a = i; // this is a member function
  }
};
Run Code Online (Sandbox Code Playgroud)

这是否意味着所有朋友的功能必须始终是内联的?换句话说,朋友的功能必须完全在课堂内定义吗?

但是,我还发现了一个实例,其中友元函数在Cplusplus的类外定义

// friend functions
#include <iostream>
using namespace std;
class Rectangle {
  int width, height;
  public:
    Rectangle() {}
    Rectangle (int x, int y) : width(x), height(y) {}
    int area() {return width * height;}
    friend Rectangle duplicate (const Rectangle&);
};
Rectangle duplicate (const Rectangle& param)
{
  Rectangle res;
  res.width = param.width*2;
  res.height = param.height*2;
  return res;
}
Run Code Online (Sandbox Code Playgroud)

我对这场冲突感到很困惑.我对内联的理解是错误的吗?" 在类中定义的非成员朋友函数是自动内联的 "是什么意思?

Chr*_*odd 12

在类(成员或非成员朋友)中定义的任何函数始终是隐式内联的.这是因为类定义通常在头文件中,并且您不希望头文件中有任何非内联函数定义(如果头中的#included多于一个,则头中具有非内联函数会导致多个定义源文件).

如果希望函数是非内联函数,则需要在类定义之外定义它.如果它是一个成员或朋友,你仍然需要在类中声明它,因为必须在类中声明成员和朋友.你只是不希望它在课堂上定义.

这一切都进入了C++中定义声明之间的区别 - 它们是两个截然不同的东西,尽管每个定义也隐式地是一个声明,而不是每个声明都是一个定义.因此,当规范说"声明"时,它通常意味着"声明不是一个定义"