2

我对 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;
}
4

5 回答 5

6

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

于 2012-08-08T14:21:31.720 回答
2

我不会为了适应文档工具的缺点而更改我的代码。所以,不,我不认为这是一个好习惯。

于 2012-08-08T14:11:41.147 回答
1

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

于 2012-08-08T14:18:17.843 回答
0

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

于 2012-08-08T14:55:09.067 回答
0

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

于 2016-04-25T17:21:10.097 回答