/* 做本程序遇到的問題:由於使用的是CODE::BLOCKS 開發環境,剛開始使用code::blocks是,什么都 沒有設置,居然輸入的中文字符串,保存項目后,再次打開,code::blocks不能正確識別源文件編碼,沒能識別 成:936中文代碼頁,而是 10** 什么的,打開后中文區域就是亂碼. 后來找到設置,發現是沒有強制指定用戶 需要的代碼頁所致,后來設置為強制就OK了,{不過,把源文件改成UTF8,來保存也是可以的(因為編輯器默認是UTF-8來打開),但是COUT<<"中華人民共和國"} 這樣的中文字符串時,控制台輸出為亂碼(編譯器又帶來了編碼不匹配),因為控制台默認不支持UTF8,或codeblock本地化做的不好的緣故,按道理 可以改控制台為chcp 65001是可以看到中文的,但codeblocks看不到. 只有指定編譯參數:-fexec-charset=GBK -finput-charset=UTF-8 這樣就可以強制輸出的exe為GBK運行編碼而不是UTF運行編碼了.就可以正確顯示中文了, 如果還要搞Wchar_t的UNICODE 還需要setlocal(lc_all,"chs"),並且要么源文件是UTF-8,要么-finput-charset設置為GBK,否則編譯期就要報錯......... ////////////////////////////////////////////////////////////////////////////////////////////////// 網上查到的關於codeblocks編譯器,編碼的問題解釋: 1.Code::Blocks 編輯器保存源文件用的編碼。 默認情況下,是保存為windows本地編碼的,也就是WINDOWS-936字符集,也就是GBK編碼。 但是很神奇的是,GCC編譯器默認編譯的時候是按照UTF-8解析的。你存成GBK,但是當成UTF-8解析,這還能編譯通過,這才有鬼了,所以這兩個地方編碼不統一好,編譯的時候報錯:error: converting to execution character set: Illegal byte sequence,你根本連通過編譯的可能性都沒有! 其實要解決這個問題很簡單,編寫Code::Blocks的人只需要在調用編譯器之前檢測一下源文件是什么編碼,然后就自動讓編譯器用什么編碼進行解釋,問題就解決了。只是很可惜,Code::Blocks編寫的人可能還沒有這么做,或許是對本地化認識不夠吧,也可能是覺得沒必要吧?(所以就給初學的人帶來問題了,所以就覺得易用性不如微軟了,免費和商業的東西還是有差距的。。。) 2。GCC編譯器編譯的時候對輸入的源文件解釋用的編碼 這個編譯器可以設置-finput-charset=charset來指定編譯器用什么編碼解釋輸入源文件。比如如果源文件的字符集是GBk,那么就必須指定-finput-charset=GBK,如果不指定,一律當做UTF-8處理。 除非你源文件真的是UTF-8,否則就會出現轉換錯誤。 3。編譯好的執行文件所用編碼 如果你1和2兩個地方的編碼都能統一,那么編譯時不會報錯了,但是編譯好了,運行一下看看,在控制台顯示的依然是亂碼! 那是因為控制台顯示的時候缺省的是使用系統默認的字符集,比如windows下用的是GBk,但是默認情況下,編譯之后的執行文件時編譯成UTF-8的,所以又出現了不統一,亂碼由此而生! 解決的方法和簡單,就是給編譯器加上選項:-fexec-charset=GBK,和windows默認的統一,就OK了。 搞懂了亂碼產生的原因,那么不難得出結論,如何修改,你想修改成什么都OK,關鍵是要統一,並不是像網上一些人說的,修改成GBK就OK,其實你要修改成UTF-8都OK,關鍵是統一。 */ #include <stdio.h> #include <iostream> #include <windows.h> using namespace std; /////////////////////////////////////////////////////////////////////////////// //最簡單的類模版 template <class M> class A { M ta; public: A(M x):ta(x) //這里很有特點,可以在構造函數的初始化表中初始化本類的成員變量. { ta=x; //用這種方法也是一樣的,但可以認為不是初始化,而是賦值. //區別是:任何類型的const和引用數據成員必須在初始化表中初始化, //如果在構造函數內部進行初始化就會產生編譯時刻錯誤. } void print(); }; template <class M> void A<M>::print() { cout<<ta<<endl; } /////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// //測試普通類也是可以通過構造函數初始化表中初始化類成員變量. class test { private: int a,b; public: test(int x):a(x),b(x) { a=60; b=60; }; void pr(); }; void test::pr() { cout<<a<<" "<<b<<" "<<endl; } ////////////////////////////////////////////////////////////////////////////////////// int main() { setlocale(LC_ALL,"chs"); wchar_t a=L'陳'; //printf("%d",(WORD)a); //printf("%d",HIBYTE(a)); //printf("%d",LOBYTE(a)); //wchar_t a=L'陳'; //printf("%d\n",(WORD)a); //printf("%d\n",HIBYTE(a)); //printf("%d\n",LOBYTE(a)); char * b = "陳佑忠"; cout<<b<<endl; MessageBoxA(0,b,b,0); wcout<<a<<endl; int m(','); cout<<m<<endl; test t(50); t.pr(); A<float> ok(58.226); ok.print(); return 0; }