什么';在C+;中使用友元函数的额外优势+;? 我在C++中有一个关于FooRead函数的问题。我理解,如果一个函数被定义为类的友元函数,它可以访问任何成员变量或函数,无论它是私有的、受保护的还是公共的。最近我使用doxygen创建文档引用,我发现friend函数的另一个优点:它与类的关系可以很容易地说明,因为friend函数将在HTML页面中的成员函数之后列出。但是,如果函数未定义为friend,则它将被视为全局函数,对于doxygen,它将不会与类文档一起列出。然后我计划将所有与特定类有关系的全局函数作为它的友元函数。我想知道这是否是一个好的做法

什么';在C+;中使用友元函数的额外优势+;? 我在C++中有一个关于FooRead函数的问题。我理解,如果一个函数被定义为类的友元函数,它可以访问任何成员变量或函数,无论它是私有的、受保护的还是公共的。最近我使用doxygen创建文档引用,我发现friend函数的另一个优点:它与类的关系可以很容易地说明,因为friend函数将在HTML页面中的成员函数之后列出。但是,如果函数未定义为friend,则它将被视为全局函数,对于doxygen,它将不会与类文档一起列出。然后我计划将所有与特定类有关系的全局函数作为它的友元函数。我想知道这是否是一个好的做法,c++,C++,以下代码显示一个函数可以选择为友元函数或全局函数 #include <iostream> #include <map> #include <set> #include <iostream> #include <algorithm> #include <vector> #include <functional> #include <numeric> #include <string> usi

以下代码显示一个函数可以选择为友元函数或全局函数

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
类ABCD
{
公众:
INTA;
int b;
好友无效好友乐趣(const ABCD&obj);
};
无效乐趣(常量ABCD和obj)
{

STD::CUT< P>我不会改变我的代码只是为了适应文档工具的缺点。所以,不,我认为它不是好的实践。

< P>使用朋友函数机制从来都不是一个好的实践,所以尽量避免它。任何一个类的定义之外的东西都不应该访问它的私有数据。C++鼓励你使用CasSuu。默认/模块化机制和好友定义只会削弱这种机制。

Doxygen允许您创建和引用。这比仅仅为了利用Doxygen的行为的一个怪癖而破坏有用的语言级保护更有意义。

基于答案,声明所有全局函数肯定不是一种好的做法ns作为友元函数。Doxygen还提供了一个关键字来连接与类有密切关系的函数:

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

友元函数不会比成员函数更削弱封装性。两者都可以访问所有成员,并且必须在类定义中声明。真的吗?它会削弱封装性它。假设你是一个类的创建者,并且你负责维护一个类a。在你的类中有一个朋友函数F的声明。函数F的所有者可以随意更改类的内部,这打破了封装机制。最简单的例子,句号。就像“所有者”一样我看不出有什么区别,除非你暗示一个类和它的友元函数更可能有不同的“所有者”如果是这样的话,建议应该明智地管理代码所有权,而不是避免使用有用的语言特性。