cin,cout操作符重载相关疑难点

如果不返回变量,你怎么操作变量?给你举个例子,C++支持连等操作,也就是a=b=c=d=1,如果等号操作返回的是void的话,那么d=1返回一个void,那么下一层赋值就是c=void,这是非法操作,这么解释不知道你理解没理解。

 cout返回的是ostream&(也就是cout对象本身),cin返回的是 istream&(也就是cin对象本身)

eg:( ( (cout<<123)<<456) <<789 );

cout<<123的返回值 <<456 ;


cin,cout是istream和ostream这两个类的全局类对象。在这个两个类里分别实现了对>>,<<操作符重载的函数。函数知道吗?参数列表,返回值,函数名,函数定义。这两个操作符重载函数的实现里都要求有参数和返回值,你说的返回就是返回值。而这两个分别返回值分别是istream的cin和ostream的cout

返回类型 operator 运算符 (参数列表) 

istream & operator >> (istream & is,  int  & arg)  // 友元的方式重载了 >>
{
     is 把数据赋给 a;  is>>arg
     return  is;
}   返回类型为istream,类 

void  fun() {} 则无返回类型




例子::

如果有:  int  a = 0, b = 0;
然后,我们这样操作:
++++a;
b++++;
  
这样你会发现++++a完全没有问题, 最终a的结果是2, 这是因为做了两次前++操作, 
我们来看一下为什么可以这样做, 首先后面的++操作符会先与a结合, 所以原代码等价于++(++a);
而(++a)的工作原理是, 让a加1, 然后再返回a本身, 所以++(++a:0) --> ++(a:1) --> a:2
最后得到的结果是a加了2, 返回值也是a, 其实++++++++++++a这种代码也是完全正确的(偶数个 "+" )
  
但是b++++是不可以的, 因为b++++等价于(b++)++; 我们知道b++是先返回一个b的值(非b本身)再让b加1
这个返回值是一个值, 所以(b++)++ --> (0)++; 0++是对一个右值作运算, 所以b++++是不行的
  
其实++b++也是不可以的, 因为后++ 优先于 前++进行运算
还有+++a;这种是不行的(奇数个 "+" ), 因为离a最近的那个+会被解释为+(正号), 
而+a并不是指a本身, 即+a返回的是一个右值, 再做++运算当然不行
所以+++++++++a; 这种是不行的(奇数个+, +a除外)
*****************************************************
  
*****************************************************
再看一个:
int  a = 0, b = 0;
(a = 2) = 4;
b = 2 = 4;
  
前面那个可以, 因先运算(), 且返回的是a本身, 操作是先给a赋了2, 后面又赋了4,
最后的结果是a为4, 返回的还是a本身
a > b ? a : b = 4;也是可以的, 因为先做?:操作, 且返回的是a或b本身, (当然不要写这种晕头的代码)
  
为什么b = 2 = 4; 不可以呢, 因为按操作顺序这行代码等价于b = (2 = 4); 2 = 4 不合法
  
*****************************************************
  
*****************************************************
OK 回归正题:
cin >> a >> b; 为什么可以?
我们得先知道这个, cin >> a调用的函数是
istream & operator >> (istream & is,  int  & arg)  // 友元的方式重载了 >>
{
     is 把数据赋给 a;
     return  is;
}
或是
istream & istream::operator >> ( int  & arg)  // 成员方式重载了 >>
{
     把数据赋给 a;
     return  (* this );
}
上面具体是哪种方式重载了>>我不知道, 我们也不用关心, 重要的是我们知道它的工作原理:
先给传入的参数arg赋值, 然后再返回流对象本身(引用方式返回), 
这个与 前++ 运算符 的工作原理是一样的, 对吧
都是 先 ... 后返回 对象本身
  
我们再看cin >> a >> b;
那这行代码等价于(cin >> a) >> b; 还是cin >> (a >> b);呢?
cin >> (a >> b);是编不过的, 我没看明白它报的错, (好像说什么二义性)
不过, 我知道它肯定编不过, 因为 a >> b返回的是一个右值, 而operator>>接收的是一个 int  &
( 但是 cin >> (a >>= b);这样写倒是可以的 )
  
对于(cin >> a) >> b;的工作原理就和++++a工作原理一样, 不必我多讲, 25楼也讲了一点
  
剩下的唯一问题是
为什么cin >> a >> b会先进行前面的>>操作
而b = 2 = 4会先进行后面的=操作
  
因为 >> 是从左往右进行的, 而 = 是从右往左进行的
http: //zhidao.baidu.com/question/211223561.html 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值