C++中關於string型別究竟能不能用cout輸出的問題
一次在MFC中用cout輸出一個string型別字串,編譯時出現這樣一個錯誤:
error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is
no acceptable conversion)
以後我記住了C++中不能用cout輸出string,所以我儘量避免,若用到string型別輸出,則先將string轉為char*,但今晚敲程式碼時突然碰到string可以用cout輸出,所以再次做下概述,不過一下內容大都是網上的,僅供參考。
答案:首先得說這個問題的答案是肯定的,cout過載了string型別,所以在c++ 中可以直接輸出。
先來看CString、string和string.h這幾個區別:
CSting:CString是MFC或者ATL中的實現,是MFC裡面封裝的一個關於字串處理的功能很強大的類,只有支援MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用標準C++中的string類了。在MFC中使用不需要自己加,但在另外的程式中需要加入#include<CString>。
string:string類既是一個標準c++的類庫,同時也是STL(Standard Template Library,標準模版庫)中的類庫,已經納入C++標準之中。它和CString有本質的區別。
string.h:C語言裡面關於字元陣列的函式定義的標頭檔案,常用函式有strlen、strcmp、strcpy等等,這個標頭檔案跟C++的string類半點關係也沒有,所以 <string>並非 <string.h>的“升級版本”,他們是毫無關係的兩個標頭檔案。
綜上,cout函式過載的是string類庫中的string型別,而不是CString或string.h中的。
例:
1 #include<iostream> 2 #include<CString> 3 //#include<string.h> 4 5 usingstd::cout; 6 using std::string ; 7 using std::endl; 8 9 main() 10 { 11 string a; 13 a="*******"; 15 cout<<a<<endl; 16 }
當編譯這個程式時,會出現這樣的如上的error,而如果把上面的標頭檔案改為#include<string>時,error就會消失。
而在MFC中或你包含的是CString標頭檔案,如果想用cout輸出string 型別,則需要先把string型別轉換char*型,如上面例子:
1 #include<iostream> 2 #include<CString> 3 4 using std::cout; 5 using std::string ; 6 using std::endl; 7 8 main() 9 { 10 string a; 11 a="*******"; 12 char* b=(char*)a.c_str(); //將string型別轉為char* 13 cout<<b<<endl; 14 }
- *關於將string轉為char*,詳情請見http://blog.sina.com.cn/s/blog_786ce14d01014lpr.html