在C++中使用好友功能有什么额外的优势?
What's additional advantage of using friend function in C++?
我有一个关于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
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用