在阅读C++prime中P233也示例代码中有一个问题:
cout对象使用 << 操作符输出的语句中调用了某函数,然后此函数中也有输出,会怎么显示?
第一种写法:
在主函数中的cout对象使用重载操作符 << 并没有结束,所以输出流中的内容并没有显示在屏幕上。
然后在cout 语句中调用了use()函数,在该函数中会创建一个新的cout对象,然后输出函数中的内容显示在屏幕上。
然后函数调用结束后又回到了主函数中的cout语句中,当该语句执行完毕之后,输出流中的内容就会显示到屏幕中,也就有了控制台显示的结果。
(我的理解,不知道对不对)
1 #include <iostream> 2 using namespace std; 3 4 struct sysop 5 { 6 char name[26]; 7 char quote[64]; 8 int used; 9 }; 10 const sysop & use(sysop & sysopref); 11 int main() 12 { 13 sysop looper = 14 { 15 "Rick "Rortran" Looper", 16 "I'm a goto kind of guy.", 17 0 18 }; 19 use(looper); 20 //cout << "Looper: " << looper.used << "use(s). "; 21 sysop copycat; 22 copycat = use(looper); 23 //cout << "Looper: " << looper.used << "use(s). "; 24 //cout << "copycat: " << copycat.used << "use(s). "; 25 cout << "use(looper): " << use(looper).used << "use(s) "; 26 return 0; 27 } 28 const sysop & use(sysop & sysopref) 29 { 30 cout << sysopref.name << " says: " << sysopref.quote << endl; 31 sysopref.used++; 32 return sysopref; 33 } 34 /* 35 Rick "Rortran" Looper says: 36 I'm a goto kind of guy. 37 Rick "Rortran" Looper says: 38 I'm a goto kind of guy. 39 Rick "Rortran" Looper says: //先输出被调用函数中的内容 40 I'm a goto kind of guy. 41 use(looper): 3use(s) //再显示主函数中输出语句内容 42 */
第二种写法:
在主函数中的cout对象使用重载操作符 << ,然后输出流中的内容 use(looper): 显示在屏幕上。
然后下一个cout 语句中调用了use()函数,在该函数中会创建一个新的cout对象,然后输出函数中的内容显示在屏幕上。
然后函数调用结束后又回到了主函数中的cout语句中,这里会输出 一个没有名字的引用变量(但是引用的是looper变量)的used属性 3。
然后再执行下一个语句,也就有了控制台显示的结果。
1 #include <iostream> 2 using namespace std; 3 4 struct sysop 5 { 6 char name[26]; 7 char quote[64]; 8 int used; 9 }; 10 const sysop & use(sysop & sysopref); 11 int main() 12 { 13 sysop looper = 14 { 15 "Rick "Rortran" Looper", 16 "I'm a goto kind of guy.", 17 0 18 }; 19 use(looper); 20 //cout << "Looper: " << looper.used << "use(s). "; 21 sysop copycat; 22 copycat = use(looper); 23 //cout << "Looper: " << looper.used << "use(s). "; 24 //cout << "copycat: " << copycat.used << "use(s). "; 25 cout << "use(looper): "; 26 cout << use(looper).used; 27 cout << "use(s) "; 28 return 0; 29 } 30 const sysop & use(sysop & sysopref) 31 { 32 cout << sysopref.name << " says: " << sysopref.quote << endl; 33 sysopref.used++; 34 return sysopref; 35 } 36 37 /* 38 Rick "Rortran" Looper says: 39 I'm a goto kind of guy. 40 Rick "Rortran" Looper says: 41 I'm a goto kind of guy. 42 use(looper): Rick "Rortran" Looper says: 43 I'm a goto kind of guy. 44 3use(s) 45 */