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::ostream
s <<
:
的重载
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 定义小而简单。)
我对 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::ostream
s <<
:
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 定义小而简单。)