锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 澶ч儴鍒嗕漢閮藉惉璇磋繃auto_ptr鎸囬拡錛屼絾鏄茍闈炴墍鏈変漢閮芥瘡澶╀嬌鐢ㄥ畠銆備笉浣跨敤瀹冩槸涓嶆槑鏅虹殑錛堝彲鑰葷殑錛夛紝鍥犱負(fù)auto_ptr鐨勮璁″垵琛鋒槸涓轟簡瑙e喅C++璁捐鍜岀紪鐮佺殑鏅亶闂錛屽皢瀹冪敤濂藉彲浠ュ啓鍑烘洿鍋ュ.鐨勪唬鐮併傛湰鏂囨寚鍑哄浣曟紜嬌鐢╝uto_ptr浠ヤ嬌紼嬪簭鍙樺緱瀹夊叏錛屼互鍙?qiáng)濡備綍閬垮紑鍗遍櫓錛岃屼笉鏄竴鑸嬌鐢╝uto_ptr鐨勬伓涔?fàn)鎵鑷寸殑鍒涘緩闂存瓏鎬у拰闅句互璇婃柇鐨勯棶棰樸? auto_ptr鍙槸璁歌澶氬鏅鴻兘鎸囬拡涓殑涓縐嶃傝澶氬晢涓氬簱鎻愪緵璁稿鏇村己澶х殑鏅鴻兘鎸囬拡錛屽彲浠ュ畬鎴愭洿澶氱殑浜嬫儏銆備粠鍙互綆$悊寮曠敤璁℃暟鍒版彁渚涙洿鍏堣繘鐨勪唬鐞嗘湇鍔$瓑銆傚簲璇ユ妸auto_ptr璁や負(fù)鏄櫤鑳芥寚閽堜腑鐨勭鐗笶scort[娉ㄩ噴]錛氫竴涓熀浜庣畝鍗曚笖閫氱敤鐩殑鐨勬櫤鑳芥寚閽堬紝鏃㈡病鏈夊皬鍙戞槑涔熸病鏈変赴瀵岀殑鐗規(guī)畩鐩殑鏇翠笉闇瑕侀珮鎬ц兘錛屼絾鏄兘灝嗚澶氭櫘閫氱殑浜嬫儏鍋氬ソ錛屽茍涓旇兘澶熼傚悎鏃ュ父浣跨敤鐨勬櫤鑳芥寚閽堛? auto_ptr鍋氳繖鏍蜂竴浠朵簨錛氭嫢鏈変竴涓姩鎬佸垎閰嶅唴瀛樺璞★紝騫朵笖鍦ㄥ畠涓嶅啀闇瑕佺殑鏃跺欏飽琛岃嚜鍔ㄦ竻鐞嗙殑鑱岃矗銆傝繖閲屾湁涓病鏈変嬌鐢╝uto_ptr鎸囬拡鐨勪笉瀹夊叏鐨勪緥瀛愶細(xì) 鎴戜滑姣忓ぉ閮藉儚榪欐牱鍐欎唬鐮侊紝濡傛灉f()鍙槸涓涓笁琛岀▼搴忥紝涔熸病鍋氫粈涔堝浣欑殑浜嬫儏錛岃繖鏍峰仛褰撶劧鍙互寰堝ソ宸ヤ綔銆備絾鏄鏋渇()娌℃湁鎵цdelete璇彞錛屾瘮濡傜▼搴忔彁鍓嶈繑鍥烇紙return錛変簡錛屾垨鑰呭湪鎵ц鐨勬椂鍊欐姏鍑哄紓甯鎬簡錛岀劧鍚庡氨瀵艱嚧宸茬粡鍒嗛厤鐨勫璞℃病鏈夎鍒犻櫎錛屽洜姝ゆ垜浠氨鏈変簡涓涓粡鍏哥殑鍐呭瓨娉勬紡銆? 涓涓嬌Example錛?錛夊畨鍏ㄧ殑鍔炴硶鏄敤涓涓滄櫤鑳解濈殑鎸囬拡鎷ユ湁榪欎釜鎸囬拡錛屽綋閿姣佺殑鏃跺欙紝鍒犻櫎閭d釜琚寚鐨勮嚜鍔ㄥ垎閰嶇殑瀵硅薄銆傚洜涓鴻繖涓櫤鑳芥寚閽堣綆鍗曞湴鐢ㄤ負(fù)鑷姩瀵硅薄錛堣繖灝辨槸錛屽綋瀹冪寮瀹冪殑浣滅敤鍩熺殑鏃跺欒嚜鍔ㄩ攢姣佸璞★級錛屾墍浠ュ畠琚О浣溾滆嚜鍔ㄢ濇寚閽堛? 鐜板湪榪欐浠g爜灝嗕笉浼?xì)鍐峊瀵硅薄涓婂彂鐢熸硠婕忎簡錛屼笉蹇呭湪鎰忚繖涓柟娉曟槸姝e父閫鍑鴻繕鏄紓甯擱鍑猴紝鍥犱負(fù)pt鐨勬瀽鏋勫嚱鏁板皢鎬繪槸鍦ㄥ爢鏍堝脊鍑虹殑鏃跺欒璋冪敤銆傛竻鐞嗗伐浣滃皢鑷姩榪涜銆?/p>
鏈鍚庯紝浣跨敤auto_ptr鍜屼嬌鐢ㄥ唴寤烘寚閽堜竴鏍峰湴瀹規(guī)槗錛屽鏋滆鈥滄敹鍥炩濊祫婧愬茍涓斿啀嬈℃墜鍔ㄧ鐞嗙殑璇濓紝鎴戜滑鍙互璋冪敤release()錛?/p> 鏈鍚庯紝鎴戜滑鍙互浣跨敤auto_ptr鐨剅eset()鏂規(guī)硶灝哸uto_ptr閲嶇疆鍚戝彟涓涓璞°傚鏋渁uto_ptr宸茬粡鑾峰緱涓涓璞★紝榪欎釜榪囩▼灝卞儚鏄畠鍏堝垹闄ゅ凡緇忔嫢鏈夌殑瀵硅薄錛屽洜姝よ皟鐢╮eset()錛屽氨鍍忔槸鍏堥攢姣佷簡auto_ptr錛岀劧鍚庨噸寤轟簡涓涓柊鐨勫茍鎷ユ湁璇ユ柊瀵硅薄錛? 鍚屾牱錛宎uto_ptr涔熷彲浠ヨ鐢ㄤ簬瀹夊叏鍦板寘瑁呮寚閽堟暟鎹垚鍛樸傝冭檻涓嬮潰浣跨敤Pimpl idiom錛堟垨鑰咃紝緙栬瘧鍣ㄩ槻鐏錛夌殑渚嬪瓙錛?sup>[1] 綆鍗曞湴璇達(dá)紝灝辨槸C鐨勭鏈夌粏鑺傝瀹炵幇涓轟竴涓崟鐙殑瀵硅薄錛岃棌鍖夸簬涓涓寚閽堜箣涓傝鎬濊礬瑕佹眰C鐨勬瀯閫犲嚱鏁拌礋璐d負(fù)闅愯棌鍦ㄧ被鍐呴儴鐨勮緟鍔┾淧impl鈥濆璞″垎閰嶅唴瀛橈紝騫朵笖C鐨勬瀽鏋勫嚱鏁拌礋璐i攢姣佸畠銆備嬌鐢╝uto_ptr錛屾垜浠細(xì)鍙戠幇榪欓潪甯稿鏄擄細(xì) 鐜板湪錛屾瀽鏋勫嚱鏁頒笉闇瑕佹媴蹇冨垹闄impl_鎸囬拡浜嗭紝鍥犱負(fù)auto_ptr灝嗚嚜鍔ㄥ鐞嗗畠銆備簨瀹炰笂錛屽鏋滄病鏈夊叾瀹冮渶瑕佹樉寮忓啓鏋愭瀯鍑芥暟鐨勫師鍥狅紝鎴戜滑瀹屽叏涓嶉渶瑕佽嚜瀹氫箟鏋愭瀯鍑芥暟銆傛樉鐒訛紝榪欐瘮鎵嬪姩綆$悊鎸囬拡瑕佸鏄撳緱澶氾紝騫朵笖灝嗗璞℃墍鏈夋潈鍖呭惈榪涘璞℃槸涓涓笉閿欑殑涔?fàn)鎯Q岃繖姝f槸auto_ptr鎵鎿呴暱鐨勩傛垜浠皢鍦ㄦ渶鍚庡啀嬈″洖欏捐繖涓緥瀛愩? 瀹冩湰韜緢婕備寒錛屽茍涓斿仛寰楅潪甯稿ソ錛氫粠鍑芥暟浼犲叆鎴栦紶鍑?span style="font-family: 'Courier New'" class="Code">auto_ptrs錛屾槸闈炲父鏈夌敤鐨勶紝姣斿鍑芥暟鐨勫弬鏁版垨鑰呰繑鍥炲箋?/p>
璁╂垜浠湅鐪嬩負(fù)浠涔堬紝棣栧厛鎴戜滑鑰冭檻褰撴嫹璐漚uto_ptr鐨勬椂鍊欎細(xì)鍙戠敓浠涔堬細(xì)涓涓猘uto_ptr鑾峰緱涓涓嫢鏈夋寚閽堢殑瀵硅薄錛屽茍涓斿湪鍚屼竴鏃墮棿鍙厑璁告湁涓涓猘uto_ptr鍙互鎷ユ湁榪欎釜瀵硅薄銆傚綋浣犳嫹璐濅竴涓猘uto_ptr鐨勬椂鍊欙紝浣犺嚜鍔ㄥ皢婧恆uto_ptr鐨勬墍鏈夋潈錛屼紶閫掔粰鐩爣auto_ptr錛涘鏋滅洰鏍嘺uto_ptr宸茬粡鎷ユ湁浜嗕竴涓璞★紝榪欎釜瀵硅薄灝嗗厛琚噴鏀俱傚湪鎷瘋礉瀹屼箣鍚庯紝鍙湁鐩爣auto_ptr鎷ユ湁鎸囬拡錛屽茍涓旇礋璐e湪鍚堥傜殑鏃墮棿閿姣佸畠錛岃屾簮灝嗚璁劇疆涓虹┖錛坣ull錛夛紝騫朵笖涓嶈兘鍐嶈褰撲綔鍘熸湁鎸囬拡鐨勪唬琛ㄦ潵浣跨敤銆? 渚嬪錛?/p>
浣嗘槸瑕侀伩鍏嶉櫡闃卞啀嬈′嬌鐢ㄥ凡緇忓け鍘繪墍鏈夋潈鐨刟uto_ptr錛? 璋ㄨ浜庡績錛屾垜浠幇鍦ㄧ湅鐪媋uto_ptr濡備綍鍦ㄦ簮鍜岃皟鐢ㄨ呬箣闂村伐浣溿傗滄簮鈥濊繖閲屾槸鎸囦竴涓嚱鏁幫紝鎴栬呭叾瀹冨垱寤轟竴涓柊璧勬簮鐨勬搷浣滐紝騫朵笖閫氬父灝嗙Щ浜ゅ嚭璧勬簮鐨勬墍鏈夋潈銆備竴涓滆皟鐢ㄨ呪濆嚱鏁板弽杞繖涓叧緋伙紝涔熷氨鏄幏寰楀凡緇忓瓨鍦ㄥ璞$殑鎵鏈夋潈錛堝茍涓旈氬父榪樿礋璐i噴鏀懼畠錛夈傝屼笉鏄湁涓涓簮鍜岃皟鐢ㄨ咃紝榪斿洖騫朵笖鍒╃敤涓涓澶存寚閽堬紙璇戣呮敞錛氳屼笉鏄嬌鐢ㄤ竴涓眬閮ㄥ彉閲忔潵浼犻掕繖涓寚閽堬級錛岃櫧鐒訛紝閫氳繃涓涓澶存寚閽堟潵鑾峰緱涓涓祫婧愰氬父寰堝ソ錛? 娉ㄦ剰涓嬮潰鐨勫井濡欑殑鍙樺寲錛?
Source()鍒嗛厤浜嗕竴涓柊瀵硅薄騫朵笖浠ヤ竴涓畬鏁村畨鍏ㄧ殑鏂瑰紡灝嗗畠榪斿洖緇欒皟鐢ㄨ咃紝騫惰璋冪敤鑰呮垚涓烘寚閽堢殑鎷ユ湁鐫銆傚嵆浣胯皟鐢ㄨ呭拷鐣ヤ簡榪斿洖鍊鹼紙鏄劇劧錛屽鏋滆皟鐢ㄨ呭拷鐣ヤ簡榪斿洖鍊鹼紝浣犲簲璇ヤ粠鏉ユ病鏈夊啓榪囦唬鐮佹潵鍒犻櫎榪欎釜瀵硅薄錛屽鍚э紵錛夛紝鍒嗛厤鐨勫璞′篃灝嗚鑷姩瀹夊叏鍦板垹闄ゃ?/p>
鍦ㄦ湰鏂囩殑鏈鍚庯紝鎴戝皢婕旂ず榪斿洖涓涓猘uto_ptr鏄竴涓ソ涔?fàn)鎯傝榪斿洖鍊煎寘瑁硅繘涓浜涗笢瑗挎瘮濡俛uto_ptr閫氬父鏄嬌寰楀嚱鏁板彉寰楀己鍋ョ殑鏈夋晥鏂瑰紡銆? Sink()閫氳繃浼犲肩殑鏂瑰紡鑾峰緱瀵硅薄鎵鏈夋潈銆傚綋鎵ц瀹孲ink()鐨勬椂鍊欙紝褰撶寮浣滅敤鍩熺殑鏃跺欙紝鍒犻櫎鎿嶄綔灝嗚鎵ц錛堝彧瑕丼ink()娌℃湁灝嗘墍鏈夋潈杞Щ錛夈備笂闈㈡墍鍐欑殑Sink()鍑芥暟瀹為檯涓婂茍娌℃湁瀵瑰弬鏁板仛浠諱綍浜嬫儏錛屽洜姝よ皟鐢ㄢ淪ink(pt);鈥濆氨絳変簬鍐欎簡鈥減t.reset(0);鈥濓紝浣嗘槸澶ч儴鍒嗙殑Sink鍑芥暟閮藉皢鍦ㄩ噴鏀懼畠涔嬪墠鍋氫竴浜涘伐浣溿? 璋ㄨ錛氬崈涓囦笉瑕佷互鎴戜箣鍓嶆病鏈夋彁鍒扮殑鏂瑰紡浣跨敤auto_ptrs銆傛垜宸茬粡鐪嬭榪囧緢澶氱▼搴忓憳璇曠潃鐢ㄥ叾浠栨柟寮忓啓auto_ptrs灝卞儚浠栦滑鍦ㄤ嬌鐢ㄥ叾瀹冨璞′竴鏍楓備絾闂鏄痑uto_ptr騫朵笉鍍忓叾浠栧璞°傝繖閲屾湁浜涘熀鏈師鍒欙紝鎴戝皢鎶婂畠浠彁鍑烘潵浠ュ紩璧蜂綘鐨勬敞鎰忥細(xì) For auto_ptr, copies are NOT equivalent. 褰撲綘璇曠潃鍦ㄤ竴鑸殑浠g爜涓嬌鐢?span style="font-family: 'Courier New'" class="Code">auto_ptrs鐨勬椂鍊欙紝瀹冨皢鎵ц鎷瘋礉錛屽茍涓旀病鏈変換浣曟彁紺猴紝鎷瘋礉鏄笉鐩哥瓑鐨勶紙緇撴灉錛屽畠紜疄灝辨槸鎷瘋礉錛夈傜湅涓嬮潰榪欐浠g爜錛岃繖鏄垜鍦–++鏂伴椈緇勭粡甯哥湅瑙佺殑錛? 鍦ㄦ爣鍑嗗鍣ㄤ腑浣跨敤auto_ptrs鎬繪槸涓嶅畨鍏ㄧ殑銆備竴浜涗漢鍙兘瑕佸憡璇変綘錛屼粬浠殑緙栬瘧鍣ㄦ垨鑰呯被搴撹兘澶熷緢濂藉湴緙栬瘧瀹冧滑錛岃屽彟涓浜涗漢鍒欏憡璇変綘鍦ㄦ煇涓涓祦琛岀殑緙栬瘧鍣ㄧ殑鏂囨。涓湅鍒拌繖涓緥瀛愶紝涓嶈鍚粬浠殑銆? 闂鏄?span style="font-family: 'Courier New'" class="Code">auto_ptr騫朵笉瀹屽叏絎﹀悎涓涓彲浠ユ斁榪涘鍣ㄧ被鍨嬬殑鍓嶆彁錛屽洜涓烘嫹璐?span style="font-family: 'Courier New'" class="Code">auto_ptrs鏄笉絳変環(huán)鐨勩傞鍏堬紝娌℃湁浠諱綍涓滆タ璇存槑錛寁ector涓嶈兘鍐沖畾澧炲姞騫跺埗閫犲嚭鈥滄墿灞曗濈殑鍐呴儴鎷瘋礉銆傚啀嬈★紝褰撲綘璋冪敤涓涓竴鑸嚱鏁扮殑鏃跺欙紝瀹冨彲鑳戒細(xì)鎷瘋礉鍏冪礌錛屽氨鍍弒ort()閭f牱錛屽嚱鏁板繀欏繪湁鑳藉姏鍋囪鎷瘋礉鏄瓑浠風(fēng)殑銆傝嚦灝戜竴涓祦琛岀殑鎺掑簭鎷瘋礉鈥滄牳蹇冣濈殑鍏冪礌錛屽鏋滀綘璇曠潃璁╁畠涓?span style="font-family: 'Courier New'" class="Code">auto_ptrs涓璧峰伐浣滅殑璇濓紝瀹冨皢鎷瘋礉涓浠解滄牳蹇冣濈殑auto_ptr瀵硅薄錛堝洜姝よ漿縐繪墍鏈夋潈騫朵笖灝嗘墍鏈夋潈杞Щ緇欎竴涓復(fù)鏃跺璞★級錛岀劧鍚庡鍏朵綑鐨勫厓绱犱篃閲囧彇鐩稿悓鐨勬柟寮忥紙浠庣幇鏈夋垚鍛樺垱寤烘洿澶氱殑鎷ユ湁鎵鏈夋潈鐨刟uto_ptr錛夛紝褰撴帓搴忓畬鎴愬悗錛屾牳蹇冨厓绱犲皢琚攢姣侊紝騫朵笖浣犲皢閬囧埌涓涓棶棰橈細(xì)榪欑粍搴忓垪閲岃嚦灝戜竴涓猘uto_ptr錛堜篃灝辨槸鍒氭墠琚帀鍖呯殑閭d釜鏍稿績鍏冪礌錛変笉鍐嶆嫢鏈夊璞℃墍鏈夋潈錛岃岄偅涓湡瀹炵殑鎸囬拡宸茬粡闅忕潃涓存椂瀵硅薄鐨勯攢姣佽岃鍒犻櫎浜嗭紒 浜庢槸鏍囧噯濮斿憳浼?xì)鍥為騫跺笇鏈涘仛涓浜涜兘澶熷府鍔╀綘閬垮厤榪欎簺琛屼負(fù)鐨勪簨鎯咃細(xì)鏍囧噯鐨刟uto_ptr琚晠鎰忚璁℃垚褰撲綘甯屾湜鍦ㄤ嬌鐢ㄦ爣鍑嗗鍣ㄧ殑鏃跺欎嬌鐢ㄥ畠鏃舵墦鏂綘錛堟垨鑰咃紝鑷沖皯錛屽湪澶ч儴鍒嗙殑鏍囧噯搴撳疄鐜頒腑鎵撴柇浣狅級銆備負(fù)浜嗚揪鍒拌繖涓洰鐨勶紝鏍囧噯濮斿憳浼?xì)鍒╃敤杩欐牱涓涓妧宸э細(xì)璁?span style="font-family: 'Courier New'" class="Code">auto_ptr's鐨勬嫹璐濇瀯閫犲嚱鏁板拰璧嬪兼搷浣滅鐨勫彸鍊鹼紙rhs錛夋寚鍚戦潪甯擱噺銆傚洜涓烘爣鍑嗗鍣ㄧ殑鍗曞厓绱爄nsert()鍑芥暟錛岄渶瑕佷竴涓父閲忎綔涓哄弬鏁幫紝鍥犳auto_ptrs鍦ㄨ繖閲屽氨涓嶅伐浣滀簡銆傦紙璇戣呮敞錛氬彸鍊間笉鑳借祴鍊肩粰闈炲父閲忥級 灝嗕竴涓猘uto_ptr璁捐鎴?span style="font-family: 'Courier New'" class="Code">const auto_ptrs灝嗕笉鍐嶄涪澶辨墍鏈夋潈錛氭嫹璐濅竴涓猚onst auto_ptr鏄繚娉曠殑錛堣瘧鑰呮敞錛氭病鏈夎繖鏍風(fēng)殑鏋勯犲嚱鏁幫級錛屽疄闄呬笂浣犲彲浠ラ拡瀵瑰畠鍋氱殑鍞竴浜嬫儏灝辨槸閫氳繃operator*()鎴栬卭perator->()瑙e紩鐢ㄥ畠鎴栬呰皟鐢╣et()鏉ヨ幏寰楁墍鍖呭惈鐨勬寚閽堢殑鍊箋傝繖鎰忓懗鐫鎴戜滑鏈変竴涓畝鍗曟槑浜嗙殑椋庢牸鏉ヨ〃杈句竴涓粷涓嶄涪澶辨墍鏈夋潈鐨刟uto_ptr錛? 榪欏氨鏄垜瑕佽鐨刢osnt錛佸洜姝ゅ鏋滅幇鍦ㄤ綘瑕佸悜涓栫晫璇佹槑浣犵殑auto_ptr鏄笉浼?xì)琚敼鍙橋q朵笖灝嗘繪槸鍒犻櫎鍏舵墍鏈夋潈錛屽姞涓奵onst灝辨槸浣犺鍋氱殑銆俢onst auto_ptr椋庢牸鏄湁鐢ㄧ殑錛屼綘蹇呴』灝嗗畠璋ㄨ浜庡績銆? 鏈鍚庯紝auto_ptr瀵瑰啓鍑哄紓甯稿畨鍏ㄧ殑浠g爜鏈夋椂鍊欓潪甯稿繀瑕侊紝鎬濊冧笅闈㈢殑浠g爜錛?/p>
璇ュ嚱鏁版湁涓や釜鍙鐨勪綔鐢細(xì)瀹冭緭鍑轟竴浜涘唴瀹癸紝騫朵笖榪斿洖涓涓猄tring銆傚叧浜庡紓甯稿畨鍏ㄧ殑璇︾粏璇存槑瓚呭嚭浜嗘湰鏂囩殑鑼冨洿[2]錛屼絾鏄垜浠兂瑕佸彇寰楃殑鐩爣灝辨槸寮哄紓甯稿畨鍏ㄧ殑淇濋殰錛屽綊緇撲負(fù)紜繚鍑芥暟鐨勫師瀛愭р斺斿鏋滄湁寮傚父錛屾墍鏈夌殑浣滅敤涓璧峰彂鐢熸垨鑰呴兘涓嶅彂鐢熴? 铏界劧鍦ㄤ緥10(a)涓殑浠g爜闈炲父綺懼閥錛岀湅璧鋒潵鐩稿綋鎺ヨ繎浜庡紓甯稿畨鍏ㄧ殑浠g爜錛屼絾浠嶇劧鏈変竴浜涘皬鐨勭憰鐤碉紝灝卞儚涓嬮潰鐨勫鎴蜂唬鐮佹墍紺猴細(xì) 鍥犱負(fù)緇撴灉閫氳繃鍊艱繑鍥烇紝鍥犳String鐨勬嫹璐濇瀯閫犲嚱鏁板皢琚皟鐢紝鑰屾嫹璐濊祴鍊兼搷浣滅琚皟鐢ㄦ潵灝嗙粨鏋滄嫹璐濆埌theName涓傚鏋滀換浣曚竴涓嫹璐濆け璐ヤ簡錛宖()灝卞畬鎴愪簡鎵鏈夊畠鐨勫伐浣滀互鍙?qiáng)鎵鏈夊畠鐨勪換鍔★紙榪欏緢濂斤級錛屼絾鏄粨鏋滄槸鏃犳硶鎸藉洖鐨勶紙鍝庡摕鎴戠殑濡堝憖錛? 鎴戜滑鍙互鍋氱殑鏇村ソ鍚楋紝鏄惁鍙互閫氳繃閬垮厤鎷瘋礉鏉ラ伩鍏嶈繖涓棶棰橈紵渚嬪錛屾垜浠彲浠?璁╁嚱鏁版湁涓涓潪甯擱噺寮曠敤鍙傛暟騫跺悜涓嬮潰榪欐牱榪斿洖鍊鹼細(xì) 榪欑湅璧鋒潵寰堟錛屼絾瀹為檯涓嶆槸榪欐牱鐨勶紝榪斿洖result鐨勮祴鍊肩殑鍑芥暟鍙畬鎴愪簡涓涓姛鑳斤紝鑰屽皢鍏跺畠浜嬫儏鐣欑粰浜嗘垜浠傚畠浠嶇劧浼?xì)鍑洪敊銆傚洜姝よ繖涓仛娉曚笉鍙彇銆? 瑙e喅榪欎釜闂鐨勪竴涓柟娉曟槸榪斿洖涓涓寚鍚戝姩鎬佸垎閰嶆寚閽堢殑String瀵硅薄錛屼絾鏄渶濂界殑瑙e喅鏂規(guī)鏄鎴戜滑鍋氱殑鏇村錛岃繑鍥炰竴涓寚閽堝寘鍚湪auto_ptr錛? 榪欓噷鏄竴涓妧宸э紝褰撴垜浠湁鏁堥殣钘忔墍鏈夌殑宸ヤ綔鏉ユ瀯閫犵浜屼釜鍔熻兘錛堣繑鍥炲鹼級褰撶‘淇濆畠鍙互琚畨鍏ㄨ繑鍥炵粰璋冪敤鑰呭茍涓斿湪絎竴涓姛鑳斤紙鎵撳嵃娑堟伅錛夊畬鎴愮殑鏃跺欐病鏈夋姏鍑烘搷浣溿傛垜浠煡閬撲竴鏃out瀹屾垚錛岃繑鍥炲煎皢鎴愬姛浜ゅ埌璋冪敤鑰呮墜涓紝騫朵笖鏃犺濡備綍閮戒細(xì)姝g‘娓呯悊錛氬鏋滆皟鐢ㄨ呮帴鍙楄繑鍥炲鹼紝璋冪敤鑰呭皢寰楀埌榪欎釜鎷瘋礉鐨刟uto_ptr涓存椂瀵硅薄鐨勬墍鏈夋潈錛涘鏋滆皟鐢ㄨ呮病鏈夋帴鍙楄繑鍥炲鹼紝涔熷氨鏄拷鐣ヨ繑鍥炲鹼紝鍒嗛厤鐨凷tring灝嗗湪涓存椂auto_ptr琚攢姣佺殑鏃跺欒嚜鍔ㄦ竻鐞嗐傝繖縐嶅畨鍏ㄦ墿灞曠殑浠d環(huán)鍛紵灝卞儚鎴戜滑緇忓父瀹炵幇鐨勫己寮傚父瀹夊叏涓鏍鳳紝寮哄畨鍏ㄩ氬父娑堣椾竴浜涙晥鐜囷紙閫氬父姣旇緝?yōu)畯锛夆斺旇繖閲屾寚棰濆鐨勫姩鎬佸唴瀛樺垎閰嶃備絾鏄綋鎴戜滑鍦ㄦ晥鐜囧拰姝g‘鎬т箣闂村仛鍑洪夋嫨鐨勮瘽錛屾垜浠氬父浼?xì)閫夋嫨鍚庤咃紒 璁╂垜浠吇鎴愬湪鏃ュ父宸ヤ綔涓嬌鐢╝uto_ptr鐨勪範(fàn)鎯俛uto_ptr瑙e喅浜嗗父瑙佺殑闂錛屽茍涓旇兘澶熶嬌浣犵殑浠g爜鍙樺緱鏇村畨鍏ㄥ拰鍋ュ.錛岀壒鍒槸瀹冨彲浠ラ槻姝㈠唴瀛樻硠婕忎互鍙?qiáng)纭繚寮哄畨鍏ㄣ傚洜涓哄畠鏄爣鍑嗙殑錛屽洜姝ゅ畠鍦ㄤ笉鍚岀被搴撳拰騫沖彴涔嬮棿鏄彲縐繪鐨勶紝鍥犳鏃犺浣犲湪鍝噷浣跨敤瀹冿紝瀹冮兘灝嗘槸瀵圭殑銆? This article is drawn from material in the new book Exceptional C++: 47 engineering puzzles, programming problems, and exception-safety solutions by Herb Sutter, 漏 2000 Addison Wesley Longman Inc., which contains further detailed treatments of points touched on briefly in this article, including exception safety, the Pimpl (compiler-firewall) Idiom, optimization, const-correctness, namespaces, and other C++ design and programming topics. Pimpl椋庢牸鍙互鏈夋晥鍑忓皯欏圭洰鏋勫緩鏃墮棿錛屽洜涓哄畠鍦–縐佹湁閮ㄥ垎鏀瑰彉鐨勬椂鍊欙紝闃繪瀹㈡埛浠g爜寮曡搗騫挎硾鐨勯噸鏂扮紪璇戙傛洿澶氬叧浜嶱impl椋庢牸浠ュ強(qiáng)濡備綍閮ㄧ講緙栬瘧鍣ㄥ錛屽弬鑰冭繖鏈?a href="xc++.htm">Exceptional C++鐨勬潯嬈?6鍒?0銆傦紙Addison-Wesley, 2000錛? See the article originally published in C++ Report and available on the Effective C++ CD (Scott Meyers, Addison-Wesley, 1999) and Items 8 to 19 in Exceptional C++ (Herb Sutter, Addison-Wesley, 2000). 榪欓噷錛?鎴戜滑浠嶤++鐨勫熀鏈涔夌湅涓婂幓錛?搴旇鏄疶ype(i) 璋冪敤涓嬈℃嫹璐濇瀯閫犲嚱鏁幫紝 鍦ㄥ爢鏍堜腑鐢熸垚涓涓復(fù)鏃跺璞★紱鐒跺悗錛岀敤璇ュ璞℃瀯閫犺繑鍥炲璞★紱鐒跺悗瀵硅繖涓復(fù)鏃跺璞¤皟鐢ㄦ瀽鏋勫嚱鏁幫紱鍦ㄨ皟鐢ㄨ呮柟錛?鐢ㄨ繑鍥炵殑涓存椂瀵硅薄璋冪敤鎷瘋礉鏋勯犲嚱鏁頒互鍒濆鍖栧璞, 榪斿洖瀵硅薄鐨勬瀽鏋勫嚱鏁板湪榪欎箣鍚庯紝 鍑芥暟榪斿洖涔嬪墠璋冪敤銆?
鎵浠ワ紝 Type t = get(i); 搴旇鏈変笁涓嫹璐濇瀯閫犲嚱鏁板拰涓や釜鏋愭瀯鍑芥暟鐨勮皟鐢?
鍙槸錛?榪樻湁涓縐嶈娉曟槸錛?緙栬瘧鍣ㄥ彲鑳戒細(xì)瀵硅繖涓や釜涓存椂瀵硅薄榪涜浼樺寲錛屾渶緇堢殑浼樺寲緇撴灉浼?xì)鏄彧鏈変竴嬈$殑鏋勯犲嚱鏁般傚洜涓哄緢鏄庢樉鍦板彲浠ョ湅鍒幫紝 榪欓噷鎴戜滑鍏跺疄鍙槸瑕佺敤涓涓暣鏁版瀯閫犱竴涓猅ype瀵硅薄銆?
鍡? 浼間箮寰堟湁閬撶悊錛?
閭d箞錛?鍝竴縐嶈娉曞鍛紵 娌℃湁璋冩煡灝辨病鏈夊彂璦鏉冿紝浜庢槸鏈漢鐢╒C++6.0鍋氫簡瀹為獙銆?鏀句簡浜沜out<<鈥?.鍦ㄦ嫹璐濇瀯閫犲嚱鏁伴噷錛岃瀵熸墦鍗扮殑緇撴灉錛?緇撴灉鍗存槸璺熸垜鐨剆imple, na茂ve鐨勯嫻嬩竴鑷淬備笁涓嫹璐濇瀯閫犲嚱鏁幫紝 涓や釜鏋愭瀯鍑芥暟銆?
鈥滀綘涓急鏅虹紪璇戝櫒錛佽剳琚嬭繘姘翠簡鍚э紵鈥?蹇樹簡緙栬瘧鍣ㄦ病鑴戣浜?鈥滃緢鏄庢樉鍦ㄨ繖涓緥瀛愰噷鎴戠殑涓や釜涓存椂瀵硅薄閮芥病鏈夌敤鐨勫晩錛佲?
浜庢槸錛屼笂緗戯紝 鏌ヨ祫鏂欙紝 google涓涓嬪惂錛?
涓嬮潰鏄垜鏌ュ埌鐨勪竴浜涚粨鏋滐細(xì)
鍏跺疄錛?榪欑瀵瑰間紶閫掔殑浼樺寲鐨勭爺絀訛紝 騫朵笉鍙眬闄愪簬榪斿洖鍊箋傚涓嬮潰榪欎釜渚嬪瓙錛? 涔熸湁榪欑鑰冭檻銆?
f(T)鏄寜鍊間紶閫掔殑銆傝涔変笂搴旇鍋氫竴涓鍒訛紝 浣垮緱鍑芥暟鍐呴儴瀵筎鐨勬敼鍙樹笉浼?xì)濯勫搷鍒板師鏉ョ殑t1.
浣嗘槸錛屽洜涓哄湪璋冪敤f(t1)涔嬪悗錛?鎴戜滑娌℃湁鍐嶄嬌鐢╰1(闄や簡涓涓殣鍚殑destructor璋冪敤)錛屾槸鍚﹀彲鑳芥妸澶嶅埗浼樺寲鎺夛紝 鐩存帴浣跨敤t1鍛紵榪欐牱鍙互鑺傜渷鎺変竴涓嫹璐濇瀯閫犲嚱鏁板拰涓涓瀽鏋勫嚱鏁般?
鍙槸錛?涓嶈鏄榪斿洖鍊肩殑浼樺寲錛?榪樻槸瀵逛笂闈㈣繖縐嶅眬閮ㄥ璞$殑浼樺寲錛屽湪1995騫寸殑C++鏂版爣鍑嗚崏妗堝嚭鍙板墠閮芥槸涓烘爣鍑嗘墍涓ユ牸闄愬埗鐨?(铏界劧鏈変簺緙栬瘧鍣ㄥ茍娌℃湁閬佃榪欎釜鏍囧噯錛?榪樻槸鏀寔浜嗚繖縐嶁滀紭鍖栤?
閭d箞錛?榪欏張鏄負(fù)浠涔堝憿錛?
榪欓噷闈㈡秹鍙?qiáng)鍒颁竴涓櫘閬嶇殑瀵箂ide-effect鐨勬媴蹇с?
浠涔堝張鏄痵ide-effect鍛紵
鎵璋搒ide-effect灝辨槸涓涓嚱鏁扮殑璋冪敤涓庡惁鑳藉瀵圭郴緇熺殑鐘舵侀犳垚鍖哄埆銆?
int add(int i, int j){ return i+j; }灝辨槸娌℃湁side-effect鐨勶紝鑰?
void set(int* p, int I, int v){ p[I]=v; }灝辨槸鏈塻ide-effect鐨勩傚洜涓哄畠鏀瑰彉浜嗕竴涓暟緇勫厓绱犵殑鍊鹼紝 鑰岃繖涓暟緇勫厓绱犲湪鍑芥暟澶栨槸鍙鐨勩?
閫氬父鎰忎箟涓婃潵璇達(dá)紝 鎵鏈夌殑浼樺寲搴旇鍦ㄤ笉褰卞搷紼嬪簭鐨勫彲瑙傚療琛屼負(fù)鐨勫熀紜涓婅繘琛岀殑銆傚惁鍒欙紝蹇垯蹇簡錛?緇撴灉鍗村拰鎵鎯寵鐨勫畬鍏ㄤ笉鍚岋紒
鑰孋++鐨勬嫹璐濇瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鍙堝緢澶氶兘鏄湁side-effect鐨勩傚鏋滄垜浠殑鈥滀紭鍖栤濆幓鎺変簡涓涓湁side-effect鐨勬嫹璐濇瀯閫犲嚱鏁板拰涓涓瀽鏋勫嚱鏁幫紝 榪欎釜鈥滀紭鍖栤濆氨鏈夊彲鑳芥敼鍙樼▼搴忕殑鍙瀵熻涓恒傦紙娉ㄦ剰錛?鎴戣繖閲岃鐨勬槸鈥滃彲鑳解濓紝鍥犱負(fù)鈥滆礋璐熷緱姝b濓紝 涓や釜鏈塻ide-effect鐨勫嚱鏁扮殑璋冪敤錛?鍦ㄤ笉鑰冭檻騫惰榪愯鐨勬儏鍐典笅錛?涔熻鍙嶈屼笉浼?xì)濯勫搷绋嬪簭鐨勫彲瑙傚療琛屼负銆備笉榪囷紝 榪欑濉炵縼澶遍┈鐨勪簨鍎匡紝 緙栬瘧鍣ㄥ氨寰堥毦鍒ゆ柇浜嗭級
鍩轟簬榪欑蹇ц檻, 1995騫翠互鍓嶇殑鏍囧噯錛?鏄庣‘紱佹瀵瑰惈鏈塻ide-effect鐨勬嫹璐濇瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟鐨勪紭鍖栥傚悓鏃訛紝 榪樻湁涓浜涘C++鎵╁厖鐨勬彁璁紝 鑰冭檻璁╃▼搴忓憳鑷繁瀵圭被榪涜鍏佽浼樺寲鐨勫0鏄庛?紼嬪簭鍛樺彲浠ユ槑紜湴鍛婅瘔緙栬瘧鍣細(xì)涓嶉敊錛?鎴戣繖涓嫹璐濇瀯閫犲嚱鏁幫紝 鏋愭瀯鍑芥暟鏄湁side-effect, 浣嗕綘鍒錛?灝界浼樺寲錛?鍑轟簡浜嬫湁鎴戝憿錛?
鍝庯紝 side-effect鐪熸槸涓涓浜哄張鎭ㄥ張鐖辯殑涓滆タ錛佸畠浣跨紪璇戝櫒鐨勪紭鍖栧彉寰楀洶闅撅紱鍔犲ぇ浜嗙▼搴忕淮鎶ゅ拰璋冭瘯鐨勯毦搴︺傚洜姝?functional language 鎶妔ide-effect褰撲綔媧按鐚涘吔涓鏍鳳紝騫茶剢紱佹銆備絾鍚屾椂錛屾垜浠張寰堥毦紱誨紑side-effect. 涓嶈紼嬪簭鍛樹滑鏇翠範(fàn)鎯簬imperative 鐨勭紪紼嬫柟娉? 璞℃暟鎹簱鎿嶄綔錛孖O鎿嶄綔閮藉ぉ鐒跺氨鏄痵ide-effect.
涓嶈繃錛屼釜浜鴻繕鏄涓篊++鏍囧噯瀵光滀紭鍖栤濈殑淇濆畧鎬佸害鏄湁閬撶悊鐨勩傛棤璁哄浣曪紝璁┾滀紭鍖栤濆彲浠ユ綔鍦ㄥ湴鍋峰伔鍦版敼鍙樼▼搴忕殑琛屼負(fù)鎬繪槸璁╀漢鎯寵搗鏉ュ氨涓嶈垝鏈嶇殑銆?
浣嗘槸錛?鐭涚浘鏄绔嬬粺涓鐨勩傦紙鎯沖綋騫翠亢椹垪鍙緱浜嗗叓鍗佸鍒嗗憿錛夈?瀵硅繖縐峚ggressive鐨勨滀紭鍖栤濈殑鍛煎0鏄竴嫻珮榪囦竴嫻?浠tan Lippeman涓洪鐨勪竴灝忔挳欏藉浐鍒嗗瓙瀵規(guī)爣鍑嗙殑棰犺鍜屽拰騫蟲紨鍙樼殑闃磋皨浠庢潵灝辨病鏈夊仠姝㈣繃銆?榪欎笉錛熷湪1996騫寸殑涓涓闆ㄤ氦鍔犵殑澶滄櫄錛?涓涓槾闄╃殑C++鏂版爣鍑嗚崏妗堝嚭鐐変簡銆傚湪榪欎釜鑽夋閲岋紝 鍔犲叆浜嗕竴涓悕涓篟VO (Return Value Optimization) 鐨勬斁瀹藉浼樺寲鐨勯檺鍒訛紝 濡勫浘璧拌祫鏈富涔夐亾璺紝 緇欒祫鏈寮犵洰鐨勬彁妗堛傚叾鍏蜂綋鍐呭灝辨槸璇達(dá)細(xì)鍏佽緙栬瘧鍣ㄥ鍛藉悕榪囩殑灞閮ㄥ璞$殑榪斿洖榪涜浼樺寲錛?鍗充嬌鎷瘋礉鏋勯犲嚱鏁?鏋愭瀯鍑芥暟鏈塻ide-effect涔熷湪鎵涓嶆儨銆傝繖涓彁璁儗鍚庢墍闅愯棌鐨勬濇兂灝辨槸錛氫負(fù)浜嗘彁楂樻晥鐜囷紝 瀹佸彲鍐掓敼鍙樼▼搴忚涓虹殑椋庨櫓銆傚畞瑕佽祫鏈富涔夌殑鑻楋紝 涓嶈紺句細(xì)涓諱箟鐨勮崏浜嗭紒
鎴戞兂錛?榪欐牱鐨勪竴涓姜澶ф伓鏋佺殑鎻愭绔熶細(xì)琚彁浜わ紝搴旇鏄洜涓篊++鐨勫兼嫹璐濈殑璇箟鐨勬晥鐜囧疄鍦ㄥお鈥滃濡堢殑鈥濅簡銆?褰撲綘鍐欎竴涓?Complex operator+(const Complex& c1, const Complex& c2);鐨勬椂鍊欙紝 绔熼渶瑕佽皟鐢ㄥソ鍑犳鎷瘋礉鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟錛佸悓蹇椾滑錛侊紙娌夌棝鍦幫紝 璇噸蹇冮暱鍦幫級紺句細(xì)涓諱箟鐨勭敓浜у叧緋葷殑浼樿秺鎬ф庝箞浣撶幇鍟婏紵
鎺ヤ笅鏉ワ紝 褰撴垜鎯矴oogle C++鏈鏂扮殑鏍囧噯錛?鐪婻VO鏄惁琚渶緇堥噰綰蟲椂錛?鍗翠粈涔堜篃鎵句笉鍒頒簡銆?鍒癆NSI鐨勭綉绔欎笂鍘伙紝 灞呯劧瑕佷粯閽辨墠鑳紻OWNLOAD鏂囨。銆?鈥滆佸瓙鍦ㄥ煄閲屼笅棣嗗瓙閮戒笉浠橀挶錛?down浣犲嚑涓儌鏂囨。榪樿緇欓挶錛燂紒鈥?
鏁呬簨娌℃湁緇撳眬錛?瀹炲湪鏄笉鐖姐?涔熶笉鐭ユ槸涓嶆槸鍥犱負(fù)鏍囧噯榪樻病鏈夋暡瀹氾紝 鎵浠C++6 灝辨病鏈変紭鍖栵紝 榪樻槸VC鏍規(guī)湰灝辨病瀹屽叏閬靛畧鏍囧噯銆?
涓嶈繃錛屾湁涓鐐規(guī)槸鑲畾鐨勩?褰撳啓紼嬪簭鐨勬椂鍊欙紝 鏈濂戒笉瑕佷緷璧栦簬RVO (鏈変漢錛?璞tan Lippeman, 鍙堝彨瀹僋RV浼樺寲)銆?鍥犱負(fù)錛?涓嶈瀵規(guī)爣鍑嗙殑浜夎鏄惁宸茬粡鏈変簡緇撴灉錛?瀹為檯涓婂悇涓紪璇戝櫒鐨勫疄鐜頒粛榪樻槸鍚勮嚜涓烘斂錛?娌℃湁緇熶竴銆?涓涓彨SCOtt Meyers鐨勫浼?蹇樹簡鏄崠浠涔堢殑浜?灝辮錛?濡傛灉浣犵殑紼嬪簭渚濊禆浜嶳VO, 鏈濂藉幓鎺夎繖縐嶄緷璧栥備篃灝辨槸璇達(dá)紝 涓嶇RVO鍒板簳鏍囧噯涓嶆爣鍑嗭紝 浣犺繕鏄笉鑳界敤銆?涓嶄粎涓嶈兘鐢紝 榪樺緱鏃跺埢璀︽儠鐫RVO鍙兘甯︽潵鐨勭▼搴忚涓轟笂鐨勫彉鍖栥?錛堜篃涓嶇煡榪欏府瀹朵紮鐬庡繖浜嗗崐澶╁埌搴曚負(fù)鍟ワ紒錛?
璇村埌榪欓噷錛?鍊掓兂璧蜂簡C#閲屼竴涓洶鎯戜簡鎴戝緢涔呯殑闂銆傝寰楄C#鐨剆pecification鐨勬椂鍊欙紝 闈炲父涓嶈В涓轟粈涔圕#涓嶅厑璁哥粰value type 瀹氫箟鏋愭瀯鍑芥暟銆?
榪欓噷錛?鍏堢畝鐣ヤ粙緇嶄竴涓婥#閲岀殑value type (鍘熷鏁版嵁綾誨瀷錛?struct 綾誨瀷)銆?
鍦–#閲岀殑value_type灝辮薄鏄鹼紝 姘歌繙鍙兘copy, 鍙栧箋傚洜姝わ紝 瀹冩案榪滄槸in-place鐨勩傚鏋滀綘鎶婁竴涓獀alue type鐨勬暟鎹斁鍦ㄤ竴涓璞¢噷錛屽畠鐨勭敓鍛芥湡灝卞拰閭d釜瀵硅薄鐩稿悓錛涘鏋滀綘澹版槑涓涓獀alue type 鐨勫彉閲忓湪鍑芥暟涓紝 瀹冪殑鐢熷懡鏈熷氨鍦╨exical scope閲屻?
{
The_ValueType value;
}//value 鍒拌繖閲屽氨姝昏彍浜?
鍟婂憖鍛錛?榪欎笉姝f槸鎴戜滑鎬蹇電殑C++鐨剆tack object鍚楋紵
鍦–++閲岋紝Auto_ptr, shared_ptr, 瀹瑰櫒浠紝 涓嶉兘鏄埄鐢ㄦ瀽鏋勫嚱鏁版潵綆$悊璧勬簮鐨勫悧錛?
C#錛孞ava 铏界劧鍒╃敤garbage collection鎶鏈潵鏀墮泦鏃犵敤瀵硅薄錛?浣挎垜浠笉鐢ㄥ啀鎷呭績鍐呭瓨鐨勫洖鏀躲?浣唃arbage collection騫朵笉淇濊瘉鏃犵敤瀵硅薄涓瀹氳鏀墮泦錛?騫朵笉淇濊瘉Dispose()鍑芥暟涓瀹氳璋冪敤錛?鏇翠笉淇濊瘉涓涓璞′粈涔堟椂鍊欒鍥炴敹銆?鎵浠ュ涓浜涢潪鍐呭瓨鐨勮祫婧愶紝 璞℃暟鎹簱榪炴帴錛?緗戠粶榪炴帴錛?鎴戜滑榪樻槸甯屾湜鑳芥湁涓涓被浼間簬smart pointer鐨勪笢瑗挎潵甯垜浠鐞嗗晩銆傦紙try-finally 铏界劧鍙互鐢紝 浣嗗洜涓哄畠褰卞搷鍒發(fā)exical scope, 鏈夋椂鐢ㄨ搗鏉ヤ笉閭d箞鏂逛究錛?
浜庢槸錛?鎴戝C#鐨勫彇娑坴alue type鐨勬瀽鏋勫嚱鏁板厖婊′簡娣卞帤鐨勯樁綰т粐鎭ㄣ?
涓嶈繃錛?鐜板湪鎯蟲潵錛?C#鐨勮繖縐嶈璁′竴瀹氭槸鎯╀簬C++澶辮觸鐨勬暀璁細(xì)
1. value type 娌℃湁鎷瘋礉鏋勯犲嚱鏁般侰#鍙仛緙虹渷copy, 娌℃湁side-effect 瀵逛互涓嬬▼搴忥細(xì)
The_Valuetype get(int I){return The_Valuetype(i);}
The_Valuetype t = get(1);
鍦–#閲屾垜浠彲浠ュ揩涔愬湴璇達(dá)細(xì)鍙皟鐢ㄤ簡涓嬈℃瀯閫犲嚱鏁般?鍐嶆病鏈塻ide-effect鐨勬矙婕狅紝 鍐嶆病鏈夐毦浠ヤ紭鍖栫殑鑽掑師錛?smart pointer鏈涜屽嵈姝ワ紝 鏁堢巼涔嬭姳澶勫寮閬嶃?I have a dream, 鈥︹?/p>
杞澆鑷細(xì)http://gugu99.itpub.net/post/34143/466008涓轟粈涔堝畠鏄竴涓滆嚜鍔ㄢ濇寚閽?
// Example 1(a): Original code
//
void f()
{
T* pt( new T );
/*...more code...*/
delete pt;
}
// Example 1(b): Safe code, with auto_ptr
//
void f()
{
auto_ptr<T> pt( new T );
/*...more code...*/
} // cool: pt's destructor is called as it goes out
// of scope, and the object is deleted automatically
// Example 2: Using an auto_ptr
//
void g()
{
T* pt1 = new T;
// right now, we own the allocated object
// pass ownership to an auto_ptr
auto_ptr<T> pt2( pt1 );
// use the auto_ptr the same way
// we'd use a simple pointer
*pt2 = 12; // same as "*pt1 = 12;"
pt2->SomeFunc(); // same as "pt1->SomeFunc();"
// use get() to see the pointer value
assert( pt1 == pt2.get() );
// use release() to take back ownership
T* pt3 = pt2.release();
// delete the object ourselves, since now
// no auto_ptr owns it any more
delete pt3;
} // pt2 doesn't own any pointer, and so won't
// try to delete it... OK, no double delete
// Example 3: Using reset()
//
void h()
{
auto_ptr<T> pt( new T(1) );
pt.reset( new T(2) );
// deletes the first T that was
// allocated with "new T(1)"
} // finally, pt goes out of scope and
// the second T is also deleted
鍖呰鎸囬拡鏁版嵁鎴愬憳
// Example 4(a): A typical Pimpl
//
// file c.h
//
class C
{
public:
C();
~C();
/*...*/
private:
class CImpl; // forward declaration
CImpl* pimpl_;
};
// file c.cpp
//
class C::CImpl { /*...*/ };
C::C() : pimpl_( new CImpl ) { }
C::~C() { delete pimpl_; }
// Example 4(b): A safer Pimpl, using auto_ptr
//
// file c.h
//
class C
{
public:
C();
/*...*/
private:
class CImpl; // forward declaration
auto_ptr<CImpl> pimpl_;
};
// file c.cpp
//
class C::CImpl { /*...*/ };
C::C() : pimpl_( new CImpl ) { }
鎵鏈夋潈錛屾簮錛屼互鍙?qiáng)璋冪敤鑰?Sinks)
// Example 5: Transferring ownership from
// one auto_ptr to another
//
void f()
{
auto_ptr<T> pt1( new T );
auto_ptr<T> pt2;
pt1->DoSomething(); // OK
pt2 = pt1; // now pt2 owns the pointer,
// and pt1 does not
pt2->DoSomething(); // OK
} // as we go out of scope, pt2's destructor
// deletes the pointer, but pt1's does nothing
// Example 6: Never try to do work through
// a non-owning auto_ptr
//
void f()
{
auto_ptr<T> pt1( new T );
auto_ptr<T> pt2;
pt2 = pt1; // now pt2 owns the pointer, and
// pt1 does not
pt1->DoSomething();
// error! following a null pointer
}
// Example 7: Sources and sinks
//
// A creator function that builds a new
// resource and then hands off ownership.
//
auto_ptr<T> Source()
{
return auto_ptr<T>( new T );
}
// A disposal function that takes ownership
// of an existing resource and frees it.
//
void Sink( auto_ptr<T> pt )
{
}
// Sample code to exercise the above:
auto_ptr<T> pt( Source() ); // takes ownership
涓嶅彲浠ュ仛鐨勪簨鎯咃紝浠ュ強(qiáng)涓轟粈涔堜笉鑳藉仛
// Example 8: Danger, Will Robinson!
//
vector< auto_ptr<T> > v;
/* ... */
sort( v.begin(), v.end() );
浣跨敤const auto_ptr鏄竴涓ソ涔?fàn)鎯?/h3>
// Example 9: The const auto_ptr idiom
//
const auto_ptr<T> pt1( new T );
// making pt1 const guarantees that pt1 can
// never be copied to another auto_ptr, and
// so is guaranteed to never lose ownership
auto_ptr<T> pt2( pt1 ); // illegal
auto_ptr<T> pt3;
pt3 = pt1; // illegal
pt1.release(); // illegal
pt1.reset( new T ); // illegal
auto_ptr浠ュ強(qiáng)寮傚父瀹夊叏
// Example 10(a): Exception-safe?
//
String f()
{
String result;
result = "some value";
cout << "some output";
return result;
}
String theName;
theName = f();
// Example 10(b): Better?
//
void f( String& result )
{
cout << "some output";
result = "some value";
}
// Example 10(c): Correct (finally!)
//
auto_ptr<String> f()
{
auto_ptr<String> result = new String;
*result = "some value";
cout << "some output";
return result; // rely on transfer of ownership;
// this can't throw
}
鑷磋阿
娉ㄩ噴
]]>Type get(int I){
return Type(i);
}
Type t = get(1);
void f(T t) { }
void main(void){
T t1;
f(t1);
}
2. value type 涓嶅噯鏈夋瀽鏋勫嚱鏁般侰#鏈塯arbage collection, 鏋愭瀯鍑芥暟鐨勫敮涓鐢ㄩ斿彧浼?xì)鏄仛涓浜泂ide-effect璞″叧闂暟鎹簱榪炴帴銆?鎵浠ュ彇娑堜簡鏋愭瀯鍑芥暟錛?灝卞彇娑堜簡value type鐨剆ide-effect.
3. 娌℃湁浜唖ide-effect, 緋葷粺鍙互浠繪剰鍦板仛浼樺寲浜?
]]>鑷棆閿佸悓姝?/h3>
浠ヤ笂鍐呭鎽樿嚜銆婄紪紼嬩箣緹庛婸150-154銆?/p>
涓轟簡鏂逛究浣跨敤錛屼笅闈㈡槸鍙嫹璐濈殑浠g爜錛?/p>
Math.h
#pragma once class Math { public: Math(void); ~Math(void); public : //緙栫▼涔嬬編P150-154 //姹傛渶澶у叕綰︽暟錛屾鍑犻噷寰封斺旇緱杞浉闄ゆ硶 static int Gcd1(int x, int y); //姹傛渶澶у叕綰︽暟錛屾鍑犻噷寰封斺旇緱杞浉闄ゆ硶錛堝彉鐩稿皢闄ゆ硶鍙樻垚浜嗗噺娉曪級 static int Gcd2(int x, int y); static int Gcd3(int x, int y); inline static bool IsEven(int x); inline static int Absolute(int x); };
Math.cpp
#include "Math.h" Math::Math(void) { } Math::~Math(void) { } int Math::Gcd1(int x, int y) { //y, x%y欏哄簭涓嶈兘閿欙紱 return y ? Gcd1(y, x % y) : x; } int Math::Gcd2(int x, int y) { //涓嶨cd1鐩稿悓鐨勬柟寮忥紝浣嗙敱浜巟%y璁$畻閫熷害杈儀-y瑕佹參錛屼絾鏁堟灉鐩稿悓錛屾墍浠ユ崲鐢▁ - y // 浣嗙敤鍑忔硶鍜岄櫎娉曚笉鍚岀殑鏄紝姣斿鍜岋紝%20=10錛?20=70錛屼篃灝辨槸-4脳=10 // 涔熷氨鏄榪唬嬈℃暟杈僄cd1鑰岃█閫氬父鏄鍔犱簡銆? return y ? Gcd1(y, x - y) : x; } int Math::Gcd3(int x, int y) { if(x < y) return Gcd3(y, x); if(y == 0) return x; else { if(IsEven(x)) { if(IsEven(y)) return (Gcd3(x >> 1, y >> 1) << 1); else return Gcd3(x >> 1, y); } else { if(IsEven(y)) return Gcd3(x, y >> 1); else return Gcd3(y, x - y); } } } bool Math::IsEven(int x) { return !(bool)x & 0x0001; } int Math::Absolute(int x) { return x < 0 ? -x : x; }
Main.cpp
#include <stdafx.h> #include <iostream> #include "Math.h" using namespace std; int _tmain(const int & arg) { cout<<"Math::Gcd1(42,30) = "<<Math::Gcd1(42,30)<<endl; cout<<"Math::Gcd1(30,42) = "<<Math::Gcd1(30,42)<<endl; cout<<"Math::Gcd1(50,50) = "<<Math::Gcd1(50,50)<<endl; cout<<"Math::Gcd1(0,0) = "<<Math::Gcd1(0,0)<<endl; cout<<"Math::Gcd1(-42,-30) = "<<Math::Gcd1(-42,-30)<<endl; cout<<"Math::Gcd1(-42,30) = "<<Math::Gcd1(-42,30)<<endl; cout<<"------------------------------"<<endl; cout<<"Math::Gcd2(42,30) = "<<Math::Gcd2(42,30)<<endl; cout<<"Math::Gcd2(30,42) = "<<Math::Gcd2(30,42)<<endl; cout<<"Math::Gcd2(50,50) = "<<Math::Gcd2(50,50)<<endl; cout<<"Math::Gcd2(0,0) = "<<Math::Gcd2(0,0)<<endl; cout<<"Math::Gcd2(-42,-30) = "<<Math::Gcd2(-42,-30)<<endl; cout<<"Math::Gcd2(-42,30) = "<<Math::Gcd2(-42,30)<<endl; cout<<"------------------------------"<<endl; cout<<"Math::Gcd3(42,30) = "<<Math::Gcd3(42,30)<<endl; cout<<"Math::Gcd3(30,42) = "<<Math::Gcd3(30,42)<<endl; cout<<"Math::Gcd3(50,50) = "<<Math::Gcd3(50,50)<<endl; cout<<"Math::Gcd3(0,0) = "<<Math::Gcd3(0,0)<<endl; cout<<"Math::Gcd3(-42,-30) = "<<Math::Gcd3(-42,-30)<<endl; cout<<"Math::Gcd3(-42,30) = "<<Math::Gcd3(-42,30)<<endl; return 0; }
涓嶈繃鏈変竴鐐瑰煎緱涓鎻愶紝灝辨槸鎵璋撴ц兘鏈濂芥晥鐜囨渶楂樼殑Gcd3涓嶆敮鎸佽礋鏁幫紝涔熷氨鏄渶鍚庝袱琛屾祴璇曚唬鐮佹棤娉曢氳繃銆備絾鏄檺浜庡璐熸暟鐨勬渶澶у叕綰︽暟騫舵病鏈夊畾涔夛紝涔熷氨鏄鍗充究涓婇潰鐨凣cd1鍜孏cd2濂藉儚綆楀嚭浜嗚礋鏁幫紝浣嗗畠浠殑緇撴灉娌℃湁鎰忎箟銆?/p>
鍥哄畾閾炬帴錛?a href="/mymsdn/category/3173.html">http://www.shnenglu.com/mymsdn/category/3173.html
鏂囩珷鏍囬錛氬崄騫碝FC緇忓巻璁よ瘑鐨凪icrosoft鎶鏈?ZT)
鍏抽敭瀛?/strong>錛歁FC銆丮icrosoft銆佹妧鏈姣斻佹妧鏈彂灞?br />杞澆鑷?/strong>錛?a >http://blog.vckbase.com/hangwire/archive/2005/05/26/5806.html
浣滆?/strong>錛歨angwire
鍙戣〃鏃墮棿錛?005-05-26 09:13
銆銆鎴戞渶鍒濈煡閬揗FC澶ф鏄湪1993騫達(dá)紝閭d釜鏃跺橵isual C++榪樻病闈笘錛屽綋鏃禡icrosoft鐨凜++緙栬瘧鍣ㄨ繕寰堝急錛屽畼鏂圭殑鍚嶅瓧鏄疢icrosoft C/C++ 7.0錛孧FC鐨勭増鏈槸1.0錛屽嚑涔庢病鏈夊紩璧蜂粈涔堝弽鍝嶏紝閭d釜鏃舵湡鏈濂界殑C++寮鍙戠幆澧冩槸Borland C++ 3.1錛屽叾瀹烇紝澶ф鏄?992騫?1鏈堜喚錛屼竴涓伓鐒剁殑鏈轟細(xì)錛屾垜棰嗙暐鍒癇orland鍏徃鐨勫帀瀹籌紝璁頒笉寰楀湪浠涔堝湴鏂癸紝鎴戠湅鍒頒竴涓粷濡欑殑闆嗘垚寮鍙戠幆澧冿紝鍗砊urbo C++ 3.0 for Windows錛岃繖鏄垜璁板繂涓涓涓湡姝g殑Windows鐜涓嬬殑C++闆嗘垚寮鍙戠幆澧冿紝閭g嬋鍔ㄧ殑鎰熻鑷充粖浠嶈蹇嗙姽鏂幫紝涓嶅姘旂殑璇達(dá)紝褰撴椂鑷沖皯鍦–++鏂歸潰錛孧icrosoft涓嶣orland涓嶆槸涓涓按騫崇殑錛孊orland鏄庢樉鐨勮楂樹簬Microsoft 錛孊orland鐨勪駭鍝佸湪鎶鏈笂緇欐垜鐣欎笅娣卞埢鐨勫嵃璞°傞偅涓椂鍊橫icrosoft鏈濂界殑寮鍙戝鉤鍙版槸Visual Basic 3.0錛岃孊orland鐨凞elphi姝e浜庡紑鍙戦樁孌碉紙Delphi 鐨勪唬鐮佸悕縐版槸錛?VB Killer"錛夆︹︼紝鎯寵搗榪欎簺鍗佸嚑騫村墠鐨勫線浜嬶紝鎴戜笉紱佹劅鎱ㄤ竾鍗冦?/p>
銆銆鍗佸嚑騫存潵錛屾垜鐢ㄨ繃璁稿寮鍙戠幆澧冿紝鍏充簬Visual Basic錛屾垜鐢ㄨ繃鏈鏃╃殑DOS鐗堟湰錛學(xué)indows鐗堢殑Visual Basic鎴戝熀鏈笂鍏ㄩ兘鐢ㄨ繃錛岃嚦浠婃垜榪樿寰楁瘡涓増鏈殑VB瀹夎鐩樼鐩樼殑鐩樻暟銆傚悓鏍鳳紝鎴戠敤榪囧悇涓増鏈殑Delphi錛岀壒鍒槸Delphi 2.0錛岀粰鎴戠暀涓嬫瀬濂界殑鍗拌薄銆侱elphi鎻愪緵鐪熸緙栬瘧鐨勫彲瑙嗗寲寮鍙戠幆澧冿紝閭d釜鏃跺欙紙1994騫村乏鍙籌級錛孌elphi灝卞彲浠ュ紑鍙戝甫鏈塆UI鐨勫姩鎬侀摼鎺ュ簱錛屼綘鍙互鎯寵薄錛屽湪Microsoft Access 2.0鐨勫簲鐢ㄧ▼搴忎腑鍙互鍔犺澆涓涓狣elphi Form騫惰繘琛岀▼搴忎氦浜掞紝閭g鎰熻鐪熸槸媯掓瀬浜嗐?/p>
銆銆Borland C++鏄垜蹇冧腑鏃犳硶鎶規(guī)帀鐨勯仐鎲撅紝浠嶵urbo C鍒癈++ Builder錛屾垜娣卞埢鐨勪綋楠屽埌Borland鐨勮緣鐓屽拰鏃犲錛孌elphi浠嶸B Killer璧板埌涓篤B鎶よ埅錛堜綘鍙互鎯寵薄Delphi涓姝ュ埌浣嶇殑ActiveX 鎺т歡寮鍙戞妧鏈湁澶氱墰錛屾棭鏈熺殑VB鏈夊鍦燂紝鏃╂湡鐨刅B涓嶈兘寮鍙戝姩鎬侀摼鎺ュ簱錛屽洜姝ゆ棤娉曞紑鍙慉ctiveX 鎺т歡錛屾兂璧鋒潵鐪熶護(hù)浜哄槝鍞忎笉宸詫級錛孊orland C++鐨勫懡榪愪篃鏄笉嫻庛侭orland C++ 3.1鐨勮緣鐓屾案榪滀笉鍐嶄簡錛屽崄鍑犲勾鐨勫紑鍙戝伐浣滀腑錛屾垜鍦–++涓婃姇鍏ヤ簡澶ч噺鐨勭簿鍔涳紝Borland C++鏇劇粡緇欐垜甯︽潵鏃犳暟鐨勬縺鍔紝鐒惰岃繖涓粡鍏哥殑鍚嶅瓧鍗村湪涓嶮icrosoft鐨勭珵浜変腑娓愭笎鐨勬祦閫濅簡鈥︹︺?/p>
銆銆MFC4.0鐨勫嚭鐜幫紝浣垮緱浜轟滑鎰熻Microsoft鍦–++鏂歸潰璧朵笂鏉ヤ簡錛岃繖涓鐗堢殑MFC鏄疻in95鎺ㄥ嚭鍚庡嚭鐜板湪Visual C++ 4涓紙Microsoft娌℃湁VC 3錛孷C4浠ュ墠鐨勭増鏈槸2.2銆?.1銆?.0銆?.51銆?.5銆?.0錛夈備篃璁告槸瀵笲orland C++鐨勬綔鎰忚瘑鐨勫け鏈涳紝鎴戜笉鐭ヤ笉瑙夌殑鎺ュ彈浜哅FC錛孷C 4.2鎺ㄥ嚭鏃訛紝鎴戦氳繃姝e父娓犻亾璐拱浜嗚繖涓紪璇戝櫒鐨勪紒涓氱増銆?/p>
浜屻佸叧浜嶮icrosoft
銆銆鍏充簬Microsoft錛屾湁鏃犳暟鐨勪漢瑕佸榪欎釜鍚嶅瓧鍙欒鎰熻錛岃繖涓護(hù)浜鴻鍘岀殑鍚嶅瓧錛佷笉鐭ラ亾鏄枩嬈㈣繕鏄啂鎭訛紝浣犳槸紼嬪簭鍛橈紝浣犵殑蹇冩濆彲鑳藉氨瑕佸洜Microsoft鐨勫瓨鍦ㄨ屽姩錛屽嵆浣夸綘鐢↙inux錛屼綘鍙兘涔熸槸鍥犱負(fù)Microsoft鎶鏈洜绱犮傚灝戝勾鏉ワ紝榪欎釜鍚嶅瓧姣忓ぉ閮藉嚭鐜板湪浣犮佹垜銆佷粬鐨勯潰鍓嶏紝鍥犱負(fù)浣犱笉寰椾笉闈㈠Windows鐨勫瓨鍦紝鍙槸浣犳啂鎭ㄨ繖涓悕瀛楀悧錛熶綘璁ㄥ帉榪欎釜鍚嶅瓧鍚楋紵鎴戜笉鐭ラ亾鏄惁宸茬粡瀵硅繖涓悕瀛楅夯鏈ㄤ簡銆?/p>
銆銆1998騫存垜涓漢璁簡Microsoft MSDN Universal 鐗堬紝鎴戝紑濮嬫瘮杈冨叏闈㈡帴瑙﹁繖涓叕鍙哥殑寮鍙戞妧鏈紝浣犲彲浠ユ兂璞★紝1998騫村綋浣犻潰瀵逛笂鐧懼紶鎶鏈厜鐩樼殑鏃跺欙紝浣犲氨鐭ラ亾浠涔堝彨鍋?鍘氬害"錛屽綋鎴戜滑鏈夋椂璇村嚭"璧朵笂"鎴?"杈懼埌"Microsoft鏌愪簺浜у搧鐨勬按騫崇殑鏃跺欙紝鍙兘鎴戜滑緙轟箯瀵硅繖涓叕鍙?鍘氬害"鐨勭湡瀹炰簡瑙c傝繘鍏SDN錛屾垜鎰熻Microsoft綆鐩翠笉鏄竴涓?鍏徃"錛岃屾槸錛堟垨鑰呮鍦ㄥ艦鎴愶級涓涓?紺句細(xì)"銆?/p>
銆銆褰撴椂钁楀悕鐨勬妧鏈綉绔?a >http://www.codeguru.com鍏ㄩ儴鐨勬妧鏈祫鏂欐槸鍙笅杞界殑錛堥偅涓椂鍊?a >http://www.codeguru.com鎻愪緵鏁翠釜緗戠珯鍐呭涓嬭澆鏈嶅姟錛屽ぇ綰?M宸﹀彸錛夛紝澶у悕榧庨紟鐨?a 鐨勬櫙璞★紵鍙兘寰堝浜烘兂榪囷紝濡傛灉Borland涓嶅瓨鍦紝瀵筂icrosoft涓嶆槸鏇存湁鍔涘悧錛熷叾瀹濵icrosoft鍙兘綺鵑氫腑鍥藉巻鍙詫紝璇昏繃銆婁笁鍥姐嬨佸崄鍒嗕簡瑙f垬鍥芥椂鏈熺殑涓浗錛屽叾瀹濨orland褰㈠紡涓婄殑瀛樺湪錛屽Microsoft鏄崄鍒嗘湁鍒╃殑錛岃嚦灝戝艦寮忎笂榪樻湁绔炰簤瀵規(guī)墜錛岃屼簨瀹炰笂Borland宸茬粡鍙楁帶浜嶮icrosoft錛圡icrosoft鏄疊orland鐨勫ぇ鑲′笢錛夈備綘鍙互鐪嬪埌涓浜涘井濡欑殑鐜拌薄錛欱orland涓篗icrosoft鎻愪緵浜嗗ぇ閲忕殑浜烘墠錛屽叾涓寘鎷珼elphi鎬昏璁″笀浠ュ強(qiáng)Borland C++緙栬瘧鍣ㄧ殑鏍稿績鎴愬憳錛涘悓鏃朵篃涓篗icrosoft .NET鎻愪緵寮烘湁鍔涚殑鎶よ埅鏈嶅姟錛堢湅鐪婥# Builder銆丏elphi .NET錛夈?998騫碝icrosoft 鐨凜OM鎶鏈熀鏈凡緇忔垚鐔燂紝榪欎釜鎶鏈嬌浜烘劅鍒伴渿鎾鹼紝褰撴椂Microsoft鐨勫鎵嬩滑鎻愬嚭"OpenDoc"鐢ㄤ簬瀵規(guī)姉"COM"錛屼綘鐪嬬湅"OpenDoc"闃佃惀鐨勫嚑涓垚鍛橈細(xì)IBM銆丄pple銆丅orland銆丯ovell錛屼綘浼?xì)鎰熷埌杩欎釜闃佃惀鍗佸垎璞崕銆佸己澶с備絾緇撴灉鍗村樊寮轟漢鎰忥紝"OpenDoc"鏃犵柧鑰岀粓錛岃?COM"渚濈劧鐢熸満鍕冨媰銆?/p>
銆銆鏈変漢璇?COM"娌¤惤浜嗭紝閭d箞灝卞お涓嶄簡瑙icrosoft浜嗐傚湪涓?OpenDoc"鐨勭珵浜変腑錛?COM"鏄釜褰誨簳鐨勮儨鍒╄咃紝鍦ㄤ笌"Java"鐨勭珵浜変腑錛?COM"鎴愬姛鐨勮繘鍖栦簡錛屽湪榪欎釜榪囩▼涓璏icrosoft浣撶幇浜嗗己澶х殑鍚告敹鑳藉姏銆佷互鍙?qiáng)鏃犳硶鎯宠薄鐨勯煣鍔层?NET鍙笉榪囨槸COM鐨?鍒悕"鑰屽凡銆傚浜庝竴涓粡楠屼赴瀵岀殑C++紼嬪簭鍛樿岃█錛?NET灝辨槸COM鐨勮繘鍖栵紝鑰孧icrosoft鍐呴儴.NET灝辨槸"COM 3.0"錛圤LE2灝辨槸COM 2.0錛夛紝鑰?CLR"灝辨槸涓涓笉鎷╀笉鎵g殑COM瀵硅薄銆傛浘緇忔湁浜洪棶鎴戯紝鏃㈢劧鐗涢】鏃朵唬灝卞瀹氫簡鍩虹錛堟兂鎯寵憲鍚嶇殑鐗涢】-鑾卞竷?yōu)D尐鍏紡錛夛紝鍑犵櫨騫村悗鐨勪粖澶╋紝鏁板榪樼爺絀?寰Н鍒?鍚楋紵鍥炵瓟褰撶劧鏄緷鐒跺湪鐮旂┒錛?寰Н鍒?鏃╂湡鏄拡瀵瑰嚱鏁扮殑錛岀幇浠?寰Н鍒?鏄拡瀵?嫻佸艦錛圡anifold錛夈佺氦緇翠笡錛團(tuán)iber Bundle錛?鐨勶紝姒傚康娣卞ゥ浜嗭紝鍙槸鍩烘湰鎬濇兂涓嶅彉錛屽彧鏄?寰Н鍒?鐨勬濇兂寰楀埌鍚堢悊鐨勫歡鎷撲笌榪涘寲錛屼綘浜嗚ВMicrosoft鍚楋紵Microsoft Research鏈変竴鎵硅秴涓嫻佺殑鏁板瀹跺湪涓篗icrosoft宸ヤ綔錛屽叾涓竴浜涙槸鏂愬皵鍏瑰鐨勫緱涓伙紝Microsoft姝e湪瀹炵幇濡傚悓"寰Н鍒?榪涘寲鍒?寰垎嫻佸艦"涓鏍峰皢"COM"榪涘寲鍒?.NET"銆備粠縐戝姒傚康瑙掑害涓婂垎鏋怌OM涓嶫ava錛屽彲鑳紺OM鏇村叏闈€佺簿紜紝浠庡疄鐜扮殑鎴愮啛搴︿笂Java鍙兘鏇存垚鐔燂紝鍙槸浣犵湅鍒幫紝Microsoft姝e湪涓嶇揣涓嶆參鐨勮拷璧躲侻icrosoft浠や漢鑱旀兂璧鋒垬鍥芥椂鏈熺殑寮虹Е銆?/p>
銆銆鎴樺浗鏃舵湡鐨勭Е鍥斤紝閲囧彇"榪滀氦榪戞敾""鎶氬急鎺犲己"絳夋帾鏂藉偛瑙嗗叚鍥斤紝浠婂ぉ鐨凪icrosoft涔熸槸榪欐牱錛孷B1.0鏃訛紝Microsoft鎺ㄥ嚭"VBX"鎺т歡鎶鏈紝浼楀鐨勫皬鍏徃寰椾互鐢熷瓨錛孧icrosoft鑷繁涓嶅紑鍙?VBX"緇勪歡錛屽悓鏍?VBX"榪涘寲涓?OCX"鏃訛紝Microsoft騫朵笉鍗佸垎寮哄ぇ錛屽彲鏄繖縐嶈瘯鎺㈠緱鍒頒紬澶氬皬鍏徃鐨勫搷搴斻?997騫碝icrosoft Office 97銆?998騫碝icrosoft鎺ㄥ嚭Visual Studio 6.0錛岀粰浼楀涓佸皬鍏徃鎻愪緵浜嗙敓瀛樸佸彂灞曠殑鏈轟細(xì)錛屼緥濡侻icrosoft Office 97涓泦鎴愪簡Visual Basic for Application 5.0錛岃繖欏規(guī)妧鏈嬌寰楀嚑鐧懼杞歡寮鍙戝晢涓嶮icrosoft絳劇講浜哣BA鎶鏈鍙崗璁紝鍗充嬌AutoDesk榪欐牱鐨勫叕鍙擱兘涓嶮icrosoft絳劇講浜嗚繖涓崗璁紝榪欎釜鍗忚浣垮緱姣忎釜闆嗘垚VBA鐨勪駭鍝佺殑緇欎釜鐢ㄦ埛璁稿彲涓篗icrosoft浠?0$鐨勮鍙垂錛屽鏋滀綘浜嗚ВVSIP錛圴isual Studio Integration Protocol錛夊崗璁紝浠ュ強(qiáng)鏈夊灝戝叕鍙哥璁簡VSIP鍗忚錛屼綘灝辯湡姝f劅瑙夊埌Microsoft鐨勫彲鎬曪紱Microsoft Office 97銆乂isual Studio 6.0鐨勭敤鎴風(fēng)晫闈㈠崄鍒嗘紓浜紝涓轟粈涔圡icrosoft鑷繁鐨勫紑鍙戝伐鍏蜂笉鎻愪緵綾諱技鐨勮蔣浠剁粍浠訛紵浣犵湅鍒頒紬澶氱涓夋柟鐨凪icrosoft鐩熷弸綰風(fēng)悍鎺ㄥ嚭鑷繁鐨勭晫闈㈠簱浠ユā浠縈icrosoft錛屼粬浠笉浼?xì)鍙嶅Microsoft錛屽洜涓轟粬浠凡緇忓艦鎴愪簡浣垮緱Microsoft浠ュ強(qiáng)榪欎簺鍏徃寰椾互鐢熷瓨鐨勭敓鎬佸湀銆?/p>
銆銆Microsoft鐨勬妧鏈偍澶囨湁澶氬皯錛孧icrosoft涔嬪鐨勪漢寰堥毦璇存竻妤氾紝Microsoft涓浗鍏徃涔熸湭蹇呬簡瑙e灝戯紝1999騫碬TL綾誨簱鍒氬垰鍑虹幇鐨勬椂鍊欙紝浜轟滑灝卞笇鏈沇TL鑳藉緱鍒板畼鏂圭殑鏀寔錛屾垨鎺堟潈緇欎竴涓狹icrosoft涔嬪鐨勪竴涓叕鍙革紙浣犺兘鎯寵薄鍑築orland C++ 5.0鍐呯疆鐨凙ctiveX寮鍙戞満鍒舵槸鍩轟簬Microsoft ATL綾誨簱鍚楋紵錛夛紝鐩村埌浠婂ぉ錛學(xué)TL渚濈劧濡傛晠錛屾垜浠畬鍏ㄧ浉淇★紝濡傛灉Microsoft寮哄姏鎺ㄥ箍WTL錛學(xué)TL瀹屽叏鍙互嫻佽錛屽彲鏄疢icrosoft涓嶇己綾諱技鐨勬妧鏈紝綾諱技鐨勭被搴撹繕鏈塀CL(Base Control Library錛屼竴涓敤浜庡紑鍙戣交閲忕駭ActiveX鎺т歡鐨勭被搴?錛孧icrosoft榪樻湁涓涓熀浜嶢TL鐨勭被搴擄紝榪欎釜綾誨簱鐢ㄤ簬寮鍙慉ctiveX Designer錛孉ctiveX Designer鏄粷澶у鏁扮▼搴忓憳涓嶄簡瑙g殑涓綾誨璞★紝濡傛灉浣犵啛鎮(zhèn)塐ffice寮鍙戯紝浣犵煡閬揙ffice VBA 涓湁涓綾誨璞★紝鍗矲orm2錛屾澶朧B6.0 涓殑鎶ヨ〃璁捐鍣紙浠ュ強(qiáng)钁楀悕鐨凙ctive Reporter錛夛紝閮藉睘浜庢綾誨璞★紝鐢ㄨ繖涓被搴擄紝浣犲彲浠ヤ負(fù)VB6.0浠ュ強(qiáng)闆嗘垚VBA鐨勭郴緇熸彁渚涘畾鍒跺寲鐨勫彲瑙嗗寲璁捐鏈哄埗絳夌瓑錛屽浠夾ctiveX Designer宸茬粡婕斿寲涓洪泦鎴愪簬Visual Studio .NET涓殑璁捐鍣ㄣ?/p>
涓夈佸悜Microsoft瀛︿範(fàn)
銆銆鏃犺浠庝粈涔堣搴﹁瘎浠稭icrosoft錛屾垜瑙夊緱Microsoft鏄煎緱鎴戜滑瀛︿範(fàn)鐨勶紝濡傛灉璇寸敓媧誨湪榪欎釜鏃朵唬鏈塎icrosoft瀛樺湪鏄竴鍦虹伨闅撅紝浣犲氨搴旇鐥涙仺榪欎釜瀹朵紮錛屼絾浣犻鍏堣鍚戣繖涓浼欏涔?fàn)锛佹垜鏃犳剰湄?fù)Microsoft姝屽姛棰傚痙錛屾垜鍙槸鎯寵鍑哄崄鍑犲勾鎴戝Microsoft鎶鏈殑鎰熷彈銆?/p>
銆銆Microsoft鍦ㄧ爺絀跺紡鐨勫紑鍙戜腑鍙楃泭鏋佸ぇ錛屽鏋滀綘鏈夊叴瓚o紝浣犲彲浠ヨ闂?a 縐戝鏃犲浗鐣?銆傛妧鏈槸鍚︽湁鍥界晫錛熶笉鐭ラ亾鏄惁鏈夊畾璁猴紵錛佹兂鎯矰VD絳夋妧鏈笓鍒╃粰鍥藉唴涓氱晫甯︽潵鐨勭伨闅撅紝涓嶇煡閬撳簲涓嶅簲璇ョ棝瀹氭濈棝錛屽湪Microsoft鏍″洯鎷涜仒鐜板満鐨勬皵姘涗腑錛屾垜浼間箮鏄庣櫧浜嗕負(fù)浠涔堝浗浜?鍘熷垱鎶鏈?灝戝緱鍙溿傛垜璇昏繃鍑犳湰Microsoft浜氭床鐮旂┒闄㈢殑楂樻墜鍐欑殑涔︼紝鏄庢樉鍙互鐪嬪嚭錛孊ill gate 鏄粬浠殑綺劇棰嗚浠ュ強(qiáng)浠栦滑瀵筂icrosoft鐨勮檾璇氾紝鍥藉唴鐨勭爺絀舵満鏋勫簲褰撶爺絀朵竴涓婱icrosoft鐨勭敤浜轟箣閬擄紝Microsoft濂藉儚鏄笁鍥介噷鐨勪漢鐗╋紝涓嶇煡鏄垬澶囪繕鏄浌鎿嶏紝鎴栬呬簩鑰呯殑娣峰悎鐗┿傛垜緇忓父璺繃瑗挎牸鐜涘ぇ鍘︼紝絎竴嬈¤タ鏍肩帥澶у帵榪涘叆鐪熸湁"鏈濆湥"鐨勬劅瑙夛紝涔熶笌Microsoft涓浗鐨勫嚑涓眰嬈$殑浜烘墦榪囦氦閬擄紝鍚勪腑婊嬪懗瀹炲湪涓璦闅懼敖銆?/p>
銆銆鍦∣ffice澶ф垬涓紝鍥戒駭杞歡鐨勭‘鍦ㄤ竴浜涙柟闈笌Microsoft榪涜杈冮噺錛屽叾瀹炵粰浜虹殑鎰熻寰堝媺寮猴紝鐣岄潰涓婄殑浼兼槸鑰岄潪錛屾垨鐢ㄦ埛涔?fàn)鎯枤w潰鐨勬帴榪戝茍涓嶈兘瑙e喅鏍規(guī)湰鐨勯棶棰橈紝涓涓ソ鐨勮蔣浠跺紑鍙戜漢鍛樺繀欏繪槸涓涓蔣浠朵嬌鐢ㄧ殑楂樻墜錛屽緢闅炬兂璞′竴涓蔣浠舵搷浣滄按騫沖緢鎷欏姡鐨勫紑鍙戜漢鍛樿兘寮鍙戝嚭楂樻按騫崇殑杞歡錛屾垜鏈鏃╀嬌鐢ㄧ殑杞歡涔嬩竴灝辨槸Microsoft Word錛屽綋鏃剁殑鐗堟湰鏄?.0錛屽ぇ姒傛槸1992騫寸殑浜嬫儏錛岀粰鎴戠暀涓嬫繁鍒誨嵃璞$殑鏄泦鎴愪簬Word涓殑Word Basic錛屽悗鏉ワ紝鎴戞帴瑙﹀埌Excel 3.0錛屼笉鍑烘墍鏂欙紝Excel涓泦鎴愮殑鏄疎xcel Basic錛屽悗鏉ヤ嬌鐢ㄧ殑Access涓嚜鐒跺唴緗瓵ccess Basic 1.0錛屽湪榪欎簺杞歡闆嗘垚鎹嗙粦鎴怬ffice涔嬪墠錛屾垜灝辨劅瑙夎繖浜涗駭鍝佺殑鏋勬濆崄鍒嗕簡涓嶈搗錛屽緢鍏鋒湁Microsoft鐨勯鏍鹼紝鍥犱負(fù)浣犵煡閬擄紝鍗充嬌鏄竴涓狣OS錛孧icrosoft閮借鎻愪緵涓涓唴緗殑QBasic鎴朑W Basic銆傝櫧鐒跺叧浜嶮icrosoft鐨勪駭鍝佽瘎璁哄緢澶氾紝浣滀負(fù)涓涓妧鏈漢鍛橈紝鎴戣涓篗icrosoft鐨勪駭鍝佹瀯鎬濈粷瀵規(guī)槸絎竴嫻佺殑錛屼粠1994騫存棭鏈熺殑Office緋誨垪鍒?997騫村艦鎴愮殑Office 4.2錛屾垜璁や負(fù)錛屾妧鏈瀯鎬濅笂鍧囬鍏堜簬鎴戝浗2002騫翠互鍚庣殑Office浜у搧錛屼綘鍚榪囧涓嬭娉曞悧錛?Dos 浣滀負(fù)鎿嶄綔緋葷粺鐨勬椂浠o紝W(xué)indows鏄簲鐢ㄨ蔣浠訛紱Windows鏄搷浣滅郴緇熸椂錛孫ffice鎴愪負(fù)Dos鏃朵唬鐨刉indows錛涢偅涔堝鏋滄寜姝よ寰嬶紝Office浼?xì)涓嶄細(xì)鏇夸唬Windows鑰屾垚涓烘搷浣滅郴緇燂紵"錛岀幇鍦ㄥ湪寮鍙戦鍩烿isual Studio( .NET)姝e湪鎴愪負(fù)鍙︿竴涓狾ffice錛屼綘娉ㄦ剰鍒頒簡鍚楋紵鎺у埗Visual Studio( .NET)闆嗘垚寮鍙戠幆澧冪殑浠嶇劧鏄竴涓狟asic璇█寮曟搸錛圴isual Basic .NET錛夈?
銆銆涓庤澶氬叕鍙鎬笉鍚岀殑鏄紝鍦ㄦ妧鏈綋緋諱笂錛孧icrosoft鍑犱箮鎵鏈夌殑浜у搧鏄伅鎭浉鍏崇殑錛學(xué)indows銆丱ffice銆乂isual Studio .NET铏界劧鍚勪笉鐩稿悓錛屼絾鍏叡鐨勬牳蹇冨嵆灝嗗艦鎴愶紝鎴戜滑宸茬粡鐪嬪埌錛屾牳蹇冪粍浠舵柟闈紝Office涓嶸isual Studio .NET鏃ユ笎瓚嬩簬涓鑷達(dá)紝渚嬪Microsoft姝e湪灝哋ffice 2003鐨勬牳蹇冪粍浠禫BA 6.X閫愭鐢ㄦ柊鐨刅isual Studio Tools for Office鏇夸唬錛岃屾垜浠緷鐒跺湪涓浜涗技鏄岄潪鐨勭幇璞′笂涓嶮icrosoft鐨勪駭鍝佹瘮杈冨樊璺濓紝鍥藉閲囪喘鎴栨斂搴滈噰璐敮鎸佺殑鍏徃錛屼笉鍘婚捇鐮旀牳蹇冩妧鏈紝鍙槸鎬ュ姛榪戝埄鐨勯噰鐢ㄧ煭鏈熻涓烘ヤ簬涓嶮icrosoft鐩鎬簤錛屼笉鐭ユ槸鍚︽湁铓嶈湁鎾兼爲(wèi)鐨勬劅瑙夛紝涓漢鐨勪綋楠屾槸錛屽厛瀛︿範(fàn)Microsoft錛岃笍韙忓疄瀹炵殑瀛︼紝浜嗚ВMicrosoft錛屾繁鍏ョ殑浜嗚В錛岀劧鍚庡啀鍠婂彛鍙楓?/p>
鍥涖佷負(fù)浠涔堢敤MFC錛?/p>
銆銆緇忚繃鑻ュ共騫寸殑绔炰簤錛孊orland 鐨凮WL鍑犱箮娑堝け浜嗭紝榪欎釜OWL鏄釜闈炲父婕備寒鐨凜++綾誨簱錛屽湪Borland C++ 3.1椋庡厜鏃犻檺鐨勫勾浠o紝OWL鐪熸鐨勫仛鍒頒簡鐙椋庨獨(dú)銆傜劧鑰岋紝Borland C++ 4.0閿欒繃浜嗚繘鍏?2浣嶇▼搴忕殑鏈浣蟲椂鏈猴紝BC 4.0鎺ㄥ嚭鍚庝笉涔咃紝榪庢潵浜哤in95錛孊orland浠撲績涓婇樀錛屼互涓涓皬鐨?Pack"浣垮緱BC4鍙互緙栬瘧鍩轟簬Win4鐨勭▼搴忥紝褰撴椂鐨刅isual C++鏄?.0鐗堬紝鏀寔Window16鐨勭増鏈負(fù)Visual C++1.51錛屾湁鎰忔濈殑鏄疊orland鍙互鐢ㄥ悓涓涓紪璇戝櫒鍚屾椂鏀寔Win16銆乄in32錛岃孧icrosoft鍗翠笉寰椾笉涓篧in16銆乄in32鎻愪緵涓嶅悓鐨勭紪璇戝櫒銆傜劧鑰岋紝闈炴寮忕増鏈殑Visual C++ 2.1涓嶸isual C++ 2.2鍗存?zhèn)勬?zhèn)勫湴鏀寔浜哤in95鐨勬渶鏂扮壒寰侊紝鍗砏in95鏂版彁渚涚殑涓緇勫叕鍏辨帶浠訛紝鍦ㄦ垜鐨勫嵃璞′腑錛孊orland瀵筗in95鏂扮壒寰佺殑鏀寔涓嶅埄浣垮緱MFC涓嶰WL鐨勮窛紱繪瀬澶х殑緙╃煭浜嗐傜◢鍚庡埌鏉ョ殑Borland C++ 4.5娌℃湁鏀瑰彉榪欎釜鐘跺喌錛屽敖綆orland C++ 5.0鍚屾椂鏀寔OWL涓嶮FC錛屽彲鏄觸璞″凡緇忔樉闇詫紝Borland C++闈炲父閬楁喚鐨勫彧璧板埌浜?.5鐗堛侰++ Builder铏界劧褰㈠紡涓婂紩鍏ヤ簡Delphi鐨刅CL搴擄紝鍙槸璁稿C++紼嬪簭鍛樺茍涓嶄拱璐︼紝鍥犱負(fù)璁稿浠++涓轟箰鐨勪漢鏇村枩嬈互緙栬緫鐨勬ā寮忚繘琛岀紪鐮併俈isual C++ 4.0鐨勫嚭鐜幫紝鍦–++榪欎釜鎴樺満涓婏紝Borland寮濮嬭惤璐ヤ簡銆?/p>
銆銆MFC鍙戝睍鍒頒粖澶╋紝宸茬粡鍗佸騫翠簡錛屽敖綆¤璐笉涓錛屼絾鍙互鑲畾錛屽崄鍑犲勾鐨勬妧鏈Н绱凡緇忓瀹氫簡MFC鐨勭敓瀛樺熀紜錛屽嵆浣縈icrosoft鐨勯暱瑙掑彂甯冿紝MFC涔熶笉鑳芥帹鍑篧indows鐨勮垶鍙幫紝浜嬪疄涓婏紝闀胯錛圠onghorn錛変箣鍚庣殑Visual Studio .NET浠嶅皢MFC浣滀負(fù)涓涓噸瑕佺殑緇勬垚閮ㄥ垎錛屽湪浠婂勾鐨刅isual Studio .NET 2005涓紝MFC鍦–++涓殑浣嶇疆渚濈劧濡傛晠銆侻FC鐨勬湭鏉ワ紝搴旇涓嶅繀鎷呭績錛屽彧瑕佷綘娣卞叆鑰冨療.NET綾誨簱錛屼綘浼?xì)鍙戠帋图孧FC鐨勮澶氭濇兂鏈哄埗姝f?zhèn)勭劧杩涘?NET錛屼笌姝ゅ悓鏃訛紝Microsoft鐨勭涓夋柟鐩熷弸鍗佸騫存潵宸蹭負(fù)MFC寮鍙戜簡澶ч噺鐨勬墿灞曞簱錛屽鏋淢icrosoft鏄埞錛岀涓夋柟鐩熷弸灝辨槸杞借垷涔嬫按銆傝澶氫漢璁や負(fù)MFC涓嶅彂灞曚簡錛屽叾瀹炴槸涓縐嶉敊瑙夛紝Visual C++ 6鐨勭晫闈㈠崄鍒嗙粡鍏革紝鐗瑰埆鏄叾涓殑Docking鎺у埗鏉℃満鍒訛紝鍏跺疄Visual C++ 6鐨処DE瀹屽叏灝辨槸MFC鍐欑殑錛屽彲鏄疢FC綾誨簱涓帶鍒舵潯鐩稿叧鐨勭被鍔熻兘寰堝急錛屼負(fù)浠涔堬紵浣犱細(xì)鐪嬪埌璁稿涓嶮icrosoft鍙嬪ソ鐨勫叕鍙革紝浠栦滑寰堝揩鐨勫湪MFC鍩虹涓婂疄鐜頒簡Visual C++ 6 鐨凞ocking鏈哄埗錛岃繖灝辨槸Microsoft鐨勯珮鏄庝箣澶勶紝Microsoft寰堜細(xì)緇欑洘鍙嬫彁渚涙満浼?xì)锛屽叾涓璐殑鍋氭硶灝辨槸鍦ㄨ嚜宸辯殑鍟嗗搧鍖栦駭鍝佷腑棰勫厛鎻愪緵涓浜涙湁瓚g殑鐗瑰緛錛屼嬌寰楀叾浠栦竴浜涘叕鍙歌繘琛屾ā浠夸互甯﹀姩鐢ㄦ埛緹や綋銆侭orland涓嶅叿澶囪繖鏍風(fēng)殑鍌ㄥ銆侻FC絎笁鏂瑰競鍦虹殑綣佽崳錛屽緱鐩婁簬Microsoft鐨勭瓥鐣ヤ笌鏄庢櫤銆侻FC鍙惁璺ㄥ鉤鍙幫紵鐞嗚涓婂畬鍏ㄥ彲浠ワ紝Microsoft涓嶅仛錛屼篃鏄瓥鐣ワ紝浣嗘槸鏈夎澶氶噸瑕佺殑浜у搧Microsoft鍗撮粯璁窶FC縐繪鍒板叾浠栧鉤鍙幫紝浜嬪疄涓婏紝Microsoft鐨勫悎浣滀紮浼翠箣涓Mainsoft鍏徃錛圵indows婧愮爜灝辨槸浠庤繖瀹跺叕鍙告祦澶辯殑錛夛紝鍑犲勾鏉ュ氨鏄礋璐gЩ妞峂FC紼嬪簭縐繪鍒癠INIX銆丩inux銆丄IX絳夋搷浣滅郴緇熶箣涓娿?/p>
銆銆鏂扮増鐨刅isual C++涓璏FC宸茬粡鏀寔.NET寮鍙戜簡錛孧FC涓嶢TL鐨勫崗浣滄洿濂戒簡銆傛牴鎹垜鐨勭粡楠岋紝MFC銆丄TL涓?NET搴撲笁鑰呭畬鍏ㄥ彲浠ヨ瀺鍚堝湪涓璧風(fēng)患鍚堝簲鐢ㄥ埌瀹為檯鐨勫紑鍙戝伐浣滀腑鍘伙紝濡傛灉浣犳槸MFC琛屽錛屾垜甯屾湜ATL涓?NET搴撹兘鎴愪負(fù)浣犵殑蹇犲疄鐨勫乏鍙蟲墜銆傞偅涔堟湁娌℃湁鍚屾椂鏀寔MFC銆丄TL涓?NET搴撶殑紼嬪簭錛熷綋鐒舵湁錛孷isual Studio .NET IDE灝辨槸錛佽屼笖Visual Studio .NET IDE榪樻敮鎸佺敤ATL涓?NET搴撴墿灞曠殑Addin錛屽鏋滀綘甯屾湜鐢∕FC綆$悊ATL涓?NET搴擄紝璇風(fēng)戶緇敮鎸佹垜錛?/p>
浜斻佽璇咥pplication瀵硅薄
銆銆濡傛灉浣犵啛鎮(zhèn)塎icrosoft Office錛屼綘搴旇榪涗竴姝ョ殑鍓栨瀽榪欎釜澶у瀷杞歡錛孧icrosoft Office涓嚑涔庢瘡涓▼搴忛兘鏄彲浜屾寮鍙戠殑錛岃繖涓鐐瑰緱鐩婁簬Microsoft Office鍐呯疆鐨勪簩嬈″紑鍙戞満鍒訛紝涓涓槸鍩轟簬COM鏈哄埗鐨刅BA妯″瀷錛屽彟涓涓槸鍩轟簬.NET妗嗘灦鐨勬墭綆℃ā鍨嬶細(xì)Visual Studio Tools for Office銆備綔涓轟竴鍚嶇▼搴忓憳錛屼綘搴斿綋鍦ㄦ妧鏈搴﹁В鏋怬ffice鐨勬妧鏈粨鏋勩侻icrosoft鐨勫ぇ澶氭暟杞歡鐨勫璞$粨鏋勫彲浠ラ氳繃Visual Studio鎻愪緵鐨勫伐鍏稯LE/COM Object Viewer鑰冨療鍏剁被鍨嬪簱寰楀埌錛岄氳繃寮曠敤綾誨瀷搴擄紝浣犵敋鑷沖彲浠ュ緱鍒版弿榪板璞′俊鎭殑C++澶存枃浠躲傝繖鏍峰仛鐪熸槸濂藉澶氬銆備竴涓吀鍨嬬殑Office閫氬父閮芥湁涓涓狝pplication瀵硅薄錛堟垨鍏朵粬涓涓笌涔嬬浉褰撶殑瀵硅薄錛夛紝榪欎釜瀵硅薄鐩稿綋浜庤蔣浠舵灑綰斤紝鍦ㄨ繖閲岋紝鎴戜滑涓嶈璁篛ffice錛屽熸璇濋璇磋Application瀵硅薄銆傚ぇ澶氭暟鏀寔鎵╁睍錛圓ddin銆丳lugin錛夌殑杞歡閮藉瓨鍦ㄧ被浼肩殑鏋勯犮傞氬父錛屼竴涓郴緇熷緱Application瀵硅薄鎴栬呮槸涓涓狢OM瀵硅薄錛屾垨鑰呮槸涓涓?NET瀵硅薄錛屽鏋滀綘鐨勭郴緇熷瓨鍦ㄨ繖綾誨璞★紝浣犵殑緋葷粺灝卞熀鏈叿澶囨敮鎸丄ddin銆丳lugin鐨勬満鍒朵簡銆備竴涓悊鎯崇殑鍋氭硶灝辨槸鍦ㄤ竴涓狹FC緋葷粺涓紝鍐呯疆涓涓狝TL瀵硅薄鎴?NET瀵硅薄錛岀◢鍚庢垜浠粰鍑烘柟妗堝浣曞仛鍒拌繖涓鐐廣傝璁pplication瀵硅薄鐨勫叧閿槸濡備綍瑙勫垝榪欎釜瀵硅薄鐨勫睘鎬с佹柟娉曘佷簨浠躲傚鏋滀綘甯屾湜緋葷粺鍏峰鑹ソ鐨勬墿灞曟э紝Application瀵硅薄鏄崄鍒嗗叧閿殑錛岃繖涔熸槸鏋勬灦鑹烘湳鐨勪綋鐜般傛墍璋揂ddin(Plugin)錛屾槸緋葷粺榪愯鏃舵牴鎹渶瑕佸姞杞界殑瀵硅薄搴擄紝Addin(Plugin)涔嬫墍浠ュ彲浠ユ墿灞曠郴緇燂紝鍏抽敭鐨勫洜绱犲氨鏄郴緇熷姞杞紸ddin(Plugin)鏃訛紝灝咥pplication瀵硅薄浼犻掔粰Addin(Plugin)搴擄紝璁炬兂涓涓嬶紝濡傛灉Application鎭板埌濂藉鐨勮Е鍙戜簡緋葷粺浜嬩歡錛岃孉ddin(Plugin)搴撳鎰跨殑瑙i噴浜嗕簨浠訛紝涓涓狝ddin(Plugin)搴撶殑浠誨姟涓嶅氨O(jiān)K浜嗗悧錛佸洜姝pplication瀵硅薄鏄郴緇熻璁$殑鍏抽敭銆?/p>
銆銆濡傛灉浣犵簿閫欰TL瀵硅薄錛屽湪浣犵殑MFC緋葷粺涓坊鍔犱竴涓狝TL瀵硅薄錛岃繖涓換鍔″彲浠ョ敤VC Wizard瀹屾垚銆備綘宸茬粡鎺ュ彈浜嗕竴涓簨瀹烇紝灝辨槸MFC紼嬪簭涓瓨鍦ㄤ竴涓狢XXXApp瀵硅薄錛圕WinApp鐨勬淳鐢熺被錛夛紝鐜板湪浣犺鍋氱殑鏄鍔犱竴涓搴斿緱ATL瀵硅薄銆傝繖涓璞″彲浠ュ湪CXXXApp::InitInstance()涓垱寤猴紝濡傛灉ATL瀵硅薄鐨勭被鏄疌XXXAppObject錛屽緩璁綘鍦–XXXApp瀵硅薄瀵硅薄涓鍔犱竴涓垚鍛樺彉閲忥紝渚嬪錛欳ComObject<CXXXAppObject>* m_pAppObj錛岀劧鍚庡彲浠ュ叆涓嬪垵濮嬪寲m_pAppObj錛?/p>
m_pAppObj = new CComObject<CXXXAppObject>錛?/p>
銆銆娉ㄦ剰紼嬪簭緇撴潫鏃跺湪CXXXApp::ExitInstance()涓噴鏀緈_pAppObj錛岃鍙ュ涓嬶細(xì)
delete m_pAppObj錛?/p>
銆銆浣犲彲浠ュ皢緋葷粺寰楀叧閿睘鎬ц緗垚CXXXAppObject鐨勫睘鎬э紝渚嬪緋葷粺寰楁爣棰樸佹槸鍚︿負(fù)澶氭枃妗g瓑絳夈傜郴緇熷笇鏈涘閮ㄨ皟鐢ㄧ殑鍔熻兘鍙互瀹炵幇涓篊XXXAppObject鐨勬柟娉曪紝榪欎竴鐐瑰彇鍐充簬浣犵殑闇瑕併傜郴緇熼渶瑕佸閮ㄦ墿灞曠殑鍔熻兘錛岃〃鐜頒負(fù)CXXXAppObject鐨勪簨浠訛紝鍏抽敭鏄湪鎭板綋鐨勪綅緗Е鍙戜簨浠朵互鍙?qiáng)鎻愪緵鐨勪簨錃g鍙傛暟銆備緥濡傦紝浣犲彲浠ュ湪CXXXApp::InitInstance()瑙﹀彂搴旂敤紼嬪簭寮濮嬬殑浜嬩歡OnStartUp錛孭lugin鎹曡幏浜嬩歡鍚庯紝鍙互榪涜鐗瑰畾鐨勫垵濮嬪寲錛堣韓浠界‘璁ゃ佸垵濮嬩俊鎭煡璇㈢瓑絳夛級錛涗綘鍙互鍦–XXXApp::ExitInstance()瑙﹀彂搴旂敤紼嬪簭緇撴潫浜嬩歡錛孭lugin鎹曡幏浜嬩歡鍚庯紝澶勭悊鐢ㄦ埛闇瑕佺殑緋葷粺閫鍑哄伐浣溿傛墍鏈夌殑璁捐鍙栧喅浜庡叿浣撹璁°?/p>
銆銆濡備綍鍔犺澆Plugin錛屾槸涓涓湁瓚g殑闂錛屽鏋淧lugin瀹炵幇涓轟竴涓狢OM鑼冪暣錛圕ategory錛夛紝鍙互榪愮敤COM鎶鏈灇涓捐繖涓狢ategory錛涘彲浠ュ皢Plugin瀹夎鍒頒竴涓壒瀹氱洰褰曪紝涔熷彲浠ラ氳繃娉ㄥ唽琛ㄣ侾lugin鐨勫疄鐜板彲浠ョ敤COM鎶鏈佷篃鍙互鐢?NET妗嗘灦銆傞傚綋鐨勬満浼?xì)鎴戜細(xì)鎻愪緵渚嬪瓙鈥︹?/p>
鍏佸悗璁?/p>
銆銆涓鏃跺績琛鏉ユ疆錛屽氨鍐欎簡榪欑瘒鏂囩珷錛屽緢闅捐鏄湁蹇冿紝榪樻槸鏃犳剰銆傚嚑澶╁墠鎴戝湪鏂版氮緗戜笂鐪嬪簲姘忔澂鍥存鍐寵禌錛屾垜瑙夊緱璇ヨ耽浜嗗惂錛屼綔涓轟竴涓洿媯嬭糠錛屾垜浠瓑浜嗗崄鍑犲勾錛岀瓑鍒頒簡灞炰簬鍥戒漢鐨勫簲姘忔澂銆傝寰?銆?騫村墠鍦ㄨ繕鍦ㄥぇ瀛﹀伐浣滅殑鏃跺欙紝鏈変竴嬈★紝涓浣嶅悓浜嬪叴鑷村啿鍐茬殑璧伴亾鎴戦潰鍓嶅鎴戣錛?鍡紝鏄ㄥぉ椹琗X璧簡鏉庢槍闀愶紒"錛屽綋鏃舵垜鍦ㄧ郴鍔炲叕瀹ゆ鍦ㄧ湅鎶ョ焊錛岄偅浣嶄粊鍏勮鎴戝ご閮芥病鎶紝闈炲父涓嶆弧鐨勬姠涓嬫姤綰革紝瀵規(guī)垜鍚奸亾錛?鍠傦紒椹琗X璧簡鏉庢槍闀愶紒錛佷綘鍚埌娌℃湁錛侊紒錛?錛屾垜瀵逛粬璇達(dá)細(xì)"浣犲ぇ鎯婂皬鎬釜鍟ワ紵錛侀┈XX杈撲簡鏉庢槍闀愬灝戠洏錛屼綘鐭ラ亾鍚楋紵"錛岄┈XX鍑犱箮涓鐩村湪杈撶粰鏉庢槍闀愶紝浜轟滑宸茬粡涓嶅鎬簡錛屽伓灝?dāng)璧竴嬈★紝鍥戒漢灝辨妸浠栨崸寰楀寳閮芥壘涓嶅埌浜嗭紝鏉庢槍闀愬急鍐?7鐨勬椂鍊欏氨鍌茶榪欎釜涓栫晫浜嗭紝鍙嚦浠婇潰瀛斾笉鍙橈紝鍑犲ぉ鍓嶇殑鍐滃績鏉紝涓棩鑱斿啗5涓漢錛岃浠栨墦涓惤鑺辨祦姘達(dá)紝鏉庢槍闀愭槸鍏鐨勪笘鐣岀涓錛屼互鑷充簬鏈夌殑楂樻墜鐭ラ亾涓嬩竴涓鎵嬪鏋滄槸浠栵紝灝變細(xì)鍘昏鍥炵▼鏈虹エ銆傝繖嬈″簲姘忔澂錛屽浗浜虹珶鐒舵劅璋㈠磾鍝茬氾紝浣曚篃錛熷洜涓鴻繖涓急鍐?9鐨勫皬瀛愶紝鎸′綇浜嗕粬鐨勫ぇ鍝ユ潕鏄岄晲鎵嶄嬌寰楀簲姘忔澂鏈変簡鎮(zhèn)康銆傚綋鍥戒漢濯掍綋鍦ㄨ闊╁浗浠呮潕鏄岄晲涓浜哄帀瀹崇殑鏃跺欙紝涓嶇煡閬撴槸鍑轟綍灞呭績榪樻槸鑷嬈轟漢錛屾潕鏄岄晲騫存柟30錛屼笉鐭ラ亾瑕佸姏鍘嬩腑銆佹棩澶氬皯騫達(dá)紒闈㈠榪欎釜鍚嶅瓧錛岀湡鏈夌偣楹繪湪浜嗭紝榪欎釜澶瀬铏庯紒
銆銆杞歡鐣屽張鏉ヤ簡鎴戜滑涓鍚戜笉榻跨殑鍗板害铏庯紝2001騫存垜浠殑杞歡鍑哄彛棰濅粎鏄嵃搴︾殑鍥涘崄鍒嗕箣涓錛屾垜浠渿鎯婁簡錛屾庝箞鍙兘鍛紵榪欎釜鍥涘崄鍒嗕箣涓姘村垎寰堝ぇ錛屽緢鍙兘鏇村彲鎬滐紒褰撴椂鎴戝湪澶ц繛鍙傚姞涓涓叧浜?澶ц繛杞歡鍑哄彛鍥藉唴絎竴"鐨勫畼鏂逛細(xì)璁紝閭d綅澶т漢鍦ㄤ細(xì)涓婅錛?鎹錛屾垜浠ぇ榪炶蔣浠跺嚭鍙e浗鍐呮帓鍚嶇涓錛屽競鏈夊叧棰嗗甯屾湜浠婂ぉ鐨勪細(xì)璁粰鍑鴻繖涓涓鐨勬暟瀛椾緷鎹紝甯屾湜浣犱滑鎶婃暟鎹姤涓婃潵錛屽幓騫寸殑鏁版嵁涔熷彲鐢蟲姤錛屾敞鎰忥紝鎴戜滑瑕佺殑鍙槸鏁版嵁錛屼綘浠粩緇嗕綋浼?xì)锛屾垜浠犚?guī)嵁鏁版嵁錛屾湁濂栧姳錛屾満浼?xì)闅惧緱鍛錛?鈥︹︺傛煇涓澶╋紝鍑犱釜鏈嬪弸鍦ㄦ垜瀹剁湅澶鐨勫璇濊妭鐩紝瀵硅瘽涓鏂逛負(fù)鍥藉唴鐨勮蔣浠跺ぇ槌勪滑錛堢敤鍙嬨侀樋灝?dāng)娲窘{夊叕鍙哥殑鑰佹諱滑錛夛紝鍙︿竴鏂逛負(fù)鍗板害杞歡鐨勪竴涓唬琛ㄥ洟銆傚綋闂強(qiáng)涓佸嵃杞歡宸窛鐨勬椂鍊欙紝鎴戜滑鐨勫垬鑰佹伙紙浠h〃闃垮皵媧撅級涓嶄互涓虹劧鐨勮錛屾嵁浠栫殑鐪嬫硶錛屾垜浠凡緇忓揩璧朵笂錛堝嵃搴︼級浜嗭紝鈥︹︼紝璦涓嬩箣鎰忛鏈夊嵃搴︾殑姘村鉤涓嶈繃濡傛鐨勬劅瑙夛紝鍗板害鏂圭殑璇濇垜鑷充粖璁板繂鐘規(guī)柊錛?鏄惁璧朵笂錛屽浗闄呭競鍦鴻鐨勭畻錛佸湪涓浗鐪嬫潵錛屽嵃搴︾▼搴忓憳鐨勪釜鎬т笉瓚籌紝鎶鏈篃涓嶆庝箞鏍鳳紝鍏跺疄鏄釜閿欒錛屽嵃搴﹁蔣浠墮鍏堟敞閲嶄釜鎬э紝璁稿閲嶈鐨勭編鍥藉晢鍝佸寲杞歡閮芥槸鍦ㄥ嵃搴︽湰鍦熷紑鍙戠殑鈥︹?錛屾垜浠殑鑸嗚鎬繪槸灝嗗嵃搴︾▼搴忓憳鐨勬按騫蟲弿榪扮殑騫沖焊鑷蟲瀬錛屽彲鏄樊璺濇棩娓愭媺寮錛屸︹︼紝鍥存銆佽凍鐞冿紙涓嶅ソ鎰忔濊皥錛岃皥涓嶅嚭鍙o紒錛夈佽蔣浠訛紝鎴戜滑琚繎閭諱弗閰風(fēng)殑灝侀攣浜嗭紝涔愬潖浜嗚鑰呬滑銆佺粰濯掍綋甯︽潵浜嗙敓鏈衡︹?
銆銆鏃ユ湰姹熸埛鏃朵唬鐨勫洿媯嬶紝濡傛灉涓涓漢瑕佹兂涓栬涓涓О鍙鳳紙渚嬪錛氭湰鍥犲潑錛夛紝浠栧繀欏繪垬鑳滄墍鏈夌殑甯堝厔寮燂紝鐒跺悗錛屼綇榪涘笀鐖跺鐨勫唴瀹わ紝浣犵煡閬撲互鍚庣殑浜嬫儏鍚楋紵浠ュ悗錛岃繖涓鎵嬶紝灝卞緱涓哄笀鐖朵竴瀹跺仛楗佸甫瀛╁瓙銆佹悶鍗敓鈥︹︼紝鍏朵綑鐨勯棬浜哄垯涓蹇冧竴鎰忕殑涓嬫錛岃繖鏍風(fēng)殑浜恒佹柟寮忥紝閫犲氨浜嗕竴浠d竴浠g殑鏈洜鍧婏紝浠栦滑鐨勬璋卞ぇ澶氭暟閮芥祦鑺寵嚦浠婏紝榪欏氨鏄棭鏈熸棩鏈洿媯嬬殑鎮(zhèn)熼亾妯″紡銆傝蔣浠舵誨叡鏈夊灝戣鍙ワ紵鎴戞渶鏃╂帴瑙︾殑璁$畻鏈鴻蔣浠舵暀鏉愭槸涓鏈嫳鏂囩増鐨勶紙褰卞嵃鐨凞鐗堬級錛屼笉鍚屼簬鎴戜滑錛岄偅鏈功鐨勪綔鑰呮瀯閫犱簡"X-璇█"錛屼粬浠笉璁蹭粈涔圕銆丳ascal銆丅asic錛屼竴鏃︾己浜嗕粈涔堟満鍒訛紝灝辯粰"X-璇█"娣誨姞浜涙垚鍒嗐備粈涔圕銆丳ascal銆丅asic錛屼綘鎰熻宸笉澶氾紝浣嗙幇鍦ㄥ嵈鍒嗗嚭浜嗙瓑綰э紒鎴戜滑椹鵑┉璇█鐨勮兘鍔涘急寰楀緢錛屽彲鏄垜浠湪璇█鐨勭粏寰箣澶勫嵈寰堣絀訛紝涓嶇煡閬撳涓嶅錛岃澶氱▼搴忓憳涔熻鏄嚭浜庤櫄鑽h岀敤C++錛屼簨瀹炰笂錛屽湴鐞冧漢鍒扮煡閬擄紝鍋氭暟鎹簱錛孌elphi銆乂B榪滄瘮C++鑳滀換錛岄摵澶╃洊鍦扮殑C++鐨勪功錛屽啓鐨勪笢瑗垮嚑涔庨浄鍚岋紝鍥犱負(fù)錛屾湁鐢ㄧ殑鎴栬呬綔鑰呬笉鍐欍佹垨鑰呬綔鑰呬笉鎳傘傛湁鏃舵垜鍦ㄦ兂錛屽鏋滃浗鍐呮病鏈夊唴闇錛屼細(xì)鎬庢牱錛熶篃璁歌蔣浠跺唴闇鐨勫瓨鍦紝閫犲氨浜嗕腑鍥借蔣浠剁殑鐗硅壊錛屾垜璁や負(fù)鍥藉唴涓氱晫騫舵病鏈夊厖鍒嗗埄鐢ㄤ腑鍥借蔣浠跺唴闇鐨勫瓨鍦紝涔熻涓浗杞歡鍐呴渶鐨勫瓨鍦ㄦ槸杞歡钀藉悗鐨勭‖浼ゃ?/p>
銆銆鎴戣寰椾竴閮ㄧ數(shù)褰便婄杈嬶紝閭d釜鑻遍泟鐨勫ぇ杈瓙琚磱浜虹偢鎺変簡錛屾渶緇堜粬鎴愪簡紲炴灙鎵嬶紝鎴樿儨媧嬩漢鐢ㄥぇ鍒銆佺綾嶆槸涓嶈鐨勶紝鐢ㄦ磱鐨勪笢瑗挎垬鑳滄磱鐨勬妧鏈墠鏄閬撱傛垜瑙夊緱錛屼竴涓ソ鐨勭▼搴忓憳蹇呴』浜嗚В杞歡鐨勫巻鍙詫紝瀛︿範(fàn)鍘嗗彶錛屼綘鐭ラ亾浣犱負(fù)浠涔堝急錛屽埆浜烘槸濡備綍寮哄ぇ鐨勩傛垜浠鍦ㄥ彟涓涓垬鍦轟笂鎶楃編錛堝彲絎戠殑鏄垜浠嵈瑕佽刀瓚呭嵃搴︼紒錛夛紝鏃犺Microsoft銆丅orland濡備綍浜夋枟錛屾棤璁轟粬浠皝緇熸不璋侊紝浠栦滑涓嶅獎鍝嶇編鍥界殑寮哄ぇ錛屾湅鍙嬩滑錛屽涔?fàn)Microsoft錛屽紑鍙戝嚭璁╁浗浜烘劅鍒扮墰鐨勮蔣浠訛紒