我估计是要重载流输出运算符<<,好比cout<<a;原来的形式是 operator<<(cout,a); 因为<<须要用到两个类,一个是ostream类,cout就是他的对象,是负责输出的类;另外一个是用户自定义类。ios
因此重载是应该用 友元函数 重载。以下:c++
1函数 2spa 3指针 4code 5对象 6ci 7编译器 8io 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
注意上面的ostream& operator<<(ostream& out,const Date& date)的3个引用&,
1. 第一个ostream&,返回的是ostream类对象的引用,为了进行连续的运算,如cout<<a<<b;
先进行cout<<a,运算玩了,返回cout的引用,就是返回了cout自己,原来的式子变为cout<<b;
这样就能连续写了,cout<<a<<b<<c<<........
2. 第二个ostream& out, out是随便取的名字,就是ostream类的对象,与cout用法同样,经过<<将数据传到out里,因此输出时用cout<<a,这时就调用 operator<<(cout,a), 把cout做为参数传入。对于上述例子cout<<date<<endl;,就是执行了cout<<date.year<<'-'<<date.month<<'-'<<date.day; return cout;(注意,这里就是cout,其中year等是基本类型,c++已经写好了)
再次说明cout并不特殊,就是预先定义好了的ostream类的对象。
3. 第三个const Date&,主要为了快速出入参数,若是不用&,将会复制一个参数,而不是将原来的对象直接传入,就会调用拷贝构造函数(若是没写的话编译器自动提供),浪费时间,有时还会产生错误,好比数据成员里有指针时,编译器提供的拷贝构造函数将会自动复制 一个指针,与原来的指针指向同一个地址,这样改变一个另外一个也会改变,这是咱们不想要的,咱们须要拷贝时指针指向不一样的地址,两个对象互不干扰,只是指针所指变量的值相等就行,这就须要本身写 拷贝构造函数,本身new等。 因此通常用&,加const防止意外修改。