Why we need to return reference to istream/ostream while overloading >> and << operators?

别说谁变了你拦得住时间么 提交于 2019-12-17 18:44:42

问题


What happens if I do not return din or dout, actually I'm reading a book in which writer returns back stream references

istream & operator>>(istream &din,vector &a)
{
    for(int i=0;i<size;i++)
    din>>a.v[i];
    return din;
}

ostream & operator<<(ostream &dout,vector &a)
{
    dout<<"("<<a.v[0];
    for(int i=1;i<size;i++)
    dout<<", "<<a.v[i];
    dout<<")";
    return dout;
}

回答1:


The reason is a combination of several facts.

  1. You want to be able to chain input and output operations as in

    in  >> x >> y;
    
    out << z << std::precision(10) << t << std::endl;
    

    so you must return something that allows operator<< again.

  2. Since you want your operator to work on any istream, i.e. any object derived from std::istream, you cannot define

    operator<<(istream_type, object);    // take istream by value
    

    since this would only work for the specific istream type istream_type, but not for a generic istream. For that one must use polymorphism, i.e. either take a reference or a pointer (which will be a reference or pointer to a class derived from std::istream).

  3. Since you only have a reference to the istream, you cannot return the istream object itself (which may be of a type not even defined at the point of the definition of operator<<) but only the reference you've got.

    One could get around this restriction by defining operator<< a template and take and return the istream_type by value, but that requires the istream type to have a copy constructor, which it may well not have for good reasons.

  4. In order to envoke polymorphism one could, in principle, use pointers (to streams) rather than references. However, operator<<(stream*,const char*) is not allowed in C++ (at least one operand must be of class or enumeration type).

    Thus, with stream pointers one must use function-call syntax and you're back with C-style fprintf(stream*, args...).

    Moreover, pointers can be null or dangling, which in fact is their default state (when declared without initializer), while a reference can be assumed to be valid (it cannot be declared without initializer).




回答2:


In this case when the reference is returned you can combain the operator in a chain. For example

std::cout << "Hello " << "Rajat Verma";

This is equivalent to the following calls of the operator

operator <<( operator <<( std::cout, "Hello" ), "Rajat Verma" );
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              returns reference to std::cout 



回答3:


One more thing is that ostream and istream standard objects such as cout and cin use a private copy constructors so they should be returned by reference not by value




回答4:


When you type: cout << vector; cout has the type of ostream so when you use " << " it does need to return an arguement with ostream type for cout to work



来源:https://stackoverflow.com/questions/28913009/why-we-need-to-return-reference-to-istream-ostream-while-overloading-and-o

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!