锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍓嶈█錛氫覆鎿嶄綔鏄紪紼嬩腑鏈甯哥敤涔熸渶鍩烘湰鐨勬搷浣滀箣涓銆?鍋氫負VC紼嬪簭鍛橈紝鏃犺鏄彍楦熸垨楂樻墜閮芥浘鐢ㄨ繃Cstring銆傝屼笖濂藉儚瀹為檯緙栫▼涓緢闅劇寰楀紑瀹冿紙铏界劧瀹冧笉鏄爣鍑嗭跡++涓殑搴擄級銆傚洜涓篗FC涓彁渚涚殑榪欎釜綾誨鎴戜滑鎿嶄綔瀛椾覆瀹炲湪澶柟渚夸簡錛孋String涓嶄粎鎻愪緵鍚勭涓板瘜鐨勬搷浣滃嚱鏁般佹搷浣滅閲嶈澆錛屼嬌鎴戜滑浣跨敤璧蜂覆璧鋒潵鏇磋薄basic涓偅鏍風洿瑙傦紱鑰屼笖瀹冭繕鎻愪緵浜嗗姩鎬佸唴瀛樺垎閰嶏紝浣挎垜浠噺灝戜簡澶氬皯瀛楃涓叉暟緇勮秺鐣岀殑闅愭?zhèn)c備絾鏄紝鎴戜滑鍦ㄤ嬌鐢ㄨ繃紼嬩腑涔熶綋浼氬埌CString綆鐩村お瀹規(guī)槗鍑洪敊浜嗭紝鑰屼笖鏈夌殑涓嶅彲鎹夋懜銆傛墍浠ユ湁璁稿楂樹漢绔欒繃鏉ワ紝寤鴻鎶涘純瀹冦?
鍦ㄦ錛屾垜涓漢璁や負錛欳String灝佽寰楃‘瀹炲緢瀹岀編錛屽畠鏈夎澶氫紭鐐癸紝濡?#8220;瀹規(guī)槗浣跨敤 錛屽姛鑳藉己錛屽姩鎬佸垎閰嶅唴瀛橈紝澶ч噺榪涜鎷瘋礉鏃跺畠寰堣兘鑺傜渷鍐呭瓨璧勬簮騫朵笖鎵ц鏁堢巼楂橈紝涓庢爣鍑嗭跡瀹屽叏鍏煎錛屽悓鏃舵敮鎸佸瀛楄妭涓庡瀛楄妭錛岀敱浜庢湁寮傚父鏈哄埗鎵浠ヤ嬌鐢ㄥ畠瀹夊叏鏂逛究” 鍏跺疄錛屼嬌鐢ㄨ繃紼嬩腑涔嬫墍浠ュ鏄撳嚭閿欙紝閭f槸鍥犱負鎴戜滑瀵瑰畠浜嗚В寰楄繕涓嶅錛岀壒鍒槸瀹冪殑瀹炵幇鏈哄埗銆傚洜涓烘垜浠腑鐨勫ぇ澶氭暟浜猴紝鍦ㄥ伐浣滀腑騫朵笉閭d箞鐖辨繁鍏ュ湴鍘葷湅鍏充簬瀹冪殑鏂囨。錛屼綍鍐靛畠榪樻槸鑻辨枃鐨勩?
鐢變簬鍓嶅嚑澶╂垜鍦ㄥ伐浣滀腑閬囧埌浜嗕竴涓湰涓嶆槸闂浣嗗嵈鐗瑰埆媯樻墜銆佺壒鍒毦瑙e喅鑰屼笖鑾悕鎯婅鐨勯棶棰樸傚ソ鏉ユ渶鍚庡彂鐜版槸鐢變簬CString寮曞彂鐨勩傛墍浠ユ病鍔炴硶錛屾垜鎶婃暣涓狢String鐨勫疄鐜板叏閮ㄧ湅浜嗕竴閬嶏紝鎵嶆厡鐒跺ぇ鎮(zhèn)燂紝騫跺交搴曞紕娓呬簡闂鐨勫師鍥?榪欎釜闂錛屾垜宸插湪csdn涓婂紑璐?銆傚湪姝わ紝鎴戞兂鎶婃垜鐨勪竴浜涘叧浜嶤String鐨勭煡璇嗘葷粨涓鐣紝浠ヤ緵浠栵紙濂癸級浜哄熼壌錛屼篃璁稿叾涓湁鎴戠悊瑙d笂鐨勯敊璇紝鏈涘彂鐜拌呰兘閫氱煡鎴戯紝涓嶈儨鎰熻阿銆?/p>
1錛?CString瀹炵幇鐨勬満鍒?
CString鏄氳繃“寮曠敤”鏉ョ鐞嗕覆鐨勶紝“寮曠敤”榪欎釜璇嶆垜鐩鎬俊澶у騫朵笉闄岀敓錛岃薄Window鍐呮牳瀵硅薄銆丆OM瀵硅薄絳夐兘鏄氳繃寮曠敤鏉ュ疄鐜扮殑銆傝孋String涔熸槸閫氳繃榪欐牱鐨勬満鍒舵潵綆$悊鍒嗛厤鐨勫唴瀛樺潡銆傚疄闄呬笂CString瀵硅薄鍙湁涓涓寚閽堟垚鍛樺彉閲?鎵浠ヤ換浣旵String瀹炰緥鐨勯暱搴﹀彧鏈?瀛楄妭.
鍗? int len = sizeof(CString);//len絳変簬4
榪欎釜鎸囬拡鎸囧悜涓涓浉鍏崇殑寮曠敤鍐呭瓨鍧楋紝濡傚浘: CString str("abcd");
‘A’
‘B’
‘C’
‘D’
0
0x04040404 head閮紝涓哄紩鐢ㄥ唴瀛樺潡鐩稿叧淇℃伅
str 0x40404040
姝e洜涓哄姝わ紝涓涓繖鏍風殑鍐呭瓨鍧楀彲琚涓狢String鎵寮曠敤錛屼緥濡備笅鍒椾唬鐮侊細
CString str("abcd");
CString a = str;
CString b(str);
CString c;
c = b;
涓婇潰浠g爜鐨勭粨鏋滄槸錛氫笂闈㈠洓涓璞?str,a,b,c)涓殑鎴愬憳鍙橀噺鎸囬拡鏈夌浉鍚岀殑鍊鹼紝閮戒負0x40404040.鑰岃繖鍧楀唴瀛樺潡鎬庝箞鐭ラ亾鏈夊灝戜釜CString寮曠敤瀹冨憿錛熷悓鏍鳳紝瀹冧篃浼氳褰曚竴浜涗俊鎭傚琚紩鐢ㄦ暟錛屼覆闀垮害錛屽垎閰嶅唴瀛橀暱搴︺?/p>
榪欏潡寮曠敤鍐呭瓨鍧楃殑緇撴瀯瀹氫箟濡備笅錛?/p>
struct CStringData
{
long nRefs; //琛ㄧず鏈夊灝戜釜CString 寮曠敤瀹? 4
int nDataLength; //涓插疄闄呴暱搴? 4
int nAllocLength; //鎬誨叡鍒嗛厤鐨勫唴瀛橀暱搴︼紙涓嶈榪欏ご閮ㄧ殑12瀛楄妭錛? 4
};
鐢變簬鏈変簡榪欎簺淇℃伅錛孋String灝辮兘姝g‘鍦板垎閰嶃佺鐞嗐侀噴鏀懼紩鐢ㄥ唴瀛樺潡銆?/p>
濡傛灉浣犳兂鍦ㄨ皟璇曠▼搴忕殑鏃跺欒幏寰楄繖浜涗俊鎭傚彲浠ュ湪Watch紿楀彛閿叆涓嬪垪琛ㄨ揪寮忥細
(CStringData*)((CStringData*)(this->m_pchData)-1)鎴?/p>
(CStringData*)((CStringData*)(str.m_pchData)-1)//str涓烘寚CString瀹炰緥
姝e洜涓洪噰鐢ㄤ簡榪欐牱鐨勫ソ鏈哄埗錛屼嬌寰桟String鍦ㄥぇ閲忔嫹璐濇椂錛屼笉浠呮晥鐜囬珮錛岃屼笖鍒嗛厤鍐呭瓨灝戙?/p>
2錛嶭PCTSTR 涓?GetBuffer(int nMinBufLength)
榪欎袱涓嚱鏁版彁渚涗簡涓庢爣鍑咰鐨勫吋瀹硅漿鎹€傚湪瀹為檯涓嬌鐢ㄩ鐜囧緢楂橈紝浣嗗嵈鏄渶瀹規(guī)槗鍑洪敊鐨勫湴鏂廣傝繖涓や釜鍑芥暟瀹為檯涓婅繑鍥炵殑閮芥槸鎸囬拡錛屼絾瀹冧滑鏈変綍鍖哄埆鍛紵浠ュ強璋冪敤瀹冧滑鍚庯紝騫曞悗鏄仛浜嗘庢牱鐨勫鐞嗚繃紼嬪憿錛?/p>
(1) LPCTSTR 瀹冪殑鎵ц榪囩▼鍏跺疄寰堢畝鍗曪紝鍙槸榪斿洖寮曠敤鍐呭瓨鍧楃殑涓插湴鍧銆?瀹冩槸浣滀負鎿嶄綔絎﹂噸杞芥彁渚涚殑錛屾墍浠ュ湪浠g爜涓湁鏃跺彲浠ラ殣寮忚漿鎹紝鑰屾湁鏃跺嵈闇寮哄埗杞埗銆傚錛?/p>
CString str;
const char* p = (LPCTSTR)str;
//鍋囪鏈夎繖鏍風殑涓涓嚱鏁幫紝Test(const char* p)錛?浣犲氨鍙互榪欐牱璋冪敤
Test(str);//榪欓噷浼氶殣寮忚漿鎹負LPCTSTR
(2) GetBuffer(int nMinBufLength) 瀹冪被浼鹼紝涔熶細榪斿洖涓涓寚閽堬紝涓嶈繃瀹冩湁鐐瑰樊鍒?榪斿洖鐨勬槸LPTSTR
(3) 榪欎袱鑰呭埌搴曟湁浣曚笉鍚屽憿錛熸垜鎯沖憡璇夊ぇ瀹訛紝鍏舵湰璐ㄤ笂瀹屽叏涓嶄竴鏍鳳紝涓鑸LPCTSTR杞崲鍚庡彧搴旇褰撳父閲忎嬌鐢紝鎴栬呭仛鍑芥暟鐨勫叆鍙傦紱鑰孏etBuffer(...)鍙栧嚭鎸囬拡鍚庯紝鍙互閫氳繃榪欎釜鎸囬拡鏉ヤ慨鏀歸噷闈㈢殑鍐呭錛屾垨鑰呭仛鍑芥暟鐨勫嚭鍙傘備負浠涔堝憿錛熶篃璁哥粡甯告湁榪欐牱鐨勪唬鐮侊細
CString str("abcd");
char* p = (char*)(const char*)str;
p[2] = 'z';
鍏跺疄錛屼篃璁告湁榪欐牱鐨勪唬鐮佸悗錛屼綘鐨勭▼搴忓茍娌℃湁閿欙紝鑰屼笖紼嬪簭涔熻繍琛屽緱鎸哄ソ銆備絾瀹冨嵈鏄潪甯稿嵄闄╃殑銆傚啀鐪?/p>
CString str("abcd");
CString test = str;
....
char* p = (char*)(const char*)str;
p[2] = 'z';
strcpy(p, "akfjaksjfakfakfakj");//榪欎笅瀹岃泲浜?
浣犵煡閬撴鏃訛紝test涓殑鍊兼槸澶氬皯鍚楋紵絳旀鏄?abzd"銆傚畠涔熻窡鐫鏀瑰彉浜嗭紝榪欎笉鏄綘鎵鏈熸湜鍙戠敓鐨勩備絾涓轟粈涔堜細榪欐牱鍛紵浣犵◢寰兂鎯沖氨浼氭槑鐧斤紝鍓嶉潰璇磋繃錛屽洜涓篊String鏄寚鍚戝紩鐢ㄥ潡鐨勶紝str涓巘est鎸囧悜鍚屼竴鍧楀湴鏂?褰撲綘p[2]='z'鍚庯紝褰撶劧test涔熶細闅忕潃鏀瑰彉銆傛墍浠ョ敤瀹冨仛LPCTSTR鍋氳漿鎹㈠悗錛屼綘鍙兘鍘昏榪欏潡鏁版嵁錛屽崈涓囧埆鍘繪敼鍙樺畠鐨勫唴瀹廣?/p>
鍋囧鎴戞兂鐩存帴閫氳繃鎸囬拡鍘諱慨鏀規(guī)暟鎹殑璇濓紝閭f庢牱鍔炲憿錛熷氨鏄敤GetBuffer(...).鐪嬩笅榪頒唬鐮侊細
CString str("abcd");
CString test = str;
....
char* p = str.GetBuffer(20);
p[2] = 'z'; // 鎵ц鍒版錛岀幇鍦╰est涓煎嵈浠嶆槸"abcd"
strcpy(p, "akfjaksjfakfakfakj"); // 鎵ц鍒版錛岀幇鍦╰est涓艱繕鏄?abcd"
涓轟粈涔堜細榪欐牱錛熷叾瀹濭etBuffer(20)璋冪敤鏃訛紝瀹冨疄闄呬笂鍙﹀寤虹珛浜嗕竴鍧楁柊鍐呭潡瀛橈紝騫跺垎閰?0瀛楄妭闀垮害鐨刡uffer錛岃屽師鏉ョ殑鍐呭瓨鍧楀紩鐢ㄨ鏁頒篃鐩稿簲鍑?. 鎵浠ユ墽琛屼唬鐮佸悗str涓巘est鏄寚鍚戜簡涓ゅ潡涓嶅悓鐨勫湴鏂癸紝鎵浠ョ浉瀹夋棤浜嬨?/p>
(4) 涓嶈繃榪欓噷榪樻湁涓鐐規(guī)敞鎰忎簨欏癸細灝辨槸str.GetBuffer(20)鍚庯紝str鐨勫垎閰嶉暱搴︿負20錛屽嵆鎸囬拡p瀹冩墍鎸囧悜鐨刡uffer鍙湁20瀛楄妭闀匡紝緇欏畠璧嬪兼椂錛屽垏涓嶅彲瓚呰繃錛屽惁鍒欑伨闅劇浣犱笉榪滀簡錛涘鏋滄寚瀹氶暱搴﹀皬浜庡師鏉ヤ覆闀垮害錛屽GetBuffer(1),瀹為檯涓婂畠浼氬垎閰?涓瓧鑺傞暱搴︼紙鍗沖師鏉ヤ覆闀垮害錛夛紱鍙﹀錛屽綋璋冪敤GetBuffer(...)鍚庡茍鏀瑰彉鍏跺唴瀹癸紝涓瀹氳璁板緱璋冪敤ReleaseBuffer(),榪欎釜鍑芥暟浼氭牴鎹覆鍐呭鏉ユ洿鏂板紩鐢ㄥ唴瀛樺潡鐨勫ご閮ㄤ俊鎭?/p>
(5) 鏈鍚庤繕鏈変竴娉ㄦ剰浜嬮」錛岀湅涓嬭堪浠g爜錛?/p>
char* p = NULL;
const char* q = NULL;
{
CString str = "abcd";
q = (LPCTSTR)str;
p = str.GetBuffer(20);
AfxMessageBox(q);// 鍚堟硶鐨?/p>
strcpy(p, "this is test");//鍚堟硶鐨勶紝
}
AfxMessageBox(q);// 闈炴硶鐨勶紝鍙兘瀹岃泲
strcpy(p, "this is test");//闈炴硶鐨勶紝鍙兘瀹岃泲
榪欓噷瑕佽鐨勫氨鏄紝褰撹繑鍥炶繖浜涙寚閽堝悗錛?濡傛灉CString瀵硅薄鐢熷懡緇撴潫錛岃繖浜涙寚閽堜篃鐩稿簲鏃犳晥銆?/p>
3錛庢嫹璐?& 璧嬪?& "寮曠敤鍐呭瓨鍧? 浠涔堟椂鍊欓噴鏀撅紵
涓嬮潰婕旂ず涓孌典唬鐮佹墽琛岃繃紼?/p>
void Test()
{
CString str("abcd");
//str鎸囧悜涓寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
CString a;
//a鎸囧悜涓鍒濆鏁版嵁鐘舵侊紝
a = str;
//a涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
CString b(a);
//a銆乥涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
{
LPCTSTR temp = (LPCTSTR)a;
//temp鎸囧悜寮曠敤鍐呭瓨鍧楃殑涓查鍦板潃銆傦紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
CString d = a;
//a銆乥銆乨涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?, 闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
b = "testa";
//榪欐潯璇彞瀹為檯鏄皟鐢–String::operator=(CString&)鍑芥暟銆?b鎸囧悜涓鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧椼傦紙鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧楃殑 寮曠敤璁℃暟涓?, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?/p>
//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. a銆乨涓巗tr浠嶆寚鍚戝師 寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?
}
//鐢變簬d鐢熷懡緇撴潫錛岃皟鐢ㄦ瀽鏋勫嚱鏁幫紝瀵艱嚦寮曠敤璁℃暟鍑?錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負2,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/p>
LPTSTR temp = a.GetBuffer(10);
//姝よ鍙ヤ篃浼氬鑷撮噸鏂板垎閰嶆柊鍐呭瓨鍧椼倀emp鎸囧悜鏂板垎閰嶅紩鐢ㄥ唴瀛樺潡鐨勪覆棣栧湴鍧錛堟柊 鍒嗛厤鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0錛?/p>
//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. 鍙湁str浠?鎸囧悜鍘熷紩鐢ㄥ唴瀛樺潡 錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?
strcpy(temp, "temp");
//a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0 a.ReleaseBuffer();//娉ㄦ剰:a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0
}
//鎵ц鍒版錛屾墍鏈夌殑灞閮ㄥ彉閲忕敓鍛藉懆鏈熼兘宸茬粨鏉熴傚璞tr a b 鍚勮嚜璋冪敤鑷繁鐨勬瀽鏋勬瀯
//鍑芥暟錛屾墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡涔熺浉搴斿噺1
//娉ㄦ剰錛宻tr a b 鎵鍒嗗埆鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勮鏁板潎涓?,榪欏鑷存墍鍒嗛厤鐨勫唴瀛樺潡閲婃斁
閫氳繃瑙傚療涓婇潰鎵ц榪囩▼錛屾垜浠細鍙戠幇CString铏界劧鍙互澶氫釜瀵硅薄鎸囧悜鍚屼竴寮曠敤鍐呭潡瀛橈紝浣嗘槸瀹冧滑鍦ㄨ繘琛屽悇縐嶆嫹璐濄佽祴鍊煎強鏀瑰彉涓插唴瀹規(guī)椂錛屽畠鐨勫鐞嗘槸寰堟櫤鑳藉茍涓旈潪甯稿畨鍏ㄧ殑錛屽畬鍏ㄥ仛鍒頒簡浜掍笉騫叉秹銆佷簰涓嶅獎鍝嶃傚綋鐒跺繀欏昏姹備綘鐨勪唬鐮佷嬌鐢ㄦ紜伆褰擄紝鐗瑰埆鏄疄闄呬嬌鐢ㄤ腑浼氭湁鏇村鏉傜殑鎯呭喌錛屽鍋氬嚱鏁板弬鏁般佸紩鐢ㄣ佸強鏈夋椂闇淇濆瓨鍒癈StringList褰撲腑錛屽鏋滃摢鎬曟湁涓灝忓潡鍦版柟浣跨敤涓嶅綋錛屽叾緇撴灉涔熶細瀵艱嚧鍙戠敓涓嶅彲棰勭煡鐨勯敊璇?/p>
5 FreeExtra()鐨勪綔鐢?/p>
鐪嬭繖孌典唬鐮?/p>
(1) CString str("test");
(2) LPTSTR temp = str.GetBuffer(50);
(3) strcpy(temp, "there are 22 character");
(4) str.ReleaseBuffer();
(5) str.FreeExtra();
涓婇潰浠g爜鎵ц鍒扮(4)琛屾椂錛屽ぇ瀹墮兘鐭ラ亾str鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟涓?,闀垮害涓?2,鍒嗛厤闀垮害涓?0. 閭d箞鎵цstr.FreeExtra()鏃訛紝瀹冧細閲婃斁鎵鍒嗛厤鐨勫浣欑殑鍐呭瓨銆?寮曠敤鍐呭瓨鍧楄鏁頒負1,闀垮害涓?2,鍒嗛厤闀垮害涓?2)
6 Format(...) 涓?FormatV(...)
榪欐潯璇彞鍦ㄤ嬌鐢ㄤ腑鏄渶瀹規(guī)槗鍑洪敊鐨勩傚洜涓哄畠鏈瀵屾湁鎶宸фэ紝涔熺浉褰撶伒媧匯傚湪榪欓噷錛屾垜娌℃墦綆楀瀹冪粏緇嗗垎鏋愶紝瀹為檯涓妔printf(...)鎬庝箞鐢紝瀹冨氨鎬庝箞鐢ㄣ傛垜鍙彁閱掍嬌鐢ㄦ椂闇娉ㄦ剰涓鐐癸細灝辨槸瀹冪殑鍙傛暟鐨勭壒孌婃э紝鐢變簬緙栬瘧鍣ㄥ湪緙栬瘧鏃跺茍涓嶈兘鍘繪牎楠屾牸寮忎覆鍙傛暟涓庡搴旂殑鍙樺厓鐨勭被鍨嬪強闀垮害銆傛墍浠ヤ綘蹇呴』瑕佹敞鎰忥紝涓よ呬竴瀹氳瀵瑰簲涓婏紝
鍚﹀垯灝變細鍑洪敊銆傚錛?/p>
CString str;
int a = 12;
str.Format("first:%l, second: %s", a, "error");//result?璇曡瘯
7 LockBuffer() 涓?UnlockBuffer()
欏懼悕鎬濊錛岃繖涓や釜鍑芥暟鐨勪綔鐢ㄥ氨鏄寮曠敤鍐呭瓨鍧楄繘琛屽姞閿佸強瑙i攣銆備絾浣跨敤瀹冩湁浠涔堜綔鐢ㄥ強鎵ц榪囧畠鍚庡CString涓叉湁浠涔堝疄璐ㄤ笂鐨勫獎鍝嶃傚叾瀹炴尯綆鍗曪紝鐪嬩笅闈唬鐮?
(1) CString str("test");
(2) str.LockBuffer();
(3) CString temp = str;
(4) str.UnlockBuffer();
(5) str.LockBuffer();
(6) str = "error";
(7) str.ReleaseBuffer();
鎵ц瀹?3)鍚庯紝涓庨氬父鎯呭喌涓嬩笉鍚岋紝temp涓巗tr騫朵笉鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧椼備綘鍙互鍦╳atch紿楀彛鐢ㄨ繖涓〃杈懼紡(CStringData*)((CStringData*)(str.m_pchData)-1)鐪嬬湅銆?/p>
鍏跺疄鍦╩sdn涓湁璇存槑錛?/p>
While in a locked state, the string is protected in two ways:
No other string can get a reference to the data in the locked string, even if that string is assigned to the locked string.
The locked string will never reference another string, even if that other string is copied to the locked string.
8 CString 鍙槸澶勭悊涓插悧錛?/p>
涓嶅錛孋String涓嶅彧鏄兘鎿嶄綔涓詫紝鑰屼笖榪樿兘澶勭悊鍐呭瓨鍧楁暟鎹傚姛鑳藉畬鍠勫惂錛佺湅榪欐浠g爜
char p[20];
for(int loop=0; loop<sizeof(p); loop++)
{
p[loop] = 10-loop;
}
CString str((LPCTSTR)p, 20);
char temp[20];
memcpy(temp, str, str.GetLength());
str瀹屽叏鑳藉杞澆鍐呭瓨鍧梡鍒板唴瀛樺潡temp涓傛墍浠ヨ兘鐢–String鏉ュ鐞嗕簩榪涘埗鏁版嵁
8 AllocSysString()涓嶴etSysString(BSTR*)
榪欎袱涓嚱鏁版彁渚涗簡涓蹭笌BSTR鐨勮漿鎹€備嬌鐢ㄦ椂欏繪敞鎰忎竴鐐癸細褰撹皟鐢ˋllocSysString()鍚庯紝欏昏皟鐢ㄥ畠SysFreeString(...)
9 鍙傛暟鐨勫畨鍏ㄦ楠?/p>
鍦∕FC涓彁渚涗簡澶氫釜瀹忔潵榪涜鍙傛暟鐨勫畨鍏ㄦ鏌ワ紝濡傦細ASSERT. 鍏朵腑鍦–String涓篃涓嶄緥澶栵紝鏈夎澶氳繖鏍風殑鍙傛暟媯楠岋紝鍏跺疄榪欎篃璇存槑浜嗕唬鐮佺殑瀹夊叏鎬ч珮錛屽彲鏈夋椂鎴戜滑浼氬彂鐜拌繖寰堢儲錛屼篃瀵艱嚧Debug涓嶳elease鐗堟湰涓嶄竴鏍鳳紝濡傛湁鏃剁▼搴廌ebug閫氭甯革紝鑰孯elease鍒欑▼搴忓穿婧冿紱鑰屾湁鏃舵伆鐩稿弽錛孌ebug涓嶈錛孯elease琛屻傚叾瀹炴垜涓漢璁や負錛屾垜浠CString鐨勪嬌鐢ㄨ繃紼嬩腑錛屽簲鍔涙眰浠g爜璐ㄩ噺楂橈紝涓嶈兘鍦―ebug鐗堟湰涓嚭鐜頒換浣曟柇璦妗嗭紝鍝時elease榪愯浼間箮鐪嬭搗鏉ヤ竴鍒囨甯搞備絾寰堜笉瀹夊叏銆傚涓嬩唬鐮侊細
(1) CString str("test");
(2) str.LockBuffer();
(3) LPTSTR temp = str.GetBuffer(10);
(4) strcpy(temp, "error");
(5) str.ReleaseBuffer();
(6) str.ReleaseBuffer();//鎵ц鍒版鏃訛紝Debug鐗堟湰浼氬脊鍑洪敊妗?/p>
10 CString鐨勫紓甯稿鐞?/p>
鎴戝彧鎯沖己璋冧竴鐐癸細鍙湁鍒嗛厤鍐呭瓨鏃訛紝鎵嶆湁鍙兘瀵艱嚧鎶涘嚭CMemoryException.
鍚屾牱錛屽湪msdn涓殑鍑芥暟澹版槑涓紝娉ㄦ湁throw( CMemoryException)鐨勫嚱鏁伴兘鏈夐噸鏂板垎閰嶆垨璋冩暣鍐呭瓨鐨勫彲鑳姐?/p>
11 璺ㄦā鍧楁椂鐨凜string銆傚嵆涓涓狣LL鐨勬帴鍙e嚱鏁頒腑鐨勫弬鏁頒負CString&鏃訛紝瀹冧細鍙戠敓鎬庢牱鐨勭幇璞°傝В絳旀垜閬囧埌鐨勯棶棰樸傛垜鐨勯棶棰樺師鏉ュ凡緇忓彂璐達紝鍦板潃涓猴細
http://www.csdn.net/expert/topic/741/741921.xml?temp=.2283136
鏋勯犱竴涓繖鏍稢String瀵硅薄鏃訛紝濡侰String str錛屼綘鍙煡閬撴鏃剁殑str鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鍚楋紵涔熻浣犱細璁や負瀹冩寚鍚慛ULL銆傚叾瀹炰笉瀵癸紝濡傛灉榪欐牱鐨勮瘽錛孋String鎵閲囩敤鐨勫紩鐢ㄦ満鍒剁鐞嗗唴瀛樺潡灝變細鏈夐夯鐑︿簡錛屾墍浠String鍦ㄦ瀯閫犱竴涓┖涓茬殑瀵硅薄鏃訛紝瀹冧細鎸囧悜涓涓浐瀹氱殑鍒濆鍖栧湴鍧錛岃繖鍧楁暟鎹殑澹版槑濡備笅錛?/p>
AFX_STATIC_DATA int _afxInitData[] = {-1,0,0,0};
綆瑕佹弿榪版鎷竴涓嬶細褰撴煇涓狢String瀵硅薄涓茬疆絀虹殑璇濓紝濡侲mpty(),CString a絳夛紝瀹冪殑鎴愬憳鍙橀噺m_pchData灝變細鎸囧悜_afxInitData榪欎釜鍙橀噺鐨勫湴鍧銆傚綋榪欎釜CString瀵硅薄鐢熷懡鍛ㄦ湡緇撴潫鏃訛紝姝e父鎯呭喌涓嬪畠浼氬幓瀵規(guī)墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟鍑?錛屽鏋滃紩鐢ㄨ鏁頒負0(鍗蟲病鏈変換浣旵String寮曠敤瀹冩椂)錛屽垯閲婃斁榪欏潡寮曠敤鍐呭瓨銆傝岀幇鍦ㄧ殑鎯呭喌鏄鏋淐String鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鏄垵濮嬪寲鍐呭瓨鍧楁椂錛屽垯涓嶄細閲婃斁浠諱綍鍐呭瓨銆?/p>
璇翠簡榪欎箞澶氾紝榪欎笌鎴戦亣鍒扮殑闂鏈変粈涔堝叧緋誨憿錛熷叾瀹炲叧緋誨ぇ鐫鍛紵鍏剁湡姝e師鍥犲氨鏄鏋渆xe妯″潡涓巇ll妯″潡鏈変竴涓槸static緙栬瘧榪炴帴鐨勮瘽銆傞偅涔堣繖涓狢String鍒濆鍖栨暟鎹湪exe妯″潡涓巇ll妯″潡涓湁涓嶅悓鐨勫湴鍧錛屽洜涓簊tatic榪炴帴鍒欎細鍦ㄦ湰妯″潡涓湁涓浠芥簮浠g爜鐨勬嫹璐濄傚彟澶栦竴縐嶆儏鍐碉紝濡傛灉涓や釜妯″潡閮芥槸share榪炴帴鐨勶紝CString鐨勫疄鐜頒唬鐮佸垯鍦ㄥ彟涓涓崟鐙殑dll涓疄鐜幫紝鑰孉FX_STATIC_DATA鎸囧畾鍙橀噺鍙涓嬈★紝鎵浠ヤ袱涓ā鍧椾腑_afxInitData鏈夌浉鍚岀殑鍦板潃銆?/p>
鐜板湪闂瀹屽叏鏄庣櫧浜嗗惂錛佷綘鍙互鑷繁鍘繪紨紺轟竴涓嬨?/p>
__declspec (dllexport) void test(CString& str)
{
str = "abdefakdfj";//濡傛灉鏄痵tatic榪炴帴錛屽茍涓斾紶鍏ョ殑str涓虹┖涓茬殑璇濓紝榪欓噷鍑洪敊銆?/p>
}
鏈鍚庝竴鐐規(guī)兂娉曪細鍐欏緱榪欓噷錛屽叾瀹濩String涓繕鏈夎澶氭妧宸фх殑濂戒笢涓滐紝鎴戝茍娌″幓瑙i噴銆傚寰堝閲嶈澆鐨勬搷浣滅銆佹煡鎵劇瓑銆傛垜璁や負榪樻槸璇︾粏鐪嬬湅msdn錛岃繖鏍蜂篃璁鎬細姣旀垜璁茬殑濂藉浜嗐傛垜鍙晶閲嶉偅浜涘彲鑳戒細鍑洪敊鐨勬儏鍐點傚綋鐒訛紝濡傛垜涓婇潰鍙欒堪涓湁閿欒錛屾暚璇烽珮鎵嬫寚鐐癸紝涓嶈儨鎰熻阿錛?/p>
msdn錛?a >http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring_class_members.asp