关于C++类的一个问题。

#include "iostream.h"
#include "stdio.h"
class Plane
{
private:
char s[50],w[50];
int a,b;
public:
void set()
{
gets(s);
gets(w);
cin>>a;
cin>>b;
}
void print()
{
cout<<s<<' '<<w<<' '<<a<<' '<<b<<endl;
}
};
void main()
{

cout<<"输入:";
Plane p;
p.set();
p.print();
}
很想知道这个程序究竟是按怎样的顺序执行的??
为什么cout<<"输入"这条语句会在输入了两个字符串之后才执行呢??

这个是有关C++中输入流和输出流的问题:
1、程序首要从main()函数开始执行,执行语句“cout<<"输入:";”,是将字符串“输入:”输出到标准输出流cout中,但并没有立即在屏幕上显示出来,是因为这个字符串暂时存到了缓冲区中。而加上endl就可以立马显示出来,这是由于endl除了写'\n'进输出流之外,还调用输出流的flush函数,刷新缓冲区,让数据直接写入文件或者屏幕上。
2、执行语句“Plane p;”,声明一个Plane类的对象。
3、执行语句“ p.set();”,通过类对象调用Plane类的成员函数,执行set()函数的操作。首先调用“ gets(s);gets(w);”从键盘上读入两个字符串;然后调用“cin>>a;cin>>b;”从标准输入流中读入两个整型数字符。这个时候,由于输出流cin也需要占用缓冲区,所以输出流cout中的缓存的字符就被刷新送到屏幕上显示了。
4、输出显示输入的四个字符,程序结束。

附:这个主要就是C++中endl和'\n'的不同造成的。
endl除了写'\n'进输出流之外,还调用输出流的flush函数,刷新缓冲区,让数据直接写入文件或者屏幕上。两者都可以用的,不过如果需要立即显示,比如输出到显示器的场合,最用用endl,如果只是写一个'\n'不一定会立即显示,因为数据可能被存在缓冲区里。
在你这个程序中,你把“cout<<"输入:";”改成“cout<<"输入:<< endl";”,你就能能理解了,也符合你的思维习惯。祝你好运!呵呵……
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-15
建议你用调试看看..我也分不清了
第2个回答  2010-05-15
cout 遇到endl就把缓存中的数据显示到控制台上,不然都是先在缓存中,后面程序执行到cin也是需要流缓存的, 程序就把cout的输出了
第3个回答  2010-05-15

不会呀.很正常

我用的是BCC++ 5.5 & UltraEdit 8.10a编译过的.

UltraEdit捕捉到的输出如下:

输入:5 8 4 6

附图是在cmd控制台直接运行程序的截图.

第4个回答  2010-05-15
二楼的说的很对,cout是先缓存起来的,可以用endl来刷新缓冲区。
第5个回答  2010-05-15
cin>>a;
cin>>b;
gets(s);
gets(w);
交换下这个就可以了,C和C++混杂的情况下,编译器会先执行的c的。
相似回答