以上代码已经是正确的重载,分析时,我们可以回到重载的最初过程中来,为了实现基本的自定义对象的输出,可以像下面这样重载运算符:
但这种方法存在的问题是不允许通常那样将重新定义的<<运算符与cout一起使用,比如这样是不行的,对于Time对象t:cout<<t<<"Tuesday\n";
这是因为<<运算符要求左边是一个ostream对象,具体的说,它返回一个指向调用对象本身(一般是cout)的引用,所以对于cout<<x<<y;(cout<<x)的结果是返回一个cout对象,继而可以做cout<<y;而重载的<<运算符无返回类型时,将无法与cout一起使用,因此可以如上楼所示定义重载函数时返回一个指向ostream对象的引用。函数开始执行时已经传入一个引用对象,这样做的最终结果是返回值就是传递给它的对象。
cout<<t;将被转换为operator<<(cout,t);此调用返回cout对象,此时cout<<t<<"Tuesday\n";可以正常工作
这个版本还可以被用来写入到文件:
重载<<显示c_name对象的一般模式:
void operator<<(ostream& os,const Time& t) { os<<setw(2)<<setfill('0')<<t.hours<<":"<<setw(2)<<setfill('0')<<t.minutes;//这样可以使用cout<< <对象名>打印时间对象 }
但这种方法存在的问题是不允许通常那样将重新定义的<<运算符与cout一起使用,比如这样是不行的,对于Time对象t:cout<<t<<"Tuesday\n";
这是因为<<运算符要求左边是一个ostream对象,具体的说,它返回一个指向调用对象本身(一般是cout)的引用,所以对于cout<<x<<y;(cout<<x)的结果是返回一个cout对象,继而可以做cout<<y;而重载的<<运算符无返回类型时,将无法与cout一起使用,因此可以如上楼所示定义重载函数时返回一个指向ostream对象的引用。函数开始执行时已经传入一个引用对象,这样做的最终结果是返回值就是传递给它的对象。
cout<<t;将被转换为operator<<(cout,t);此调用返回cout对象,此时cout<<t<<"Tuesday\n";可以正常工作
这个版本还可以被用来写入到文件:
程序代码:
#include<fstream> ......... ofstream fout; fout.open("time.txt"); Time t(1,5); fout<<t; .....
重载<<显示c_name对象的一般模式:
程序代码:
ostream& operator<<(ostream& os,const c_name &obj) { os<<.......; return os; }
[此贴子已经被作者于2016-3-8 17:07编辑过]