锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆涓轟粈涔堜細瀛樺湪榪欎箞澶氶敊璇璇?鍘熷洜涓昏鏈変笁涓紝涓鏄疌++璇█鐨勭粏鑺傚お澶氥備簩鏄竴浜涜憲鍚嶇殑C++涔︾睄鎬誨湪(涓嶇鏈夋剰榪樻槸鏃犳剰)鏆楃ず璇█緇嗚妭鐨勯噸瑕佹у拰鏈夎叮銆備笁鏄幇浠++搴撶殑寮鍙戝摬瀛﹀繀欏葷敤鍒頒竴浜涚妱瑙掓棶鏃殑璇█緇嗚妭(浣嗘敞鎰忥紝鏄簱璁捐錛屼笉鏄棩甯哥紪紼?銆傝繖浜涘叡鍚屽閫犱簡C++紺劇兢鐨勬暣浣撳績鎬佸拰鍝插銆?/p>
銆銆鍗曟槸絎竴鏉¤繕鏈繀鑳藉鎴愭皵鍊欙紝鍏跺畠璇█鐨勭粏鑺備篃涓嶅皯(灝界姣旇搗C++璧鋒潵榪樻槸灝忓帆瑙佸ぇ宸?錛屽氨鎷縥avascript鏉ヨ錛屼綔鐢ㄥ煙瑙勫垯錛屽悕瀛楁煡鎵撅紝closure錛宖or/in錛岃繖浜涢兘鏄粏鑺傦紝鑰屼笖鍏朵腑榪樻湁榪濆弽鐩磋鐨勩備絾璁稿鍔ㄦ佽璦鐨勭▼搴忓憳鐨勭悊蹇墊垜鐚滃ぇ綰︽槸瀛﹀埌鍝敤鍒板摢緗€備絾C++灝變笉涓鏍蜂簡錛屽C++涔嬩漢鏈変竴縐嶇被浼間簬琚殫紺虹殑娼滃湪蹇冩侊紝灝辨槸涓瀹氳鍏堟妸璇█鏍稿績鍩烘湰涓婂悆閫忎簡鎵嶈兘涓嬫墜鍐欏嚭婕備寒鐨勭▼搴忋傝繖棣栧厛灝遍敊浜嗐傝繖涓剰璇嗗艦鎴愮殑鍘熷洜鍦ㄧ浜岀偣錛孋++涔︾睄銆傚競闈笂鐨凜++涔︾睄涓嶈鍏舵暟錛屼絾鏈変竴涓叡鍚岀殑緙虹偣錛屽氨鏄璇█緇嗚妭鐨勪功澶鈥斺斻奀++ gotchas銆嬶紝銆奅ffective C++銆嬶紝銆奙ore Effective C++銆嬶紝浣嗘棤鍙帤闈炵殑鏄紝C++鏄繖鏍蜂竴闂ㄨ璦錛氳鎷垮畠婊¤凍鐜頒唬緙栫▼鐞嗗康鐨勯渶姹傦紝灝ゅ叾鏄疌++搴撳紑鍙戠殑闇姹傦紝榪樺繀欏誨緱鍏蟲敞璇█緇嗚妭錛屼箖鑷充簬鍦–++涓埄鐢ㄨ璦緇嗚妭宸茬粡鎴愪簡涓闂ㄥ闂傛瘮濡侰++妯℃澘鍦ㄨ璁′箣鍒濇牴鏈病鏈夋兂鍒版ā鏉垮厓緙栫▼榪欏洖浜嬶紝鏇存病鎯沖埌C++妯℃澘緋葷粺鏄浘鐏靛畬澶囩殑錛岃繖涔熷氨瀵艱嚧浜嗐奙odern C++ Design銆嬪拰銆奀++ Template Metaprogramming銆嬬殑鎯婁笘楠囦織銆?/p>
銆銆榪欎簺鎶鏈殑鍑虹幇涓轟粈涔堟儕涓栭獓淇楋紝鎵撲釜姣旀柟錛屽氨濂芥瘮鏄竴鍧楀ぇ瀹墮兘璁や負宸茬粡鐔熸倝鏃犳瘮錛屽啀鏃犵瀵嗗彲璦鐨勫湡鍦頒笂錛岀獊鐒舵煇澶╂湁浜烘寲鍒板師鏉ュ湴涓嬭繕钑磋棌鐫鏈涓板瘜鐨勭煶娌廣傚湪榪欎箣鍓嶇殑C++铏界劧涔熸湁涓浜涚粏鑺傦紝浣嗕篃榪樼畻瀹規槗鎺屾彙錛岄偅鍙槸C++紼嬪簭鍛樹滑鐨刪appy old times錛屽洜涓篊++鐨勪竴鍒囬兘涓瑙堟棤浣欙紝everything is figured out銆傜劧鑰屻奙odern C++ Design銆嬬殑鍑轟笘鍛婅瘔浜轟滑錛屸滅灖錛岃繕鏈夊灝戠粏鑺備綘浠病鏈夋帉鎻″晩銆傗濅簬鏄疌++紼嬪簭鍛樹滑涔呰繚鐨勬縺鎯呰閲嶇噧璧鋒潵錛屽涓嶉【韜殑韙忓叆緇嗚妭鐨勬布娉戒腑銆傚挨鍏舵槸錛屾ā鏉跨紪紼嬪皢C++鐨勭粏鑺傝繘涓姝ユ寲鎺樺埌浜嗘瀬鑷粹斺旀垜浠共鍢涘叧蹇冩秹鍙婄被瀵硅薄鐨勯殣寮忚漿鎹㈢殑浼樺厛綰ч珮浣?鐪嬬湅boost::is_base_of灝卞彲浠ョ煡閬撴湁澶氳寮備簡銆?/p>
銆銆浣嗘渶澶х殑闂榪樺湪浜庯紝瀵逛簬榪欎簺緇嗚妭鐨勫叧娉ㄨ繕鐪熸湁瀹冨悎閫傜殑鐞嗙敱錛氭垜浠寮鍙戠幇浠fā鏉垮簱錛岃寮鍙慳ctive library錛屽氨蹇呴』鍔ㄧ敤妯℃澘緙栫▼鎶鏈紝瑕佸姩鐢ㄦā鏉跨紪紼嬫妧鏈紝灝卞繀欏誨埄鐢ㄨ璦鐨勭妱瑙掓棶鏃紝enable_if錛宼ype_traits錛岀敋鑷寵繛鏃╁氨鍙や簳鏃犳嘗鐨凜瀹忎篃鍦ㄤ貢涓栦腑閲嶇敓錛岀湅鐪媌oost::preprocessor鏈夊璇″紓灝辯煡閬撲簡錛岃繛C瀹忕殑鍥劇伒瀹屽鎬?棰勭紪璇戞湡鐨?閮借鎸栨帢鍑烘潵浜嗐備負浠涔堣鍋氳繖浜?濂界帺?鏍囨?閮戒笉鏄紝寮鍙戝簱鐨勫疄闄呴渶姹傘備絾榪欎篃姝f槸鏈澶х殑鎮插搥浜嗐傚湪boost閲岄潰鍥犲疄闄呴渶姹傝屽姩鐢ㄨ璦緇嗚妭鏈緇堝眳鐒惰兘紲炲鐨勫畬鎴愪換鍔$殑鏈濂芥暀鏉愬氨鏄痓oost::foreach錛岃繖涓皬璁炬柦瀵硅璦緇嗚妭鐨勫彂鎺樿揪鍒頒簡鎯婂ぉ鍦版常楝肩鐨勫湴姝ワ紝涓嶄俊浣犲厛璇曠潃鑷繁鍘葷湅鐪嬪畠鐨勬簮浠g爜錛屽啀鐪嬬湅浣滆呬粙緇嶅畠鐨勬枃绔犲惂銆傝宐oost::typeof涔熶笉鐢樺叾鍚庘斺擟++璇█閲岄潰鏈夊お澶氳鈥滃彂鐜扳濊屼笉鏄鈥滃彂鏄庘濈殑鎶鏈傞毦閬撴渶鍒濇棤鎰忚緗繖浜涜璦瑙勫垯鐨勫浼欎滑閮芥槸Oracles? 銆銆鍥犱負娌℃湁variadic templates錛屼漢浠敤瀹忓姞涓婄己鐪佹ā鏉垮弬鏁版潵瀹炵幇綾諱技鏁堟灉銆傚洜涓烘病鏈塩oncepts錛屼漢浠敤妯℃澘鍔犱笂鏋愭瀯鍑芥暟鐨勭粏鑺傛潵瀹屾垚綾諱技宸ヤ綔銆傚洜涓烘病鏈塼ypeof錛屼漢浠敤妯℃澘鍏冪紪紼嬪拰瀹忓姞涓婃棤灝界殑緇嗚妭鏉ュ疄鐜扮洰鏍団?C++寮鍙戣呬滑鐨凞IY綺劇涓嶅彲璋撲笉寮恒?/p>
銆銆鐒惰岋紝濡傛灉浠呬粎鏄洜涓鴻寮鍙戜紭縐鐨勫簱錛岄偅涔堟秹鍙婅繖浜涚粏鑺傞兘榪樻槸鎯呮湁鍙師鐨勶紝鑷沖皯鍦–++09鍑虹幇騫朵笖緙栬瘧鍣ㄥ巶鍟嗚窡涓婁箣鍓嶏紝榪欎簺閮借繕鑳借鏄笉寰楀凡鑰屼負涔嬨備絾鎴戜滑騫垮ぇ鐨凜++紼嬪簭鍛樺憿?澶т紬鏄鏄撹璇鐨勶紝鎴戜篃鏇劇粡鏄備互涓烘帉鎻′簡鏇村鐨勮璦緇嗚妭灝辨洿鐗涳紝浣嗗疄闄呭嵈鏄偅浜涜璦緇嗚妭鍗佹湁鍏節鏄鉤鏃剁紪紼嬬敤閮界敤涓嶅埌鐨勩侰++涓紬澶氱殑緇嗚妭铏界劧鍦ㄥ簱璁捐鑰呮墜閲岄潰鏈夊叾鐢ㄦ涔嬪湴錛屼絾鏅氱▼搴忓憳鍒欐牴鏈棤闇榪囧鍏蟲敞錛屽挨鍏舵槸娌℃湁瀹為檯鍔ㄦ満鐨勫叧娉ㄣ備竴鑸х殑緙栫爜瀹炶返鍑嗗垯錛屼互鍙婂熀鏈殑緙栫▼鑳藉姏鍜屽熀鏈姛錛屼箖鑷沖熀鏈殑紼嬪簭璁捐鐞嗚浠ュ強綆楁硶璁捐銆傛墠鏄湡姝i渶瑕佽姳鏃墮棿鎺屾彙鐨勪笢瑗褲?/p>
銆銆瀛︿範鏈浣崇紪鐮佸疄璺墊瘮瀛︿範C++鏇撮噸瑕併傜湅浼樼鐨勪唬鐮佷篃姣斿煁澶寸敤宸姴鐨勭紪鐮佹柟寮忓啓鍨冨溇浠g爜瑕佹湁鏁堛傜洿鎺ャ佹竻鏅般佹槑浜嗐並ISS鍦拌〃杈炬剰鍥炬瘮鐜╃紪鐮佽姳鎷涜閲嶈鈥?/p>
銆銆閬垮厤鍘昏繃闂換浣曡璦緇嗚妭錛岄櫎闈炲繀瑕併傝繖涓繀瑕佹槸鎸囧湪瀹為檯緙栫▼褰撲腑閬囧埌闂錛岃繖鏍峰氨綆楅渶瑕佽繃闂粏鑺傦紝涔熸槸鏈鐪佷簨鐨勶紝鎳掓儼鑰呭師鍒欏槢銆備竴涓帉鎻′簡鍩烘湰鐨勭紪紼嬬悊蹇靛茍鏈夎緝寮哄涔犺兘鍔涚殑紼嬪簭鍛樺湪鐢ㄤ竴闂ㄩ檶鐢熺殑璇█緙栫▼鏃跺氨綆楁嬁鐫閭f湰璇█鐨勫湥緇忎粠绱㈠紩緲昏搗涔熷彲浠ョ紪鍑哄悎鏍肩殑紼嬪簭鏉ャ傚崄騫村浼氱紪紼嬩笉鏄寚瀵規瘡闂ㄨ璦閮藉緱鍗佸勾錛岄偅涓杈堝瓙鎵嶈兘瀛﹀嚑闂ㄨ璦鍝紝濡傛灉鎸夊瓧姣嶉『搴忓鐨勮瘽涓杈堝瓙閮藉埆鎸囨湜瀛﹀埌Ruby浜?鍗佸勾瀛︿範緙栫▼鏇翠笉鏄寚鍏堟妸璇█鐗規т粠綺楀埌緇嗗叏閮藉悆閫忔墠鏁笅鎵嬬紪紼嬶紝鍦ㄥ疄璺典腑鎻愰珮鎵嶆槸鏈閲嶈鐨勩?/p>
銆銆鑷充簬榪欑鎶犺璦緇嗚妭鐨勫摬瀛︿負浣曡兘鍦ㄧぞ緹ら噷闈㈠憟閲庣伀鐕庡師涔嬪娍錛屽氨鏄竴涓績鐞嗗鐨勯棶棰樹簡銆傛兂鍍忎漢浠湪璁哄潧涓婅璁洪棶棰樻椂錛屼竴涓璇█鎶婃彙寰堢粏鑷寸殑浜鴻偗瀹氳兘澶熷緱鍒版洿澶氱殑浣╂湇錛岃岀敱浜庤鍧涗笂鐨勯棶棰樺ぇ澶氭槸灝忛棶棰橈紝鎵浠ヨВ鍐沖疄闄呴棶棰樼殑鐪熸鑳藉姏騫朵笉鑳藉緱鍒版樉鐜幫紝涔熷氨鏄錛岀煡璇嗗瀷鐨勪漢鑳藉寰楀埌鏇村浣╂湇錛屽悗鑰呬究鎴愪負鍔ㄥ姏鍜屼豢鏁堢殑鐮濈爜銆傜劧鑰岀湡姝g殑緙栫▼鑳藉姏鏄笌璇█緇嗚妭娌″叧緋葷殑錛岀啛緇冭繍鐢ㄤ竴闂ㄨ璦鑳藉甯綘鏈浣寵〃杈句綘鐨勬剰鍥撅紝浣嗙啛緇冭繍鐢ㄤ竴闂ㄨ璦緇濅笉鎰忓懗鐫瑕佹妸瀹冪殑杈硅竟瑙掕鍏ㄩ兘璁頒綇銆傛噦寰椾竴浜涘父璇嗭紝鏈変簡緙栫▼鐨勫熀鏈洿瑙夛紝閬囧埌涓浜涚粏鑺傞敊璇殑鏃跺欏啀鍘繪煡涔︼紝鏄渶鑺傜渷鏃墮棿鐨勫姙娉曘?/p>
銆銆C++鐨勪功錛孊jarne鐨勫湥緇忋奣he C++ Programming Language銆嬫槸楂樺眿寤虹摯鐨勩傘婂ぇ瑙勬āC++紼嬪簭璁捐銆嬫槸鎸哄姟瀹炵殑銆傘夾ccelerated C++銆嬫槸鏈浣沖叆闂ㄧ殑銆傘奀++ Templates銆嬫槸浠呬綔鍙傝冪殑銆傘奀++ Template Metaprogramming銆嬫槸綺懼姏榪囧墿鑰呭彲浠ョ帺涓鐜╃殑錛屾櫘閫氱▼搴忓憳紕伴兘鍒鐨勩傘奍SO.IEC C++ Standard 14882銆嬩笉鏄嬁鏉ヨ鐨勩侭jarne鏈榪戝湪鍋欳++鐨勬暀鑲詫紝鏂頒功鏄粷瀵瑰彲浠ユ湡寰呯殑銆?/p>
銆銆P.S. 鍏充簬濡備綍瀛︿範緙栫▼錛実9鐨刡log涓婃湁璁稿綺懼僵鐨勬枃绔狅細榪欓噷錛岃繖閲岋紝榪欓噷錛岃繖閲屸?瀹為檯涓婏紝鎴戝緩璁綘鍘繪妸g9鑰佸ぇ鐨刡log緲諱釜搴曟湞澶?:P 銆銆鍐峆.S. 涔﹀崟?鎴戞槸閬戜簬緇欏嚭涓涓被浼箋奀++鍒濆鑰呭繀璇匯嬭繖縐嶄功鍗曠殑銆侰++鐨勪功涓嶈鍏舵暟錛岃鍏鐨勫ソ涔︿篃涓嶈儨鏋氫婦銆傚彧涓嶈繃鏈変簺涔﹀鏄撶粰鍒濆鑰呴犳垚涓縐嶉敊瑙夛紝灝辨槸鈥滃涔燙++灝卞簲璇ユ槸榪欎釜鏍峰瓙鐨勨濄傛瘮濡傛湁鏈嬪弸鎻愬埌鐨勩婇珮璐ㄩ噺C/C++緙栫▼銆嬶紝榪欐湰涔︽湁浠峰鹼紝浣嗕笉閫傚悎鍒濆鑰咃紝鍒濆鑰呰榪欐牱鐨勪功瀹規槗涓鍙墮殰鐩笉瑙佹嘲灞便傚疄闄呬笂錛屾紜殑鎬佸害鏄紝緇嗚妭鏄繀瑕佺殑銆備絾緇嗚妭鏄瑕佺殑銆傚叾瀹炲涔犵紪紼嬫垜瑙夊緱搴旇鏈鍏堝涔犲浣曠敤浼爜琛ㄨ揪鎬濇兂鍛紝鍚涗笉瑙併奍ntroduction to Algorithm銆嬮噷闈㈢殑浠g爜?銆奣AOCP銆嬩腑鐨勪唬鐮?鍝︼紝瀵逛簡瀹冧滑鏄嚜宸卞緩绔嬬殑璇█錛屼絾榪欑浠呮暀瀛︾洰鐨勭殑璇█鐨勭洰鐨勫氨鏄負浜嗛伩鍏嶈鍐欑▼搴忕殑浜轟竴寮濮嬪氨蹇樹簡鍐欑▼搴忔槸涓轟簡瀹屾垚鍔熻兘錛屼互涓哄啓紼嬪簭灝辨槸鍜岃璦緇嗚妭浣滄枟浜変簡銆侭jarne璇寸▼搴忕殑姝g‘鎬ф渶閲嶈錛宐oost鐨勭紪鐮佹爣鍑嗛噷闈篃灝嗘紜у垪鍦ㄦц兘鍓嶉潰銆?/p>
銆銆姝ゅ錛屼竴鏃﹀緩绔嬩簡姝g‘鐨勫涔犵紪紼嬬殑鐞嗗康錛屽叾瀹炰粈涔堜功(鍙涓嶆槸澶瀮鍦劇殑)閮芥湁浜涚敤澶勩傞兘褰撴垚鍙傝冧功錛岀敤鐨勬椂鍊欎粠鐩綍鎴栫儲寮曠炕錛屽熀鏈氨瀵逛簡銆?/p>
銆銆鍐嶅啀P.S. myan鑰佸ぇ鍜実9鑰佸ぇ閮界粰鍑轟簡璁稿綺懼僵鐨勮瑙c傛垜涓嶅緱涓嶅啀鍔犱笂涓涓狿.S銆傚叿浣撴垜灝變笉鎽樺綍浜嗭紝濡傛灉浣犺鍒拌繖閲岋紝璇峰姟蹇呭線涓嬬湅浠栦滑鐨勮瘎璁恒傝漿杞借呭埆蹇樹簡杞澆浠栦滑鐨勮瘎璁?-) 銆銆璁稿鏈嬪弸閮介棶鎴戝悓涓涓棶棰橈紝鍒板簳瑕佷笉瑕佸涔燙++銆傚叾瀹炶繖涓棶棰橀棶寰楀緢娌℃湁鎰忎箟銆傗滃C++鈥濆拰鈥滀笉瀛++鈥濊繖涓簩鍒嗘硶鏄病鎰忎箟鐨勶紝涓轟粈涔?鍥犱負榪欎釜闂寰堣〃闈紝鐢氳嚦寰堟誕韜併傞噸瑕佺殑涓嶆槸浣犳帉鎻$殑璇█錛岃屾槸浣犳帉鎻$殑鑳藉姏錛屽熺敤myan鑰佸ぇ鐨勮瘽錛屸滈噸瑕佺殑鏄繖涓(緇冭繃紼嬶紝鑰屼笉鏄粨鏋滐紝瑕佺殑鏄綘綺楀.鐨勮吙錛岃屼笉鏄綘韜笂鑳岀殑閭h鐩愬反銆傗濄傛澶栧涔燙++鐨勬剰涔夊叾瀹炵湡鐨勬槸閱夌縼涔嬫剰涓嶅湪閰掞紝鍍廋/C++榪欑緋葷粺綰ц璦錛屽湪瀛︿範鐨勮繃紼嬩腑蹇呴』瑕佹秹鍙婂埌涓浜涘簳灞傜煡璇嗭紝濡傚唴瀛樼鐞嗐佺紪璇戣繛鎺ョ郴緇熴佹眹緙栬璦銆佺‖浠朵綋緋葷粨鏋勭瓑絳夌瓑絳夌煡璇?娉ㄦ剰錛岃繖涓嶅寘鎷繃鍒嗙妱瑙掓棶鏃殑璇█鏋濊妭)銆傝繖浜涗笢瑗夸篃灝辨槸鎵璋撶殑鍐呭姛浜?鍏跺疄鏈鏈閲嶈鐨勫唴鍔熻繕鏄暱鏈熷涔犳墍紓ㄧ粌鍑烘潵鐨勮嚜瀛﹁兘鍔?銆傚姝ゅぇ鍢碕oel鍦ㄣ奐oel On Software銆嬮噷闈㈡彁鍒扮殑婕忔礊鎶借薄瀹氬緥闃愯堪寰楀氨闈炲父婕備寒銆?/p>
銆銆鎵浠ワ紝絳旀鏄紝璁╀綘鎴愪負楂樻墜鐨勫茍涓嶆槸浣犳帉鎻′粈涔堣璦錛岀簿閫欳++鏈繀灝辮兘璁╀綘鎴愪負楂樻墜錛屼笉綺鵑欳++涔熸湭蹇呭氨鑳借浣犳垚涓轟綆鎵嬨傛垜鎯沖ぇ瀹墮兘涓嶄細鎬鐤慻9鑰佸ぇ濡傛灉瑕佹妱璧稢++鍋氫竴涓」鐩殑璇濅細姣斿ぇ澶氭暟鑷鐔熺粌C++鐨勪漢瑕佸仛寰楁紓浜傛墍浠ュ叧閿殑涓嶆槸璇█榪欎釜琛ㄥ眰鐨勪笢瑗匡紝鑰屾槸搴曚笅鐨勬湰璐ㄧ煕鐩俱傚綋鐒訛紝涓嶆槸璇撮偅灝變粈涔堣璦閮戒笉瑕佸浜嗭紝鎸夌収涓縐嶆浌鎿嶇殑閫昏緫錛屸滃ぉ涓嬭璦錛屽敮imperative涓巇eclarative鑰斥濄侰++鏄墠鑰呴噷闈㈡渶澶嶆潅鐨勪竴縐嶏紝鏀寔鏈騫挎硾鐨勭紪紼嬭寖寮忋傚熺敤褰撳垵鏁板緋誨叆瀛﹀ぇ浼氫笂涓涓佸笀鐨勮瘽錛屸滀綘鏁板閮藉浜嗭紝榪樻湁浠涔堜笉鑳藉鐨勫憿?鈥濄傚璇█鏄竴涓斿緞錛屽鏋滀綘鎶婂畠鐢ㄦ潵紓ㄧ粌鑷繁錛屽彲浠ャ傚鏋滀綘鎶婂畠鐢ㄦ潵浣滀負瀛︿範緋葷粺搴曞眰鐭ヨ瘑鐨勯挜鍖欙紝鍙互銆傚鏋滀綘鎶婂畠鐢ㄦ潵浣滀負瀛︿範濡備綍緙栧啓浼樼鐨勪唬鐮侊紝濡備綍緇勭粐澶у瀷鐨勭▼搴忥紝濡備綍榪涜鎶借薄璁捐錛屽彲浠ャ傚鏋滄帀涔﹁錛屽厜鍟冪粏鑺傦紝鎴戣涓轟笉鍙互(闄ら潪浣犲繀欏昏鐢ㄥ埌緇嗚妭錛屽儚boost搴撶殑coder浠?銆?/p>
鐒跺悗鍐嶅熺敤涓涓媑9鑰佸ぇ鐨勩婇摱寮瑰拰鎴戜滑鐨勮亴涓氥嬩腑鐨勮瘽錛?/p>
銆銆閾跺脊鍜屾垜浠殑鑱屼笟鍙戝睍鏈変粈涔堢浉騫?寰堢畝鍗曪細鎴戜滑寰楁妸鏃墮棿鐢ㄤ簬瀛︿範瑙e喅鏈川鍥伴毦銆傛柊鎶鏈粰楂樻墜甯︽潵鏂逛究銆傝彍楦熶滑鍗翠笉鐢ㄦ寚鏈涜鏂版妧鏈嫰鏁戙傛部鐢ㄤ互鍓嶇殑姣斿柣錛?涓嫻佺殑鎽勫獎甯堜笉浼氬洜涓虹浉鏈虹殑鏇存柊鎹唬鑰屼涪鎺夐キ紕楋紝鍙嶈屽彲鑳藉熷姪鍏堣繘鎶鏈暀涓嬩紶涓栦匠浣溿傚洜涓烘憚褰辯殑鏈川鍥伴毦錛岃繕鏄憚褰卞笀鐨勮壓鏈劅瑙夈傜儹闂ㄦ妧鏈篃灝辯瓑浜庣浉鏈恒?涓嶅仠榪芥柊錛屽涔犺繖涓鏋訛紝閭d釜杞歡錛屽ソ姣旀垚澶╅捇鐮斾笉鍚岀浉鏈虹殑璇存槑涔︺傝岀儹闂ㄦ妧鏈悗鐨勬潵榫欏幓鑴夛紝鎵嶅ソ姣旀憚褰辨妧鏈備負浠涔堟帹鍑鴻繖涓鏋?瀹冭В鍐充簡浠涔堝叾瀹冩鏋?涓嶈兘瑙e喅鐨勯棶棰?瀹冨湪鍝噷閫傜敤?瀹冨湪鍝噷涓嶉傜敤?瀹冪敤浜嗕粈涔堟柊鐨勮璁?瀹冩敼榪涗簡鍝簺鏃х殑璁捐?Why is forever. 鍜?鏈嬪弸鑱婂ぉ鏃舵彁鍒癝teve McConnell鐨勩奝rofessional Software Development銆嬮噷闈㈠紩浜嗕竴涓皟鏌ワ紝璇磋蔣浠跺紑鍙戞妧鏈殑鍗婅“鏈?0騫淬備篃灝辨槸璇?0騫村悗鎴戜滑鐜板湪鐭ヨ瘑閲屼竴鍗婄殑涓滆タ榪囨椂銆傜浉褰撲笉鍧忋傛湅鍙嬫墦瓚i亾錛氣滃簲 璇ヨ20騫村悗IT鐣屼竴鍗婄殑鎶鏈繃鏃訛紝鎴戜滑瀛︾殑榪囨椂鎶鏈繙榪滆秴榪囪繖涓瘮渚嬨傚叿浣撳埌鏌愪漢錛屽緢鍙兘5騫翠粬灝卞簾浜嗏濄傝瘽铏芥偛瑙傦紝浣嗗彲瑙侀夋嫨瀛︿範鍐呭鐨勯噸瑕佹с傚涔?鏈川鎶鑹?鎶鏈繜鏃╄繃鏃訛紝鎶鑹哄嵈甯哥敤闀挎柊)榪樻湁涓濂藉錛屽氨鏄笉鐢ㄧ湅鐫鑷繁蹇冪埍鐨勬妧鏈彈鍒版寫鎴樼殑鏃跺欏共鍤庛侰/C++榪囨椂灝辮繃鏃朵簡鍛楋紝鍙鏈夊叾瀹冪殑緋葷粺緙栫▼ 璇█銆侸ava鍊掍簡灝卞掍簡鍛楋紝鏈繀鎴戜笉鑳界敤.net?Ruby鏄欒姳涓鐜板張濡備綍銆傚鏋滅敤寰椾笉鐖斤紝鎹㈠埌鍏跺畠鍔ㄦ佽璦灝辨槸浜嗐侸2EE琚簾浜嗗張鎬庢牱?鏈繀鎴戜滑灝?鍋氫笉鍑哄垎甯冪郴緇熶簡?榪欓噷榪樹婦浜嗘洿澶氱殑渚嬪瓙銆?/p>
銆銆涓鍙ヨ瘽錛屽彧鏈変漢鏄湡姝g殑閾跺脊銆傝亴涓氬彂灞曠殑鐩爣錛屽氨鏄妸鑷繁鍙樻垚閾跺脊銆傞偅鏃跺欙紝浣犲氨涓嶅啀鏄漢錛岃屾槸浜哄脊銆?/p>
銆銆鏈鍚庡氨浠ユ垜鍦˙jarne鐨勪紬澶氳璋堝綋涓憳褰曠殑涓浜涘叧浜庡浣曞涔燙++(浠ュ強緙栫▼)鐨勭湅娉曠粨鏉熷惂(娌$┖閫愭緲昏瘧浜嗭紝鍙皢鍏朵腑鎴戣寰楁渶閲嶈鐨勫嚑孌佃瘧浜嗕竴涓嬶紝褰撶劧錛屽叾瀹冧篃寰堥噸瑕侊紝榪欎簺孌佃惤鏄湪Bjarne鐨勬墍鏈夐噰璁跨ǹ涓憳鎶勫嚭鏉ョ殑錛屾墍浠ュ己鐑堝緩璁兘榪囩洰涓涓?錛?/p>
銆銆I suspect that people think too little about what they want to build, too little about what would make it correct, and too much about "efficiency" and following fashions of programming style. The key questions are always: "what do I want to do?" and "how do I know that I have done if?". Strategies for testing enters into my concerns from well before I write the firat line of code, and that despite my view that you have to write code very early - rather than wait until a design is complete. 銆銆璇戯細鎴戞劅瑙変漢浠繃澶氬叧娉ㄤ簡鎵璋撯滄晥鐜団濅互鍙婅窡闅忕紪紼嬮鏍肩殑娼祦錛屽嵈涓ラ噸蹇借浜嗘湰涓嶈琚拷瑙嗙殑闂錛屽鈥滄垜絀剁珶鎯寵鏋勫緩浠涔堟牱鐨勭郴緇熲濄佲滄庢牱鎵嶈兘浣垮畠姝g‘鈥濄傛渶鍏抽敭鐨勯棶棰樻案榪滄槸錛氣滄垜絀剁珶鎯寵鍋氫粈涔?鈥濆拰鈥滃浣曟墠鑳界煡閬撴垜鐨勭郴緇熸槸鍚﹀凡緇忓畬鎴愪簡鍛?鈥濆氨鎷挎垜鏉ヨ鍚э紝鎴戜細鍦ㄧ紪鍐欑涓琛屼唬鐮佷箣鍓嶅氨鑰冭檻嫻嬭瘯鏂規錛岃屼笖榪欒繕鏄湪鎴戝叧浜庡簲褰撴棭浜庤璁″畬鎴愪箣鍓嶅氨榪涜緙栫爜鐨勮鐐圭殑鍓嶆彁涔嬩笅銆?/p>
銆銆Obviously, C++ is very complex. Obviously, people get lost. However, most peple get lost when they get diverted into becoming language lawyers rather than getting lost when they have a clear idea of what they want to express and simply look at C++ language features to see how to express it. Once you know data absreaction, class hierarchies (object-oriented programming), and parameterization with types (generic programming) in a fairly general way, the C++ language features fall in place. 銆銆璇戯細璇氱劧錛孋++闈炲父澶嶆潅銆傝瘹鐒訛紝浜轟滑榪峰け鍏朵腑浜嗐傜劧鑰岄棶棰樻槸錛屽ぇ澶氭暟浜轟笉鏄洜涓洪鍏堝鑷繁鎯寵琛ㄨ揪浠涔堟湁浜嗘竻鏅扮殑璁よ瘑鍙笉榪囧湪鍘籆++璇█涓悳瀵誨悎閫傜殑璇█鐗規ф椂榪峰け鐨勶紝鐩稿弽錛屽ぇ澶氭暟浜烘槸鍦ㄤ笉瑙夋垚涓鴻璦寰嬪笀鐨勮礬涓婅糠澶卞湪緇嗚妭鐨勪笡鏋椾腑鐨勩備簨瀹炴槸錛屽彧闇瀵規暟鎹娊璞°佺被浣撶郴緇撴瀯(OOP)浠ュ強鍙傛暟鍖栫被鍨?GP)鏈変竴涓浉褰撲竴鑸眰闈㈢殑浜嗚В錛孋++綰風箒鐨勮璦鐗規т篃灝辨竻鏅拌搗鏉ヤ簡銆?/p>
銆銆Well, I don't think I made such a trade-off. I want elegant and efficient code. Sometimes I get it. These dichotomies (between efficiency versus correctness, efficiency versus programmer time, efficiency versus high-level, et cetera.) are bogus. 銆銆I think the real problem is that "we" (that is, we software developers) are in a permanent state of emergency, grASPing at straws to get our work done. We perform many minor miracles through trial and error, excessive use of brute force, and lots and lots of testing, but--so often--it's not enough. 銆銆Software developers have become adept at the difficult art of building reasonably reliable systems out of unreliable parts. The snag is that often we do not know exactly how we did it: a system just "sort of evolved" into something minimally acceptable. Personally, I prefer to know when a system will work, and why it will. 銆銆There are more useful systems developed in languages deemed awful than in languages praised for being beautiful--many more. The purpose of a programming language is to help build good systems, where "good" can be defined in many ways. My brief definition is, correct, maintainable, and adequately fast. Aesthetics matter, but first and foremost a language must be useful; it must allow real-world programmers to express real-world ideas succinctly and affordably. 銆銆I'm sure that for every programmer that dislikes C++, there is one who likes it. However, a friend of mine went to a conference where the keynote speaker asked the audience to indicate by show of hands, one, how many people disliked C++, and two, how many people had written a C++ program. There were twice as many people in the first group than the second. Expressing dislike of something you don't know is usually known as prejudice. Also, complainers are always louder and more certain than proponents--reasonable people acknowledge flaws. I think I know more about the problems with C++ than just about anyone, but I also know how to avoid them and how to use C++'s strengths. 銆銆In any case, I don't think it is true that the programming languages are so difficult to learn. For example, every first-year university biology textbook contains more details and deeper theory than even an expert-level programming-language book. Most applications involve standards, operating systems, libraries, and tools that far exceed modern programming languages in complexity. What is difficult is the appreciation of the underlying techniques and their application to real-world problems. Obviously, most current languages have many parts that are unnecessarily complex, but the degree of those complexities compared to some ideal minimum is often exaggerated. 銆銆We need relatively complex language to deal with absolutely complex problems. I note that English is arguably the largest and most complex language in the world (measured in number of words and idioms), but also one of the most successful. 銆銆C++ provides a nice, extended case study in the evolutionary approach. C compatibility has been far harder to maintain than I or anyone else expected. Part of the reason is that C has kept evolving, partially guided by people who insist that C++ compatibility is neither necessary nor good for C. Another reason-- probably even more important--is that organizations prefer interfaces that are in the C/C++ subset so that they can support both languages with a single effort. This leads to a constant pressure on users not to use the most powerful C++ features and to myths about why they should be used "carefully," "infrequently," or "by experts only." That, combined with backwards-looking teaching of C++, has led to many failures to reap the potential benefits of C++ as a high-level language with powerful abstraction mechanisms. 銆銆The question is how deeply integrated into the application those system dependencies are. I prefer the application to be designed conceptually in isolation from the underlying system, with an explicitly defined interface to "the outer world," and then integrated through a thin layer of interface code. 銆銆Had I had a chance to name the style of programming I like best, it would have been "class-oriented programming", but then I'm not particularly good at finding snappy names. The school of thought that I belong to - rooted in Simula and related design philosophies - emphasizes the role of compile-time checking and flexible (static) type systems. Reasoning about the behavior of a program has to be rooted in the (static) structure of the source code. The focus should be on guarantees, invariant, etc. which are closely tied to that static structure. This is the only way I know to effectively deal with correctness. Testing is essential but cannot be systematic and complete without a good internal program structure - simple-minded blackbox testing of any significant system is infeasible because of the exponential explosion of states. 銆銆So, I recommend people to think in terms of class invariants, exception handling guarantees, highly structured resource management, etc. I should add that I intensely dislike debugging (as ah hoc and unsystematic) and strongly prefer reasoning about source code and systematic testing. 銆銆Pros: flexibility, generality, performance, portability, good tool support, available on more platforms than any competitor except C, Access to hardware and system resources, good availability of programmers and designers. Cons: complexity, sub-optimal use caused by poor teaching and myths. 聽 銆銆鏍堬紝灝辨槸閭d簺鐢辯紪璇戝櫒鍦ㄩ渶瑕佺殑鏃跺欏垎閰嶏紝鍦ㄤ笉闇瑕佺殑鏃跺欒嚜鍔ㄦ竻妤氱殑鍙橀噺鐨勫瓨鍌ㄥ尯銆傞噷闈㈢殑鍙橀噺閫氬父鏄眬閮ㄥ彉閲忋佸嚱鏁板弬鏁扮瓑銆?/p>
銆銆鍫嗭紝灝辨槸閭d簺鐢眓ew鍒嗛厤鐨勫唴瀛樺潡錛屼粬浠殑閲婃斁緙栬瘧鍣ㄤ笉鍘葷錛岀敱鎴戜滑鐨勫簲鐢ㄧ▼搴忓幓鎺у埗錛屼竴鑸竴涓猲ew灝辮瀵瑰簲涓涓猟elete銆傚鏋滅▼搴忓憳娌℃湁閲婃斁鎺夛紝閭d箞鍦ㄧ▼搴忕粨鏉熷悗錛屾搷浣滅郴緇熶細鑷姩鍥炴敹銆?/p>
銆銆鑷敱瀛樺偍鍖猴紝灝辨槸閭d簺鐢眒alloc絳夊垎閰嶇殑鍐呭瓨鍧楋紝浠栧拰鍫嗘槸鍗佸垎鐩鎬技鐨勶紝涓嶈繃瀹冩槸鐢╢ree鏉ョ粨鏉熻嚜宸辯殑鐢熷懡鐨勩?/p>
銆銆鍏ㄥ眬/闈欐佸瓨鍌ㄥ尯錛屽叏灞鍙橀噺鍜岄潤鎬佸彉閲忚鍒嗛厤鍒板悓涓鍧楀唴瀛樹腑錛屽湪浠ュ墠鐨凜璇█涓紝鍏ㄥ眬鍙橀噺鍙堝垎涓哄垵濮嬪寲鐨勫拰鏈垵濮嬪寲鐨勶紝鍦–++閲岄潰娌℃湁榪欎釜鍖哄垎浜嗭紝浠栦滑鍏卞悓鍗犵敤鍚屼竴鍧楀唴瀛樺尯銆?/p>
銆銆甯擱噺瀛樺偍鍖猴紝榪欐槸涓鍧楁瘮杈冪壒孌婄殑瀛樺偍鍖猴紝浠栦滑閲岄潰瀛樻斁鐨勬槸甯擱噺錛屼笉鍏佽淇敼(褰撶劧錛屼綘瑕侀氳繃闈炴褰撴墜孌典篃鍙互淇敼錛岃屼笖鏂規硶寰堝) 聽
]]>
]]>
渚?/span> :char a[100];memset(a, '\0', sizeof(a));
聽聽聽 memset 鍙互鏂逛究鐨勬竻絀轟竴涓粨鏋勭被鍨嬬殑鍙橀噺鎴栨暟緇勩?/span>
濡傦細
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
瀵逛簬鍙橀噺
struct sample_strcut stTest;
涓鑸儏鍐典笅錛屾竻絀?/span> stTest 鐨勬柟娉曪細
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;
鐢?/span>
memset
灝遍潪甯告柟渚匡細
memset(&stTest,0,sizeof(struct sample_struct));
濡傛灉鏄暟緇勶細
struct sample_struct TEST[10];
鍒?/span>
memset(TEST,0,sizeof(struct sample_struct)*10);
memcpy 鐢ㄦ潵鍋氬唴瀛樻嫹璐濓紝浣犲彲浠ユ嬁瀹冩嫹璐濅換浣曟暟鎹被鍨嬬殑瀵硅薄錛屽彲浠ユ寚瀹氭嫹璐濈殑鏁版嵁闀垮害銆?/span>
渚嬶細 char a[100],b[50]; memcpy(b, a, sizeof(b)); 娉ㄦ剰濡傜敤 sizeof(a) 錛屼細閫犳垚 b 鐨勫唴瀛樺湴鍧婧㈠嚭銆?/span>
Strcpy聽聽 灝卞彧鑳芥嫹璐濆瓧絎︿覆浜嗭紝瀹冮亣鍒?/span> '\0' 灝辯粨鏉熸嫹璐濄?/span>
渚嬶細
char a[100],b[50];strcpy(a,b);
濡傜敤
strcpy(b,a)
錛岃娉ㄦ剰
a
涓殑瀛楃涓查暱搴︼紙絎竴涓?/span>
鈥榎
str 涔熷彲浠ョ敤鐢ㄤ釜鍙傛暟鐨?/span> strncpy(a,b,n)
========================================================
memset
涓昏搴旂敤鏄垵濮嬪寲鏌愪釜鍐呭瓨絀洪棿銆?/span>
memcpy
鏄敤浜?/span>
copy
婧愮┖闂寸殑鏁版嵁鍒扮洰鐨勭┖闂翠腑銆?/span>
strcpy
鐢ㄤ簬瀛楃涓?/span>
copy,
閬囧埌
鈥榎
濡傛灉浣犵悊瑙d簡榪欎簺錛屼綘搴旇鐭ラ亾浠栦滑鐨勫尯鍒細渚嬪浣犲垵濮嬪寲鏌愬潡絀洪棿鐨勬椂鍊欙紝鐢ㄥ埌
memcpy
錛岄偅涔堝簲璇ユ庝箞鍐欙紝鏄笉鏄樉寰楀緢絎ㄣ?/span>
int m[100]
memset((void*)m,0x00,sizeof(int)*100);//Ok
錛?/span>
memcpy((void*)m,"\0\0\0\0....",sizeof(int)*100);//it鈥檚 wrong.
reference : http://hi.baidu.com/%B5%CE%C9%B3/blog/item/12025c2af5ffc33c5343c19f.html