在閱讀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).\n"; 21 sysop copycat; 22 copycat = use(looper); 23 //cout << "Looper: " << looper.used << "use(s).\n"; 24 //cout << "copycat: " << copycat.used << "use(s).\n"; 25 cout << "use(looper): " << use(looper).used << "use(s)\n"; 26 return 0; 27 } 28 const sysop & use(sysop & sysopref) 29 { 30 cout << sysopref.name << " says: \n" << 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).\n"; 21 sysop copycat; 22 copycat = use(looper); 23 //cout << "Looper: " << looper.used << "use(s).\n"; 24 //cout << "copycat: " << copycat.used << "use(s).\n"; 25 cout << "use(looper): "; 26 cout << use(looper).used; 27 cout << "use(s)\n"; 28 return 0; 29 } 30 const sysop & use(sysop & sysopref) 31 { 32 cout << sysopref.name << " says: \n" << 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 */