首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问cin的特性和常引用的有关问题

2012-10-11 
请教cin的特性和常引用的问题本人有两个问题求教各位。1. cin的使用问题C/C++ code#include iostreamusin

请教cin的特性和常引用的问题
本人有两个问题求教各位。
1. cin的使用问题

C/C++ code
#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    int val = 0;    int sum = 0;    while (false == (cin >> val).fail())    {        sum += val;    }    cout << "sum is " << sum << endl;    system("pause");    return 0;}

这段代码就是求从键盘上输入的数字之和。假设我输入:1回车2回车3a回车
求和的结果是6.即1+2+3
我想问一下,这里的3为什么会被识别了?为什么不是把3a一起作为非法字符加以舍弃呢?

2. 关于常引用的问题
C/C++ code
int i = 1, j = 2;const int& k = i + j;

编译器对待上述常引用定义的处理是为i+j的值创建一个临时变量,假设为temp,然后将temp作为常引用捆绑的对象。

这么一来,常引用的定义,就会产生一个所谓副本的概念,是需要占用空间的。也就是说,像如下的函数定义方式:
C/C++ code
void f(const A& a){//some codes}

在实参和形参结合的时候,会产生副本。从效率上讲,是不是和如下定义方式一个级别了?
C/C++ code
void f(A a){//some codes}

如果这样的话,那是不是从效率的角度考虑,函数的形参表中,纯引用(非常引用)的方式,效率更高呢?


[解决办法]
1.cin的识别是尽可能贪婪地进行输入识别,所以‘3a’会被识别为3,而不是一个完整的非法字符串,这和atoi函数的结果是一致的。atoi("3a")的结果是3

2.从编译器的角度来看,引用实际上就是指针,这意味着传递引用实际上只是传递了一个整数地址。一般情况下,效率是较高的,但如果参数本身就是一个char,int等小结构,则用引用来提升效率的做法得不偿失。另一方面,引用不完全是为效率考虑的,如果需要输出多个返回值,传一个引用参数,在方法内部通过该参数设置返回值亦可。
[解决办法]
>我想问一下,这里的3为什么会被识别了?为什么不是把3a一起作为非法字符加以舍弃呢?
读到3a这行,读进3,碰到a不是数字就仍然把它放缓冲区,并且这次读取成功完成。
然后缓冲区开头是a,这次碰到a就fail了。

>常引用的定义,就会产生一个所谓副本的概念
出现拷贝是因为i+j而不是因为const int&。
[解决办法]
探讨

>我想问一下,这里的3为什么会被识别了?为什么不是把3a一起作为非法字符加以舍弃呢?
读到3a这行,读进3,碰到a不是数字就仍然把它放缓冲区,并且这次读取成功完成。
然后缓冲区开头是a,这次碰到a就fail了。

>常引用的定义,就会产生一个所谓副本的概念
出现拷贝是因为i+j而不是因为const int&amp;。

[解决办法]
探讨
第1个问题已经基本上明白了。谢谢各位。

对于第2个问题,我所说的函数形参表中的引用不一定是内置类型的引用。我们就考虑为一个抽象类型的引用吧。想请大家帮忙分析一下这个情况下的常引用。我把问题再描述明确点:
假设类型A是类类型。
void f(const A&amp;);
void f(A);
void f(A&amp;);
这三种的效率请分析一下。

热点排行