我对C ++很陌生,当我试图学习朋友功能时,我从friend description on 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
}
};
这是否意味着所有朋友的功能必须始终内嵌?换句话说,朋友的功能必须完全在课堂内定义吗?
但是,我还发现了一个实例,其中在Cplusplus
的类之外定义了friend函数// 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;
}
我对这场冲突感到很困惑。我对内联的理解是错误的吗? “a nonmember friend function defined inside the class is automatically inline”是什么意思?
答案 0 :(得分:12)
在类(成员或非成员朋友)中定义的任何函数始终是隐式内联的。这是因为类定义通常在头文件中,并且您不希望头文件中有任何非内联函数定义(如果标题是标题,则标题中具有非内联函数会导致多个定义#included在多个源文件中。)
如果希望函数是非内联函数,则需要在类定义之外定义它。如果它是一个成员或朋友,你仍然需要在课堂上声明它,因为成员和朋友必须在课堂上宣布。你不想在课堂上定义它。
这一切都在C ++中的定义和声明之间产生了区别 - 它们是两个截然不同的东西,尽管每个定义也隐含着一个声明,而不是每个声明是一个定义。因此,当规范说“宣言”时,它通常意味着声明不是一个定义&#39;