c ++丢弃朋友关键字会发生什么?

what will happen is c++ discard friend keyword?

我对 c++ 中的友元函数和友元 class 感到困惑。

在我的编码经验中,我从未使用过朋友。甚至没有发现别人的代码包含朋友。

朋友的基本用法和思路我都知道

典型的演示如下:

#include <iostream>
using namespace std;
class Box
{
   double width;
public:
   friend void printWidth( Box box );
   void setWidth( double wid );
};
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
void printWidth( Box box )
{
   cout << "Width of box : " << box.width <<endl;
}
 
int main( )
{
   Box box;
   box.setWidth(10.0);
   printWidth( box );
   return 0;
}

在这种情况下,我不知道使用friend是什么意思,我可以将printWidth定义为:

void Box::printWidth() {
  cout << "Width of box : " << width <<endl;
} 

我认为这样会更好。并将其定义为朋友不会使它更灵活或更通用。

那么,您能否提供一个可靠的例子来解释为什么我应该使用 friend,或者在什么情况下,friend 是更好或更优雅的解决方案?

您似乎已经知道的...

这个:

void Box::printWidth() {
  cout << "Width of box : " << width <<endl;
} 

是成员函数的定义。但是这个:

friend void printWidth( Box box );

将自由函数 printWidth 声明为 class 的友元。不是所有的东西都必须/应该是成员。如果其他函数需要访问私有成员,您可以将其设为 class 的友元,而成员函数已经可以访问。


示例:

有些函数不能作为成员函数实现。也许最常见的例子是 std::ostreams <<:

的重载
std::ostream& operator<<(std::ostream& out, const Box& b) {
     out << ....
     return out;
}

// example usage:
Box b;
std::cout << b;

operator<< 不是 std::ostream 的成员,也不可能是 Box 的成员。因此,当它需要访问 Box 的私有成员时,它要么需要使用 getter,要么成为 Box.

的好友

(请注意,尽管 << 既不是 std::ostream 的成员,也不是 Box 的成员,但它被视为它们接口的一部分。作为非成员实现函数有助于保持class 定义小而简单。)