我在C ++中有一个关于friend函数的问题。我理解,如果函数被定义为类的友元函数,它可以访问任何成员变量或函数,无论它是私有的,受保护的还是公共的。最近我使用doxygen来创建文档引用,我发现了友元函数的另一个优点:它与类的关系可以很容易地说明,因为友元函数将在HTML页面中的成员函数之后列出。但是,如果函数未定义为friend,则将其视为全局函数,并且使用doxygen时,它将不会与类文档一起列出。然后我计划将与特定类关系的所有全局函数作为其友元函数。我想知道这是否是一个好习惯。
以下代码显示可以选择一个函数作为友元函数或全局函数。
#include <iostream>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <numeric>
#include <string>
using namespace std;
class ABCD
{
public:
int a;
int b;
friend void friend_fun(const ABCD &obj);
};
void fun(const ABCD &obj)
{
std::cout<<obj.a<<endl;
std::cout<<obj.b<<endl;
};
void friend_fun(const ABCD &obj)
{
std::cout<<obj.a<<endl;
std::cout<<obj.b<<endl;
};
int main ()
{
ABCD obj;
obj.a = 20;
obj.b = 30;
fun(obj);
friend_fun(obj);
return 0;
}
答案 0 :(得分:5)
Doxygen允许您创建和引用groups of functions and other global things。这比打破有用的语言级保护更有意义,只是为了利用Doxygen行为的怪癖。
答案 1 :(得分:1)
我不会改变我的代码只是为了适应文档工具的缺点。所以,不,我不认为这是好的做法。
答案 2 :(得分:0)
使用友元功能机制绝不是一个好习惯,所以尽量避免使用它。类的定义之外的任何内容都不应该访问其私有数据。 C ++鼓励你使用封装/模块化机制,朋友定义只会削弱这种机制。
答案 3 :(得分:0)
基于答案,将所有全局函数声明为友元函数绝对不是一个好习惯。 Doxygen还提供了一个关键字来连接与类密切相关的函数:/relates
答案 4 :(得分:0)
我同意迈克在这里的观点,但是想提一些关于我理解的朋友功能的观点。 - 朋友的功能不是传递性的。这使得友元函数保持在声明为本地的类的本地。 - 朋友功能不继承。这样朋友的功能只是那个宣称他们是朋友的类的朋友。类所有者完全有意识地决定将特定功能声明为朋友而不是全部。 - 在成员函数[getter和setter]的情况下,它们在类继承链中可用。 - 还可以使用友元函数实现需要使用2个独立类的功能,而无需对这些类进行任何更改。