非成员好友函数总是内联的
Nonmember friend function is always inline
我是 C++ 的新手,当我尝试学习 friend 函数时,我从 friend description on Cppreference 中看到:
2) (only allowed in non-local class definitions) Defines a non-member function, and makes it a friend of this class at the same time. Such non-member function is always inline.
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
}
};
这是否意味着所有友元函数都必须 内联?换句话说,友元函数必须完全定义在 class?
中吗?
但是,我还发现了一个实例,其中 friend 函数定义在 class 之外,来自 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;
}
我真的被这个冲突搞糊涂了。我对 inline 的理解有误吗?
“a nonmember friend function defined inside the class is automatically inline”是什么意思?
在class(成员或非成员朋友)中定义的任何函数总是隐式内联的。那是因为 class 定义通常在头文件中,并且您不希望头文件中有任何非内联函数定义(如果头文件中有一个非内联函数会导致多个定义 #included在多个源文件中)。
如果您希望一个函数是非内联的,您需要在 class 定义之外定义它。如果它是成员或朋友,您仍然需要在 class 中声明它,因为成员和朋友 必须 在 class 中声明。您只是不想在 class.
中定义它
这一切都涉及到 C++ 中 定义 和 声明 之间的区别——它们是两个截然不同的东西,尽管每个定义也是隐式声明,并非每个声明都是定义。因此,当规范说 'declaration' 时,它通常意味着 'declaration that is not also a definition'
我是 C++ 的新手,当我尝试学习 friend 函数时,我从 friend description on Cppreference 中看到:
2) (only allowed in non-local class definitions) Defines a non-member function, and makes it a friend of this class at the same time. Such non-member function is always inline.
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
}
};
这是否意味着所有友元函数都必须 内联?换句话说,友元函数必须完全定义在 class?
中吗?但是,我还发现了一个实例,其中 friend 函数定义在 class 之外,来自 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;
}
我真的被这个冲突搞糊涂了。我对 inline 的理解有误吗? “a nonmember friend function defined inside the class is automatically inline”是什么意思?
在class(成员或非成员朋友)中定义的任何函数总是隐式内联的。那是因为 class 定义通常在头文件中,并且您不希望头文件中有任何非内联函数定义(如果头文件中有一个非内联函数会导致多个定义 #included在多个源文件中)。
如果您希望一个函数是非内联的,您需要在 class 定义之外定义它。如果它是成员或朋友,您仍然需要在 class 中声明它,因为成员和朋友 必须 在 class 中声明。您只是不想在 class.
中定义它这一切都涉及到 C++ 中 定义 和 声明 之间的区别——它们是两个截然不同的东西,尽管每个定义也是隐式声明,并非每个声明都是定义。因此,当规范说 'declaration' 时,它通常意味着 'declaration that is not also a definition'