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 using std::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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM