打印类中的一些变量,此时就需要使用函数或者重载,为了提高代码可读性,一般使用操作符重载来书写,而cout并不在c++的默认类成员函数中,需要我们自己书写。第一种写在类中如下面的代码(我们以日期类举例,较《c++primer》中的书店类更加容易讲解做笔记)
对输出运算符的重载
void operator<<(ostream& out)
{
out << _year << "-" << _month << "-" << _day << endl;
}
会出现一个问题,只能写成
d<<cout //打印d中的年月日
因为函数的第一个参数是this指针,第二个参数才是我们传进去的 out,但是这与std中的cout使用习惯完全不符,我们的所打印变量是应该在cout的右边,如 cout<<d<<endl.
这样的重载和普通的函数没有两样,也就失去了重载函数的目的所在。
那么这样,我们便不可以把输出运算符的重载写成成员函数,写成成员函数去实现功能,能实现功能 但失去重载本身的意义。
那么我们将输出运算符的重载
那么我们在类外写重载函数,此时输出运算符的重载函数是一个全局的。
void operator<<(ostream& out,const Date& d)
{
out << d._year << "-" << d._month << "-" << d._day << endl;
}
然后在对应的类中使用友元
class Date
{
friend void operator<<(ostream& out, const Date& d);
public:
Date(int year = 1998, int month = 1, int day = 1)
/* :_year(year)
, _month(month)//初始化列表,
, _day(day)
*/
{
cout << "全缺省 " << endl;
_year = year;//内置类型,
_month = month;
_day = day;
}
Date(Date &d)//拷贝构造必须传引用,不然会无穷递归
{
_year = d._year;
_month = d._month;
_day = d._day;
}
void operator =(const Date&d)//赋值运算符重载 &是传引用
{
if(this != &d)//取地址
{
_year = d._year;
_month = d._month;
_day = d._day;
}
}
bool operator ==(const Date & d1) //d1<d2 _____> d1.operator (&d1,d2)
{
return this->_year == d1._year&&\
_month == d1._month&&\
_day == d1._day;
}
bool operator != (const Date &d)//d1!=d2 d1即this指针 *this就是d1
{
return!(*this == d);
}
bool operator < (const Date &d)
{
}
private:
int _year;
int _month;
int _day;
};
扫描二维码关注公众号,回复:
2604961 查看本文章