因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置,所以,没有办法将operator<<重载成类的成员函数。
this指针默认是第一个参数,也就是左操作数,但在实际使用中cout需要的是第一个形参对象,才能正常使用,所以我们要将operator<<重载成全局函数,为了让类外可以访问成员,就需要友元函数来解决了。
说明:
- 友元函数可访问类的私有成员,但不是类成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用与普通函数的调用和原理相同
友元函数的优点:提高了代码的运行效率;缺点:破坏了封装性
重载运算符(<< >>)条件:
1.两个参数:参数1一定为oatream&,参数2:输出的内容
2.必须要有返回值:ostream&(为了支持连续输出)
3.少做格式化操作:比如换行
4.将该函数作为类的友元函数
class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);//友元函数 访问类里私有成员
friend istream& operator>>(istream& _cin