重载输入输出操作符

来源:互联网 发布:mac虚拟机内存 编辑:程序博客网 时间:2024/05/24 06:29
 

最近学习数据结构,要我写一个多项式运算,还是链式存储,好吧,我设计的时候,发现要是有个<< 和>>的重载,我的函数会简单很多,也很方便用户。

输出操作符<<的重载:

ostream& operator <<(ostream& os,const ClassType &object)

{

         os<<//......

         return os;

}

解释下,为了和IO标准库一致,操作符应接受ostream&作为第一个形参,对类类型const对象的引用作为第二个形参。

1. ostream对象的引用不能为const,因为输出会改变流的状态,该形参记住哈,是个引用,不能复制ostream对象。

2. 为了避免复制实参,object对象也是一个引用。一般使之为const引用,因为输出一个对象不应该改变该对象吧。。。为const引用还有个好处就是可以使用同一个定义来输出const和非const对象。

3. 返回类型是一个ostream引用,它的值通常是输出操作符所操作的ostream对象。

注意一下两点:

1. 输出操作符通常所做格式化应该尽量少,不应该输出换行符。这些格式化应该尽可能交给用户个性化的执行而不是操作符帮他们执行,想想标准库的那些操作符。

2. 更重要的是,IO操作符必须(前面是"应该")为类的非成员函数,否则左操作数将只能是该类类型的对象。我们假设下IO操作符是ClassType的一个成员函数,那么是不是有:

ClassType object;

object << cout;//同样的有object >> cin;

很别扭吧?和我们平时用的相反。但是如果硬要:

cout << object;

是不是让左操作数必须为ostream类型?那么意味着,如果操作符是类的成员,那么该操作符必须是ostream类的成员。但是ostream作为标准库的组成部分,我们是不能为它增加成员的。如果想要使用重载操作符为该类型提供IO操作,就必须将它们定义为非成员函数。IO操作符通常对非公有数据进行读写,ClassType类通常将IO操作符设为友元。

class ClassType

{

friend std::istream& operator>>(std::istream&,ClassType&);

friend std::ostream& operator<<(std::ostream&,const ClassType&);

public :

ClassType& operator+=(const ClassType&);

};

输入操作符>>的重载

istream& operator>>(istream& in,ClassType& object )

{

//....

return in;

}

1. 与前面的不同,形参2的对象必须是非const引用,很明显,读入数据会改变object对象。

2. 返回的是一个对同一个流的引用。

3. 必须处理错误和文件结束的可能性。 

假设有个类Sales_item,里面有成员isbn,units_sold ,price,revenue,构造函数可以保证它成为一个有用的状态。

istream& operator>>(istream& in, Sales_item& s)

{

       double price;

       in >> s.isbn>>s.units_sold >>price;

       if(in)

             s.revenue = s.units_sold*price;

       else

             s = Sales_item(); // 如果input失败了,重置s对象,使之处于一个可用的状态,因为它的成员都已经定义了。

        return in;

}

原创粉丝点击