2013-04-29 36 views
0

我对有关朋友功能及其使用的信息进行了深入研究。他们能够访问类中的封装数据,同时不会破坏OOP的黄金法则之一。在为I/O操作符(一个基本操作,第一个学习C++教程之一)而重载的各种源代码中,每个人都将操作符定义为朋友,以便在类之外实现它。我的问题是:需要来完成吗?为什么不把声明函数作为类的公共成员,并在保持所有封装的情况下插入/显示类中的数据?这似乎与重载其他操作符没有什么不同,但它是一种传统的I/O操作符重载方法。朋友功能及其与I/O操作员的关系

谢谢你的时间。

+0

可能重复[重载操作符作为成员函数或非成员(朋友)函数?](http://stackoverflow.com/questions/1905439/overload-operators-as-member-function-or-non -member-交友功能) – 2013-04-29 00:29:02

回答

2

比方说,你想重载operator<<X类,所以你可以使用它像这样:

X x; 
std::cout << x; 

注意std::cout是运营商的第一个操作。要将其作为成员函数来实现,它必须是std::basic_ostream的成员,这是std::cout的类型。您不能将成员添加到已定义的类中。这就是为什么我们将其声明为免费功能。

如果超载operator<<X一员,将采取一个X对象作为其第一个操作数,因此会使用这样的:

X x; 
x << something; 

这显然不是你想要的交易时与I/O。

0

如果您有一个重载的运算符,如:a @ b作为成员函数实现,则该调用将转换为[email protected](b);。这意味着该函数必须是类的成员,它是左侧操作数的类型。在iostreams的情况下,所有运营商都需要成为iostream本身的成员。

虽然输入输出流确实提供了一些插入 /提取运营商为会员,你通常希望能够增加更多的不修改的iostream的类本身。要做到这一点,您几乎需要将运算符实现为一个自由函数而不是成员函数。由于您通常仍然希望它可以访问您打算读/写的任何类型的私有部分(如果您愿意,可以插入/提取),它通常必须是该类的朋友。


  1. 这是所谓的开/关原理的一个例子:类应该是开放的,以扩展,但封闭修饰。换句话说,你想扩展它而不修改它。