重载输入输出运算符引用的理解
2014-08-24 12:25
267 查看
#include <iostream.h> class coord{ int x,y; public: coord(int i=0,int j=0) { x=i; y=j; } friend ostream& operator<<(ostream &stream,coord &ob);//这里第二个参数采用了引用(&ob), //是为了减少调用的开销,使用引用参数只需把对象的地址传进来就可以了,而不需把每个域分量逐一传进来 //而消耗内存和时间。所以不用普通的对象做参数,虽然结果一样。但是<<重载的函数返回值和第一个参数必须为输出流类ostream的的引用。 friend istream& operator>>(istream &input,coord &ob);//这里的第二个参数必须为引用,目的是函数体对参数a的修改能影响实参,因为从输入 //流输入的值要存入与a对应的实参中。注意重载输出<<时的作用并不是为了修改实参,此点不同。 }; ostream & operator<<(ostream &stream,coord &ob) { stream<<ob.x<<","<<ob.y<<endl;//stream为ostream类的一个对象的引用,作为左操作数(cout也是一样,是C++中的两个流对象) return stream; } istream& operator>>(istream &input,coord &ob) { cout<<"Enter x and y value:"; input>>ob.x; input>>ob.y; return input; } main() { coord a(55,66),b(100,220); cout<<a<<b; cin>>a; cin>>b; cout<<a<<b; return 0; }
分析:上面输出重载函数的形参stream是ostream类对象的引用,返回值也是ostream类对象的引用。在main中cout<<a;cout是ostream类对象,a是coord类对象,所以可以把其理解为
operator<<(cout,a);其中cout和a作为了实参,调用了
ostream & operator<<(ostream &stream,coord &ob) { stream<<ob.x<<","<<ob.y<<endl; return stream; }也就是相当于stream是cout的引用,ob为a的引用。由此其相当于执行了:
cout<<a.x<<","<<a.y<<endl; return cout;
此时,返回值是一个ostream类对象的引用,即将输出流cout返回了,当执行cout<<a<<b;时,可以等价为(cout<<a)<<b;(cout<<a)是具有新内容的流对象cout,(cout<<a)<<b就相当于(新cout)<<b,操作符左侧仍是ostream类对象cout,所有再次调用<<重载可以继续输出数据。因此,C++规定运算符<<重载函数的第一个参数和函数返回类型必须是ostream类型的引用,就是为了返回cout的当前值连续的输出。
另附面试经典的问题:流操作符重载返回值申明为“引用”的作用:
流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << "hello" << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x
= j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。
相关文章推荐
- C++解引用运算符*重载
- c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)
- C++ 自增运算符的重载以及理解
- 重载输入输出运算符
- 【C++】输入输出运算符的重载
- 20、C++运算符重载之输入输出运算符的重载
- 《第九周任务二》定义Time类中的<<和>>运算符的重载,实现时间输入输出,改造源程序中对运算结果的显示方式,使程序读起来更自然
- 建立一个二维坐标系的类TwoCoor,用x、y表示坐标值,实现两坐标点的加减运算,计算两坐标点之间的距离,并重载输入输出运算符,使之能够直接输入输出坐标点的坐标值。
- C++ 解引用(*)和箭头(->)运算符的重载
- 第九周——时间类和输入输出运算符的重载
- [置顶] # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符
- 【C++】重载输入输出运算符
- 理解-加号重载要使用全局函数+返回值非引用
- C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。
- 基类指针使用重载输入输出运算符函数操作派生类
- <<C++ Primer>>中文版 重载箭头运算符的理解
- C++ 输入输出运算符重载
- 深入理解运算符的重载
- 第九周任务一 复数 输入输出运算符的重载
- C++解引用运算符*重载