在C++中使用好友功能有什么额外的优势?

What's additional advantage of using friend function in C++?

本文关键字:什么 C++ 功能 好友      更新时间:2023-10-16

我有一个关于C++中的友元函数的问题。我知道,如果一个函数被定义为类的友元函数,它可以访问任何成员变量或函数,无论它是私有的、受保护的还是公共的。最近我使用 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;
}

Doxygen允许你创建和引用函数组和其他全局事物。这比仅仅为了利用Doxygen行为的怪癖而破坏有用的语言级保护更有意义。

我不会仅仅为了适应文档工具的弱点而更改我的代码。所以,不,我不认为这是好的做法。

使用友元函数机制从来都不是一个好的做法,所以尽量避免它。类定义之外的任何内容都不应访问其私有数据。C++鼓励您使用封装/模块化机制,友元定义只会削弱这种机制。

我同意Mike的观点,尽管我想再提几点关于我理解的友元函数。- 友元函数不是可传递的。这会将 friend 函数保留在声明为本地的类的本地。- 友元函数不继承。这样,friend 函数仅是声明它们是 friend 的类的 friend 函数。类所有者完全有意识地决定将特定函数声明为朋友而不是全部。- 在成员函数 [getter 和 setter] 的情况下,它们在类继承链中可用。- 此外,需要使用 2 个独立类的功能可以使用 friend 函数来实现,而无需对这些类进行任何更改。

基本 关于答案,将所有全局函数声明为友元函数绝对不是一个好的做法。Doxygen还提供了一个关键字来连接与类有密切关系的函数:/relate