| MFC類
CString MFC的CString含有TCHAR,它的實際字元類型取決於預先處理標記的設定。通常,CString象STL字串一樣是不透明對象,只能用CString的方法來修改。CString比STL字串更優越的是它的建構函式接受MBCS和Unicode字串。並且可以轉換為LPCTSTR,因此可以向接受LPCTSTR的函數直接傳遞CString對象,不必調用c_str()方法。 // 構造CString s1 = "char string"; // 從LPCSTR構造CString s2 = L"wide char string"; // 從LPCWSTR構造CString s3 ( ' ', 100 ); // 預分配100位元組,填充空格CString s4 = "New window text";// 可以在LPCTSTR處使用CString:SetWindowText ( hwndSomeWindow, s4 );// 或者,顯式地做強制類型轉換:SetWindowText ( hwndSomeWindow, (LPCTSTR) s4 ); 也可以從字串表載入字串。CString通過LoadString()來構造對象。用Format()方法可有選擇地從字串表讀取一定格式的字串。 // 從字串表構造/載入CString s5 ( (LPCTSTR) IDS_SOME_STR ); // 從字串表載入CString s6, s7;// 從字串表載入 s6.LoadString ( IDS_SOME_STR );// 從字串表載入列印格式的字串 s7.Format ( IDS_SOME_FORMAT, "bob", nSomeStuff, ... ); 第一個建構函式看上去有點怪,但它的確是文檔標定的字串載入方式。 注意,CString只允許一種強制類型轉換,即強制轉換為LPCTSTR。強制轉換為LPTSTR (非常量指標)是錯誤的。按照老習慣,將CString強制轉換為LPTSTR只能傷害自己。有時在程式中沒有發現出錯,那隻是碰巧。轉換到非常量指標的正確方法是調用GetBuffer()方法。 下面以往隊列加入元素為例說明如何正確地使用CString: CString str = _T("new text");LVITEM item = {0};item.mask = LVIF_TEXT; item.iItem = 1; item.pszText = (LPTSTR)(LPCTSTR) str; // 錯! item.pszText = str.GetBuffer(0); // 正確ListView_SetItem ( &item ); str.ReleaseBuffer(); // 將隊列返回給strpszText成員是LPTSTR,一個非常量指標,因此要用str的GetBuffer()。GetBuffer()的參數是CString分配的最小緩衝區。如果要分配一個1K的TCHAR,調用GetBuffer(1024)。參數為0,只返回指向字串的指標。 上面樣本的出錯語句可以通過編譯,甚至可以正常工作,如果恰好就是這個類型。但這不證明文法正確。進行非常量的強制類型轉換,打破了物件導向的封裝原則,並逾越了CString的內部操作。如果你習慣進行這樣的強制類型轉換,終會遇到出錯,可你未必知道錯在何處,因為你到處都在做這樣的轉換,而代碼也都能運行。 |