因为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, Date& d);
public:
Date(int year=1888, int month=11, int day=1)
:_year(year),
_month(month),
_day(day)
{
cout << "Date():" << this << endl;
}
Date(const Date& d)
{
cout << "Date&():" << this << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}
void PrintDate()
{
cout << _year << "--" << _month << "--" << _day << endl;
}
//下面这个不能重载operator<<
//void operator<<(const Date& d)//ostream是cout的一个对象
//{
// _cout << _year << "--" << _month << "--" << _day << endl;
//}
~Date()
{
cout << "~Date():" << endl;
}
private:
int _year;
int _month;
int _day;
};
//重载成全局的函数
ostream& operator<<(ostream& _cout, const Date& d)//ostream是cout的一个对象
{
_cout << d._year << "--" << d._month << "--" << d._day;
return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
_cin >> d._year;
_cin >> d._month;
_cin >> d._day;
return _cin;
}
int main()
{
Date d;
cin >> d;
d.PrintDate();//打印
cout << d << endl;
system("pause");
return 0;
}