请教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++ codeint i = 1, j = 2;const int& k = i + j; 编译器对待上述常引用定义的处理是为i+j的值创建一个临时变量,假设为temp,然后将temp作为常引用捆绑的对象。
这么一来,常引用的定义,就会产生一个所谓副本的概念,是需要占用空间的。也就是说,像如下的函数定义方式:
C/C++ codevoid f(const A& a){//some codes} 在实参和形参结合的时候,会产生副本。从效率上讲,是不是和如下定义方式一个级别了?
C/C++ codevoid 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&。[解决办法] 探讨 第1个问题已经基本上明白了。谢谢各位。 对于第2个问题,我所说的函数形参表中的引用不一定是内置类型的引用。我们就考虑为一个抽象类型的引用吧。想请大家帮忙分析一下这个情况下的常引用。我把问题再描述明确点: 假设类型A是类类型。 void f(const A&); void f(A); void f(A&); 这三种的效率请分析一下。