锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品一区二区久久精品无码
,久久精品人人做人人爽电影,久久99国产亚洲高清观看首页 http://www.shnenglu.com/xiaohe0817/zh-cn Sat, 05 Jul 2025 06:32:16 GMT Sat, 05 Jul 2025 06:32:16 GMT 60 Effective C++璇諱功絎旇涔嬩笁 :紜畾瀵硅薄琚嬌鐢ㄥ墠宸插厛琚垵濮嬪寲 http://www.shnenglu.com/xiaohe0817/archive/2008/12/30/70572.htmlEdmund Edmund Tue, 30 Dec 2008 03:06:00 GMT http://www.shnenglu.com/xiaohe0817/archive/2008/12/30/70572.html http://www.shnenglu.com/xiaohe0817/comments/70572.html http://www.shnenglu.com/xiaohe0817/archive/2008/12/30/70572.html#Feedback 0 http://www.shnenglu.com/xiaohe0817/comments/commentRss/70572.html http://www.shnenglu.com/xiaohe0817/services/trackbacks/70572.html int x錛?br>鍦ㄦ煇浜涜澧冩潯浠朵笅淇濊瘉鍒濆鍖栦負(fù)0錛岃屽湪鍙﹀涓浜涜澧冧笅鍗村茍娌℃湁榪欎釜淇濊瘉銆傝屼笅杈硅繖縐嶆儏鍐碉細(xì)
class Point { int x,y; } ; Point p;
p鐨勬垚鍛樺嚱鏁版湁鐨勬椂鍊欒鍒濆鍖栵紙0錛夛紝鏈夌殑鏃跺欐病鏈夎鍒濆鍖栥?br>鐜板湪錛屽凡緇忔湁浜嗕竴浜涜鍒欙紝瀵硅薄鐨勫垵濮嬪寲浣曟椂浼?xì)鍙戠敓锛屼綍鏃朵笉浼?xì)鍙戠敓銆備絾鏄繖浜涜鍒欒繃浜庡鏉傦紝瀵規(guī)垜浠殑璁板繂鏈変竴瀹氱殑鎸戞垬錛屽搱鍝堛?br>閫氬父濡傛灉浣跨敤C part of C++鑰屼笖鍒濆鍖栧彲鑳芥嫑鑷磋繍琛屾湡鎴愭湰錛岄偅灝變笉淇濊瘉鍙戠敓鍒濆鍖栥備竴鏃﹁繘鍏on-C parts of C++,瑙勫垯鏈変竴浜涘彉鍖栥傝繖灝辨槸涓哄暐array(C part of C++)涓嶄繚璇佸叾鍐呭琚垵濮嬪寲錛岃寁ector(STL part of C++)鍗存湁姝や繚璇併?br>鎴戜滑鐨勬渶浣?jīng)_鐞嗙姸鎬佹槸錛屽湪浣跨敤浠諱綍瀵硅薄涔嬪墠鍏堝皢瀹冨垵濮嬪寲銆傚浜庢棤浠諱綍鎴愬憳鐨勫唴緗被鍨嬶紝蹇呴』鎵嬪姩瀹屾垚姝や簨錛?
int x = 0 ; // 瀵筰nt榪涜鍒濆鍖栵紱 const char * text = " A C-style string " ; // 瀵規(guī)寚閽堣繘琛屽垵濮嬪寲錛?/span>double d; std::cin >> d; // 閲囩敤input stream鐨勬柟寮忓畬鎴愬垵濮嬪寲錛?/span>
鑷充簬鍐呯疆綾誨瀷浠ュ鐨勫叾浠栫被鍨嬶紝鍒濆鍖栫殑璐d換钀藉湪浜嗘瀯閫犲嚱鏁拌韓涓娿傝鍒欏緢綆鍗曪細(xì)紜繚鏋勯犲嚱鏁伴兘灝嗗璞$殑姣忎竴涓垚鍛樺垵濮嬪寲銆?br>榪欎釜瑙勫垯寰堝鏄撳琛岋紝鍊煎緱娉ㄦ剰鐨勬槸鍒販娣嗕簡璧嬪?assignment)鍜屽垵濮嬪寲(initialization)銆傝冭檻涓涓〃鐜伴氳綈跨殑class錛?
class PhoneNumber { } ; class ABEntry { // Address Book Entry; public : ABEntry( const std:: string & name, const std:: string &address, const std::list < PhoneNumber > & phones); private : std:: string theName; std:: string tehAddress; std::list < PhoneNumber > thePhones; int numTimesConsulted; } ; ABEntry::ABEntry( const std:: string & name, const std:: string &address, std::list < PhoneNumber > & phones) { // 浠ヤ笅鍏ㄦ槸璧嬪?assignment)錛屼笉鏄垵濮嬪寲(initialization); theName = name; theAddress = address; thePhones = phones; numTimesConsulted = 0 ; }
ABEntry瀵硅薄浼?xì)甯l欎綘鏈熸湜鐨勫鹼紝浣嗕笉鏄渶浣?jīng)_仛娉曘侰++瑙勫畾錛氬璞℃垚鍛樺彉閲忕殑鍒濆鍖栧姩浣滃彂鐢熷湪榪涘叆鏋勯犲嚱鏁版湰浣撲箣鍓嶃傚湪ABEntry鏋勯犲嚱鏁板唴錛宼heName, theAddress, thePhone閮戒笉鏄鍒濆鍖栵紝鑰屾槸琚祴鍊箋傚垵濮嬪寲鐨勬椂闂村彂鐢熺殑鏇存棭錛屽彂鐢熶簬榪欎簺鎴愬憳鍑芥暟鐨刣efault鏋勯犲嚱鏁拌鑷姩璋冪敤涔嬫椂(姣旇繘鍏BEntry鏋勯犲嚱鏁版湰浣撶殑鏃墮棿鏇存棭)銆備絾榪欏numTimesConsulted涓嶄負(fù)鐪燂紝鍥犱負(fù)浠栧睘浜庡唴緗被鍨嬶紝涓嶄繚璇佸湪浣犵湅鍒扮殑閭d釜璧嬪煎姩浣滅殑鏃墮棿鐐逛箣鍓嶈幏寰楀垵鍊箋?br>ABEntry鏋勯犲嚱鏁扮殑涓涓緝濂藉啓娉曟槸錛屼嬌鐢ㄦ墍璋撶殑member initializatin list(鎴愬憳鍑芥暟鍒濆鍒?鏇挎崲璧嬪煎姩浣滐細(xì)
ABEntry::ABEntry( const std:: string & name, const std:: string & address, const std::list < PhoneNumber > & phones) : theName(name), theAddress(address), thePhones(phones), numTimesConsulted( 0 ) {} // 鏋勯犲嚱鏁版湰浣撲笉闇瑕佷換浣曞姩浣?/span>
榪欎釜鏋勯犲嚱鏁板拰涓婁竴涓殑緇撴灉鐩稿悓錛屼絾鏄氬父鏁堢巼杈冮珮銆傚熀浜庤祴鍊肩殑閭d釜鐗堟湰棣栧厛璋冪敤default鏋勯犲嚱鏁頒負(fù)theName, theAddress,鍜宼hePhones璁劇珛鍒濆鹼紝鐒跺悗绔嬪埢鍐嶅浠栦滑璧嬪箋俤efault鐨勪竴鍒囦綔涓烘鍒婚兘嫻垂浜嗐傛垚鍛樺垵濮嬪垪(member initianlization list)鐨勫仛娉曢伩鍏嶄簡榪欎竴闂錛屽洜涓哄垵濮嬪垪涓拡瀵瑰悇涓彉閲忚鐨勫疄鍙傦紝琚嬁鍘諱綔涓哄悇涓垚鍛樺嚱鏁扮殑瀹炲弬銆傛湰渚嬩腑theName浠ame涓哄垵鍊艱繘琛宑opy鏋勯狅紝theAddress浠ddress涓哄垵鍊艱繘琛宑opy鏋勯狅紝thePhones浠hones涓哄垵鍊艱繘琛宑opy鏋勯犮?br>瀵逛簬澶у鏁扮被鍨嬭岃█錛屾瘮璧峰厛璋冪敤default鏋勯犲嚱鏁板啀璋冪敤copy assignment鎿嶄綔絎︼紝鍗曞彧璋冪敤涓嬈opy鏋勯犲嚱鏁版槸姣旇緝楂樻晥鐨勶紝鏈変簨鐢氳嚦楂樼殑澶氥傚浜庡唴緗被鍨嬶紝濡俷umTimesConsulted錛屽叾鍒濆鍖栨垚鏈拰璧嬪肩殑鎴愭湰鐩稿悓錛屼絾涓轟簡涓鑷存ф渶濂戒篃閫氳繃鎴愬憳鍒濆鍒楁潵榪涜鍒濆鍖栥傚悓鏍烽亾鐞嗭紝濡傛灉鎴戜滑鎯砫efault鏋勯犱竴涓垚鍛樺彉閲忥紝涔熷彲浠ヤ嬌鐢ㄦ垚鍛樺垵濮嬪垪錛屽彧瑕佹寚瀹歯othing浣滀負(fù)鍒濆鍖栧垪灝辮浜嗭紝鍋囪ABEntry鏈変竴涓棤鍙傛瀯閫犳瀯閫犲嚱鏁幫紝鎴戜滑鍙互瀹炵幇濡備笅錛?
ABEntry::ABEntry() :theName(), // 璋冪敤theName鐨勬瀯閫犲嚱鏁?/span>theAddress(), // 璋冪敤theAddress鐨勬瀯閫犲嚱鏁?/span>thePhones(), // 璋冪敤thePhomes鐨勬瀯閫犲嚱鏁?/span>numTimesConsulted( 0 ) // 璁板緱灝嗘鍐呯疆綾誨瀷鏄懼紡瀹氫箟涓? {}
姝ゅ璁板緱涓鏉¤鍒欙紝閭e氨鏄湪鎴愬憳鍒濆鍒椾腑鍒楀嚭鎵鏈夌殑鎴愬憳鍙橀噺錛屼互鍏嶈繕寰楄浣忓摢浜涙垚鍛樺彉閲忓彲浠ユ棤闇鍒濆箋備婦涓緥瀛愶紝濡俷umTimesConsulted灞炰簬鍐呯疆綾誨瀷錛屽鏋?member initialization list)閬楁紡浜嗕粬錛屼粬灝辨病鏈夊垵鍊鹼紝鍥犺屽彲鑳藉紑鍚?#8220;涓嶆槑紜涓?#8221;鐨勬綐澶氭媺鐩掑瓙銆?br>鏈変簺鎯呭喌涓嬶紝鍗充嬌闈㈠鐨勬槸鍐呯疆綾誨瀷錛屼篃涓瀹氳浣跨敤鍒濆鍒椼傚鏋滄垚鍛樺彉閲忔槸const鎴栬卹eference錛屼粬浠竴瀹氬緱闇瑕佽祴鍒濆鹼紝鑰屼笉鏄祴鍊箋備負(fù)閬垮厤鎴愬憳鍙橀噺浣曟椂蹇呴』鍦ㄦ垚鍛樺垵濮嬪垪涓垵濮嬪寲錛屼綍鏃朵笉闇瑕侊紝鏈綆鍗曠殑鍋氭硶灝辨槸錛氭繪槸浣跨敤鎴愬憳鍒濆鍒椼?br>C++鏈夌潃鍗佸垎鍥哄畾鐨?#8220;鎴愬憳鍒濆鍖栨搴?#8221;銆傛槸鐨勶紝嬈″簭鎬繪槸鐩稿悓鐨勶細(xì)base classes鎬繪槸鍏堜簬derived classes琚垵濮嬪寲錛岃宑lass鐨勬垚鍛樺彉閲忔繪槸浠ュ叾澹版槑嬈″簭琚垵濮嬪寲銆傝鎴戜滑鍦ㄧ湅涓涓婣BEntry錛屽叾theName姘歌繙鍏堣鍒濆鍖栵紝鐒跺悗鏄痶heAddress錛屼箣鍚巘hePhones錛屾渶鍚庢槸numTimesConsulted錛屽嵆浣夸粬浠湪member initialization list涓互涓嶅悓鐨勯『搴忓嚭鐜幫紝涔熶笉浼?xì)鏈変恢M綍褰卞搷銆備負(fù)浜嗛伩鍏嶈糠鎯戯紝浣犲湪member initialization list涓潯鍒楀悇涓垚鍛樻椂錛屾渶濂芥繪槸浠ュ叾澹版槑嬈″簭涓烘搴忋?br>涓鏃︽垜浠凡緇?寰堝皬蹇冪殑灝嗗唴緗瀷鎴愬憳鍙橀噺鏄庣‘鐨勫姞浠ュ垵濮嬪寲錛岃屼笖涔熺‘淇濇瀯閫犲嚱鏁拌繍鐢╩ember initialization list鍒濆鍖朾ase classes鍜屾垚鍛樺彉閲忥紝閭e氨鍓╀笅鍞竴鐨勪竴浠朵簨鎯呴渶瑕佹搷蹇冿紝灝辨槸錛氫笉鍚岀紪璇戝崟鍏冨唴瀹氫箟涔媙on-local static瀵硅薄鐨勫垵濮嬪寲嬈″簭銆?br>鎵璋搒tatic瀵硅薄錛屽叾瀵垮懡浠庤鏋勯犲嚭鏉ョ洿鍒扮▼搴忕粨鏉熶負(fù)姝紝鍥犳stack鍜宧eap_based瀵硅薄閮借鎺掗櫎銆傝繖閲屾墍璇寸殑static瀵硅薄鍖呮嫭global瀵硅薄錛屽畾涔変簬namespace瀵硅薄鍐呯殑瀵硅薄錛屽湪class鍐咃紝鍦ㄥ嚱鏁板唴錛屼互鍙?qiáng)鍦╢ile鍐呰澹版槑涓簊tatic鐨勫璞°傚嚱鏁板唴鐨剆tatic瀵硅薄縐頒負(fù)local static瀵硅薄錛屽叾浠栧垯鎴愪負(fù)non-local static瀵硅薄錛岀▼搴忕粨鏉熸椂static瀵硅薄浼?xì)鑷姩閿姣侊紝涔熷氨鏄粬浠殑鏋愭瀯鍑芥暟浼?xì)鍦╩ain()緇撴潫鏃惰璋冪敤銆?br>鎵璋撶紪璇戝崟鍏冿紙translation unit錛夋槸鎸囦駭鐢熷崟涓鐩爣鏂囦歡錛坰ingle object file錛夌殑閭d簺婧愮爜銆傚熀鏈笂鏄崟涓婧愮爜鏂囦歡鍔犱笂鍏舵墍鍖呭惈鐨勫ご鏂囦歡銆?br>鐜板湪錛屼笂闈㈡墍娑夊強(qiáng)鍒扮殑闂鑷沖皯鍖呮嫭涓や釜婧愮爜鏂囦歡錛屾瘡涓涓唴鍚嚦灝戜竴涓猲on-local static瀵硅薄錛堜篃灝辨槸璇村璞℃槸global錛屾垨鑰呬綅浜巒amespace鍐咃紝鎴栬卌lass鍐咃紝鎴栬協(xié)ile浣滅敤鍩熷唴琚0鏄庝負(fù)static錛夈傞棶棰樻槸錛氬鏋滄煇涓紪璇戝崟鍏冨唴鐨勬煇涓猲on-local static瀵硅薄鐨勫垵濮嬪寲鍔ㄤ綔浣跨敤浜嗗彟澶栦竴涓紪璇戝崟鍏冨唴鐨刵on-local static瀵硅薄錛屼粬鎵浣跨敤鐨勮繖涓璞″彲鑳芥病鏈夊垵濮嬪寲錛屽洜涓篊++瀵?#8220;涓嶅悓緙栬瘧鍗曞厓鍐呯殑non-local static 瀵硅薄”鐨勫垵濮嬪寲嬈″簭騫舵病鏈夋槑紜畾涔夈?br>鏉ヤ釜渚嬪瓙錛?br> 鍋囪鏈変竴涓狥ileSystem class錛屽畠璁╀簰鑱旂綉涓婄殑鏂囦歡鐪嬭搗鏉ュ儚鏄湰鏈恒傜敱浜庤繖涓猚lass浣夸笘鐣岀湅璧鋒潵鍍忎釜鍗曚竴鏂囦歡緋葷粺錛屽彲鑳戒細(xì)浜х敓涓涓壒孌婂璞★紝浣嶄簬global鎴杗amespace浣滅敤鍩熷唴錛岃薄寰佸崟涓鏂囦歡緋葷粺錛?br>
class FileSystem { public : std::size_t numDisks() const ; } ; extern FileSystem tfs; // 棰勫緇欏鎴蜂嬌鐢ㄧ殑瀵硅薄錛宼fs浠h〃"the file system"
FileSystem瀵硅薄緇濅笉鏄竴涓棤鍏崇棝鐥掔殑瀵硅薄錛屽洜姝ゅ鎴峰鏋滃湪theFileSystem瀵硅薄鏋勯犲畬鎴愬墠灝變嬌鐢ㄤ粬錛屼細(xì)寰楀埌鎯ㄩ噸鐨勪唬浠鳳細(xì) 鐜板湪鍋囪寤虹珛浜嗕竴涓猚lass鐢ㄤ互澶勭悊鏂囦歡緋葷粺鍐呴儴鐨勭洰褰曘傚緢鑷劧錛屼粬浠細(xì)鐢ㄤ笂theFileSystem鐨勫璞★細(xì)
class Directory { public : Directory( ); } ; Directory::Directory( ) { std::size_t disks = tfs.numDisks(); }
榪涗竴姝ュ亣璁撅紝榪欎簺瀹㈡埛鍐沖畾鍒涘緩涓涓猟irectory瀵硅薄錛岀敤鏉ユ斁緗復(fù)鏃舵枃浠訛細(xì) Directory tempDir(params);//涓轟復(fù)鏃舵枃浠惰屽仛鍑虹殑鐩綍 鐜板湪錛屽垵濮嬪寲鐨勯噸瑕佷綔鐢ㄦ樉紺哄嚭鏉ヤ簡錛岄櫎闈瀟fs鍦╰empDir涔嬪墠琚垵濮嬪寲錛屽惁鍒檛empDir鐨勬瀯閫犲嚱鏁頒細(xì)鐢ㄥ埌灝氭湭鍒濆鍖栫殑tfs銆備絾鏄痶fs鍜宼empDir鏄笉鍚岀殑浜哄湪涓嶅悓鐨勬椂闂村垱寤哄嚭鏉ョ殑錛屼粬浠槸瀹氫箟浜庝笉鍚岀紪璇戝崟鍏冨唴鍦皀on-local static瀵硅薄錛屽浣曡兘紜tfs鍦╰empDir涔嬪墠鍏堣鍒濆鍖栵紵 鍝︼紝榪欐槸鏃犳硶紜鐨勩?br>涓涓皬灝忕殑璁捐鍙互鏀瑰彉榪欑鎯呭艦錛氬皢姣忎竴涓猲on-local static 瀵硅薄鎼埌鑷繁鐨勪笓灞炲嚱鏁板唴錛堣瀵硅薄鍦ㄦ鍑芥暟鍐呰澹版槑涓簊tatic錛夈傝繖浜涘嚱鏁拌繑鍥炰竴涓猺eference鐢ㄦ潵鎸囧悜浠栨墍鍖呭惈鐨勫璞°傜劧鍚庣敤鎴瘋皟鐢ㄨ繖浜涘嚱鏁幫紝鑰屼笉鏄洿鎺ユ寚娑夎繖浜涘璞°傛崲鍙ヨ瘽灝辨槸non-local static瀵硅薄琚玪ocal static瀵硅薄鏇挎崲浜嗐傝繖涓疄鐜扮殑鍩虹鍦ㄤ簬錛欳++淇濊瘉錛屽嚱鏁板唴鐨刵on-local static 瀵硅薄浼?xì)鍦ㄥ嚱鏁拌璋冪敤鏈熼棿棣枊啤閬囦笂璇ュ璞′箣瀹氫箟寮忔椂琚垵濮嬪寲銆傛墍浠ュ鏋滀互鍑芥暟璋冪敤鏇挎崲鐩存帴璁塊棶non-local static 瀵硅薄錛屽氨鑾峰緱浜嗕繚璇侊紝淇濊瘉鎵寰楃殑閭d釜reference灝嗘寚鍚戜竴涓粡鍘嗗垵濮嬪寲鐨勫璞°?姝ゆ妧鏈疄鐜頒簬涓婇潰鐨勪唬鐮佸涓嬶細(xì)
class FileSystem { } ; // 鍚屽墠 FileSystem & tfs() // 榪欎釜鍑芥暟鐢ㄦ潵鏇挎崲tfs瀵硅薄錛涗粬鍦‵ileSystem涓彲鑳芥槸涓猻tatic銆?/span>{ static FileSystem fs; return fs; } class Directory { } ; Directory::Directory( ) { std::size_t disks = tfs().numDisks(); } Directory & tempDir() { static Directory td; return td; }
淇敼涔嬪悗錛屾垜浠彧鏄嬌鐢ㄧ殑鏄痶fs()鍜宼empDir()錛岃屼笉鏄痶fs鍜宼empDir銆備篃灝辨槸浣跨敤鐨勬槸鎸囧悜static鐨剅eference鑰屼笉鏄痵tatic瀵硅薄鑷韓銆?br>榪欐牱鐨剅eference-returning鍑芥暟寰寰鍗佸垎鍗曠函錛氱涓琛屽畾涔夊茍鍒濆鍖栦竴涓猯ocal static瀵硅薄錛岀浜岃榪斿洖浠栥傚綋鐒?dòng)灱屼粬鏄l濅匠鐨刬nline鍊欓夛紝鐗瑰埆鏄粡甯歌璋冪敤鐨勮瘽銆備絾鏄紝鍙︿竴鏂歸潰錛屼換浣曚竴縐峮on-const static瀵硅薄錛屼笉璁烘槸local鎴栬卬on-local錛屽湪澶氱嚎紼嬩笅“絳夊緟鏌愪簨鍙戠敓閮戒細(xì)鏈夐夯鐑?chǔ)鐨勩傚鐞嗚繖涓夯鐑?chǔ)鐨勪竴縐嶅仛娉曟槸錛氬湪紼嬪簭鐨勫崟綰跨▼鍚姩闃舵鎵嬪伐璋冪敤鎵鏈夌殑reference-returning鍑芥暟錛堬紵錛燂級錛岃繖鍙秷闄や笌鍒濆鍖栨湁鍏崇殑race condition銆?br>涓洪伩鍏嶅璞″垵濮嬪寲涔嬪墠榪囨棭鐨勪嬌鐢ㄤ粬浠紝浣犻渶瑕佸仛鐨勬槸涓変歡浜嬶細(xì)鎵嬪伐鍒濆鍖栧唴緗殑non-member瀵硅薄錛涗嬌鐢╩ember initialization list錛涘湪鍒濆鍖栨搴忎笉紜畾涓嬪姞寮轟綘鐨勮璁°?br> Things to remember: 1.Manually initialize objects of built-in type, because C++only sometimes initializes them itself; 2.In a constructor, prefer to use the member initialization list to assigenment inside the body of the constructor. List data member in the initialization list in the same order they're declared in the class. 3.Avoid initialization order problems across translation units by replacing non-local static objects with local static objects.
]]> Effective C++璇諱功絎旇涔嬩簩 :灝藉彲鑳戒嬌鐢╟onst http://www.shnenglu.com/xiaohe0817/archive/2008/12/09/68989.htmlEdmund Edmund Tue, 09 Dec 2008 15:00:00 GMT http://www.shnenglu.com/xiaohe0817/archive/2008/12/09/68989.html http://www.shnenglu.com/xiaohe0817/comments/68989.html http://www.shnenglu.com/xiaohe0817/archive/2008/12/09/68989.html#Feedback 0 http://www.shnenglu.com/xiaohe0817/comments/commentRss/68989.html http://www.shnenglu.com/xiaohe0817/services/trackbacks/68989.html 鏉℃涓夛細(xì)灝藉彲鑳戒嬌鐢╟onst錛坲se const whenever possible錛?br>const鍏佽浣犳寚瀹氫竴涓涔夌害鏉燂紝鑰岀紪璇戝櫒浼?xì)寮哄埗瀹炴柦杩櫃骞绾︽潫銆傚畠鍏佽浣犲憡璇夌紪璇戝櫒鍜屽叾浠栫▼搴忓憳鏌愬煎簲璇ヤ繚鎸佷笉鍙樸傛湁涓鏉$害鏉熼渶瑕佹敞鎰忥紝閭e氨鏄細(xì)濡傛灉const鍑虹幇鍦?鍙風(fēng)殑宸﹁竟錛岄偅灝辨槸璇磋鎸囩墿鏄父閲忥紱濡傛灉鍑虹幇鍦ㄦ槦鍙峰彸杈癸紝鍒欒〃紺烘寚閽堟湰韜槸甯擱噺錛涘鏋滃嚭鐜板湪涓よ竟錛屽垯琚寚鐗╁拰鎸囬拡閮芥槸甯擱噺銆傚鏋滆鎸囩墿鏄父閲忥紝鍒欏叧閿瓧const鍐欏湪綾誨瀷鐨勫墠闈㈠拰綾誨瀷涔嬪悗錛屾槦鍙蜂箣鍓嶄袱縐嶆墍琛ㄧず鐨勮涔夋槸鐩稿悓鐨勩備緥濡備笅闈㈣繖涓ょ鍐欐硶鏄竴鏍風(fēng)殑錛?br>void f1(const Widget* pw); void f2(Widget const * pw); const涔熷彲鐢ㄦ潵淇グSTL涓殑榪唬鍣ㄣ傚0鏄庤凱浠e櫒涓篶onst灝辨兂澹版槑鎸囬拡涓篶onst涓鏍鳳紙鍗砊* const 鎸囬拡錛夛紝琛ㄧず榪欎釜榪唬鍣ㄤ笉寰楁寚鍚戜笉鍚岀殑涓滆タ銆備絾瀹冩墍鎸囩殑涓滆タ鐨勫兼槸鍙互鏀瑰彉鐨勩傚鏋滃笇鏈涜凱浠e櫒鎵鎸囩殑涓滆タ涓嶅彲鏀瑰彉錛堝嵆妯℃嫙涓涓猚onst T*鎸囬拡錛夛紝闇瑕佺殑鏄痗onst_iterator: std::vector<int> vec; ... const std::vector<int>::iterator iter = vec.begin();// same as T* const *iter = 10; //no problem ++iter; //wrong!! std::vector<int>::const_iterator cIter = vec.begin();//same as const T* *iter = 10; //wrong!! ++iter; //no problem
const 鏈鍏峰▉鍔涳紙錛燂級鐨勭敤娉曟槸闈㈠鍑芥暟澹版槑鏃剁殑搴旂敤銆傚湪涓涓嚱鏁板0鏄庡紡鍐咃紝const鍙互鍜屽嚱鏁拌繑鍥炲鹼紝鍚勫弬鏁幫紝鍑芥暟鑷韓錛堟垚鍛樺嚱鏁幫級浜х敓鍏寵仈銆?br>浠ゅ嚱鏁拌繑鍥炰竴涓父閲忓鹼紝寰寰鍙互闄嶄綆鍥犲鎴烽敊璇岄犳垚鐨勬剰澶栵紝鑰屽張涓嶈嚦浜庢斁寮冨畨鍏ㄦу拰楂樻晥鎬с備緥濡傦紝鑰冭檻鏈夌悊鏁扮殑operator*澹版槑寮忥細(xì) class Rational(){...}; const Rational operator* (const Rational & lhs, const Rational & rhs); 涔熻浣犱細(xì)璇翠負(fù)浠涔堣繑鍥炰竴涓猚onst瀵硅薄錛熷師鍥犳槸濡傛灉涓嶈繖鏍峰埆浜哄彲鑳藉疄鐜拌繖鏍風(fēng)殑鏆磋錛?br>Rational a,b,c; ... (a*b)=c; 涓嬮潰錛屼富瑕佽鏄巆onst浣滅敤浜庢垚鍛樺嚱鏁般?br>璁稿浜洪兘蹇借浜嗚繖涔堜竴涓簨瀹烇紝閭e氨鏄鏋滀袱涓垚鍛樺嚱鏁板彧鏄父閲忔т笉鍚岋紝閭d箞浠栦滑鏄彲浠ラ噸杞界殑銆傝冭檻浠ヤ笅榪欎釜鐢ㄦ潵琛ㄧず涓澶у潡鏂囧瓧鐨刢lass錛?br>
class TextBlock { public : const char & operator [](std::size_t position) const { return text[position];} char & operator [](std::size_t position) { return text[position];} private : std:: string text; } ; TextBlock鐨刼perator[]鍙互榪欎箞浣跨敤錛?br> TextBlock tb( " Hello " ); std::cout << tb[ 0 ]; // 璋冪敤non-const const TextBlock ctb( " Hello " ); std::cont << ctb[ 0 ]; // 璋冪敤const
鐪熸槸鎯呭艦涓璫onst瀵硅薄澶氱敤浜巔assed by pointer-to-const鎴杙assed by reference-to-const鐨勪紶閫掔粨鏋溿備笂榪扮殑ctb澶繃浜庨犱綔錛屼笅杈硅繖涓瘮杈冪湡瀹烇細(xì)
void print ( const TextBlocd & ctb) { std::cout << ctb[ 0 ]; }
鍙敤閲嶈澆operator[]騫跺涓嶅悓鐨勭増鏈粰浜堜笉鍚岀殑榪斿洖綾誨瀷錛屽氨鍙互浠onst鍜宯on-const鑾峰緱涓嶅悓鐨勫鐞嗐?br>姝ゅ闇瑕佹敞鎰忎竴鐐癸紝non-const operator[]鐨勮繑鍥炵被鍨嬫槸涓猺eference to char,涓嶆槸char銆傚鏋渙perator[]榪斿洖鐨勬槸涓猚har錛屼笅杈圭殑璧嬪煎氨涓嶈兘閫氳繃緙栬瘧錛?br>tb[0] = 'x'; //error c2106: ' = ' : left operand must be l-value 閭f槸鍥犱負(fù)錛屽鏋滃嚱鏁扮殑榪斿洖綾誨瀷鏄釜鍐呯疆綾誨瀷錛岄偅涔堟敼鍔ㄥ嚱鏁扮殑榪斿洖鍊間粠鏉ュ氨涓嶅悎娉曘傜旱浣垮悎娉曪紝C++浠y value榪斿洖瀵硅薄榪欎竴浜嬪疄錛堟潯嬈?0錛夋剰鍛崇潃鏀瑰姩鐨勫叾瀹炲彧鏄痶b.text[0]鐨勪竴涓壇鏈紝涓嶆槸tb.text[0]鏈韓錛岄偅涓嶆槸鎴戜滑鎯寵鐨勭粨鏋溿?br>涓嬭竟鏉ヨ璇村湪const鍜宯on-const鎴愬憳鍑芥暟涓伩鍏嶉噸澶?br>鍋囪TextBlock錛堝拰CTextBlock錛夊唴鐨刼perator[]涓嶅崟鍙槸榪斿洖涓涓猺eference鎸囧悜鏌愬瓧絎︼紝涔熸墽琛岃竟鐣屾鏌ャ佸織璁拌闂俊鎭佺敋鑷沖彲鑳借繘琛屾暟鎹畬鏁存ф楠屻傛妸鎵鏈夎繖浜涘悓鏃舵斁榪沜onst鍜宯on-const operator[]涓紝瀵艱嚧榪欐牱鐨勪竴涓墿錛?br>
class TextBlock { public : const char & operator [](std::size_t position) const { // 杈圭晫媯(gè)鏌?bounds checking) // 蹇楄鏁版嵁璁塊棶(log access data) // 媯(gè)楠屾暟鎹畬鏁存?verify data integrity) return text[position]; } char & operator [](std::size_t position) { // 杈圭晫媯(gè)鏌?bounds checking) // 蹇楄鏁版嵁璁塊棶(log access data) // 媯(gè)楠屾暟鎹畬鏁存?verify data integrity) return text[position]; } private : std:: string text; } ;
鍏朵腑浠g爜鐨勪唬鐮侀噸澶嶆у強(qiáng)浼撮殢鐨勭紪璇戞椂闂達(dá)紝緇存姢錛屼唬鐮佽啫鑳絳夐棶棰樼湡鏄護(hù)浜哄ご鐤煎晩銆傚綋鐒朵簡錛屽皢杈圭晫媯(gè)鏌?#8230;…絳夋墍鏈変唬鐮佺Щ妞嶅埌鍙︿竴涓垚鍛樺嚱鏁幫紝騫朵護(hù)涓や釜鐗堟湰鐨刼perator[]璋冪敤瀹冿紝鏄彲鑳界殑錛屼絾鏄繕鏄噸澶嶄簡涓浜涗唬鐮侊紝渚嬪鍑芥暟璋冪敤錛屼袱嬈eturn璇彞絳夈?br>鎴戜滑鐪熸瑕佸仛鐨勶紝鏄疄鐜皁perator[]鐨勬満鑳戒竴嬈″茍浣跨敤瀹冧袱嬈°備篃灝辨槸璇達(dá)紝浣犲繀欏諱嬌涓涓皟鐢ㄥ彟涓涓傝繖淇冧嬌鎴戜滑灝嗗父閲忔ц漿闄わ紙casting away constness錛夈?br>灝變竴鑸岃█錛宑asting鏄竴涓碂緋曠殑鎯蟲硶錛屽湪鏉℃27涓湁璇︾粏鐨勮鏄庛傜劧鑰屼唬鐮侀噸澶嶄篃涓嶆槸浠涔堜護(hù)浜烘剦蹇殑緇忛獙銆傛湰渚嬩腑cosnt operator[]瀹屽叏鍋氭帀浜唍on-const鐗堟湰璇ュ仛鐨勪竴鍒囷紝鍞竴涓嶅悓鏄叾榪斿洖綾誨瀷澶氫簡涓涓猚onst璧勬牸淇グ銆傝繖縐嶆儏鍐典笅濡傛灉灝嗚繑鍥炲肩殑const杞櫎鏄畨鍏ㄧ殑錛屽洜涓轟笉璁鴻皝璋冪敤non-const operator[]閮戒竴瀹氶鍏堟湁涓猲on-const瀵硅薄錛屽惁鍒欏氨涓嶈兘澶熻皟鐢╪on-const鍑芥暟銆傛墍浠ヤ護(hù)non-const operator[]璋冪敤鍏禼onst鍏勫紵鏄竴涓伩鍏嶉噸澶嶇殑瀹夊叏鍋氭硶錛?br>
class TextBlock { public : const char & operator [](std::size_t position) const { return text[position]; } char & operator [](std::size_t position) { const_cast < char &> (static_cast < const TextBlock &> (* this )[position]); } };
榪欓噷闈㈡湁涓や釜杞瀷鍔ㄤ綔錛岃屼笉鏄竴涓傛垜浠墦綆楄non-const operator[]璋冪敤const鍏勫紵錛屼絾鏄痭on-const濡傛灉鍙槸鍗曠函璋冪敤operator[]錛屼細(xì)閫掑綊璋冪敤鑷繁銆備負(fù)浜嗛伩鍏嶆棤絀烽掑綊錛屾垜浠繀欏繪槑紜寚鍑鴻皟鐢ㄧ殑鏄痗onst operator[]銆傚洜姝わ紝榪欓噷灝?this浠庡叾鍘熷綾誨瀷TextBlock&杞瀷涓篶onst TextBlock&銆傛墍浠ヨ繖閲屾湁涓ゆ杞瀷錛氱涓嬈$敤鏉ヤ負(fù)*this娣誨姞const錛岀浜屾鍒欐槸浠巆onst operator[]鐨勮繑鍥炲間腑縐婚櫎const銆傛坊鍔燾onst鐨勯偅涓嬈¤漿鍨嬪己榪繘琛屼簡涓嬈″畨鍏ㄨ漿鍨嬶紝鎵浠ラ噰鐢╯tatic_cast銆傜Щ闄onst鐨勯偅涓姩浣滃彧鑳界敱const_cast瀹屾垚錛屾病鏈夊叾浠栭夋嫨銆?br>涓嬮潰鏉ヨ冭檻涓涓嬪弽鍚戠殑鍋氭硶錛氫護(hù)const鏉ヨ皟鐢╪on-const浠ラ伩鍏嶉噸澶嶃傝繖涓笉鏄垜浠簲璇ュ仛鐨勩俢onst鎴愬憳鍑芥暟鎵胯緇濆涓嶆敼鍙樺叾瀵硅薄鐨勯昏緫鐘舵侊紝non-const鎴愬憳鍑芥暟鍗存病鏈夎繖鑸壙璇恒傚鏋滃湪const鍑芥暟鍐呴儴璋冪敤浜唍on-const鍑芥暟錛屽氨鏄啋浜嗚繖鏍風(fēng)殑椋庨櫓錛氫綘鏇劇粡鎵胯涓嶆敼鍔ㄧ殑閭d釜瀵硅薄琚敼鍔ㄤ簡銆傝繖灝辨槸涓轟粈涔?#8220;const鎴愬憳鍑芥暟璋冪敤non-const鎴愬憳鍑芥暟”鏄竴縐嶉敊璇涓猴細(xì)鍥犱負(fù)瀵硅薄鏈夊彲鑳藉洜姝よ岃鏀瑰姩銆傚弽鍚戣皟鐢ㄦ墠鏄畨鍏ㄧ殑錛歯on-const鍑芥暟鏈潵灝卞彲浠ュ鍏跺璞″仛浠諱綍鍔ㄤ綔錛屾墍浠ュ湪鍏朵腑璋冪敤涓涓猚onst鎴愬憳鍑芥暟騫朵笉浼?xì)甯︽潵鋼Q浣曢闄┿?br> 鏈潯鐩葷粨錛?br>
Things to Remember
Declaring something const helps compilers detect usage errors. const can be applied to objects at any scope, to function parameters and return types, and to member functions as a whole.
Compilers enforce bitwise constness, but you should program using conceptual constness.
When const and non-const member functions have essentially identical implementations, code duplication can be avoided by having the non-const version call the const version.
]]>effectiv c++ 璇諱功絎旇涔嬩竴 http://www.shnenglu.com/xiaohe0817/archive/2008/12/08/68891.htmlEdmund Edmund Mon, 08 Dec 2008 15:50:00 GMT http://www.shnenglu.com/xiaohe0817/archive/2008/12/08/68891.html http://www.shnenglu.com/xiaohe0817/comments/68891.html http://www.shnenglu.com/xiaohe0817/archive/2008/12/08/68891.html#Feedback 0 http://www.shnenglu.com/xiaohe0817/comments/commentRss/68891.html http://www.shnenglu.com/xiaohe0817/services/trackbacks/68891.html 鐜板湪鍦ㄧ淮鎶や唬鐮佺殑鏃跺欙紝鍓嶈緢浠ぇ鐗囧ぇ鐗囩殑瀹忔悶寰楁垜鏄偅涓檿澶磋漿鍚戝晩錛岀湡甯屾湜浠栦滑涔熺湅榪囨湰鏉℃ 銆?br>1.Case錛?define ASPECT_RATIO 1.653 Recommendation錛歝onst double AspectRatio = 1.653錛?br>Reason: 褰撲嬌鐢ˋSPECT_RATIO浣嗘槸鑾峰緱涓涓紪璇戦敊璇俊鎭椂錛屽彲鑳戒綘浼?xì)寰堟槸鍙戝啅锛屽洜湄?fù)榪欎釜閿欒淇℃伅涔熻浼?xì)鎻愬?.653鑰屼笉鏄疉SPECT_RATIO銆傚鏋淎SPECT_RATIO瀹氫箟鍦ㄩ潪浣犳墍鍐欑殑澶存枃浠朵腑錛屼綘鏇存槸鍥犱負(fù)榪借釜浠栬屾氮璐規(guī)椂闂淬傛敼涓烘帹鑽愮殑鏂瑰紡鍚庯紝浣犳壘鍒扮殑鑲畾鏄疉spectRatio銆傚綋浠ュ父閲忔浛鎹?define鏃訛紝鏈変袱縐嶆敞鎰忕殑鎯呭喌錛岀涓縐嶆槸瀹氫箟甯擱噺鎸囬拡錛坈onst pointers錛夈傜敱浜庡父閲忓畾涔夊紡甯告斁鍦ㄥご鏂囦歡鍐咃紝鍥犳鏈夊繀瑕佸皢鎸囬拡涔熷0鏄庝負(fù)const銆備緥濡傚湪涓涓ご鏂囦歡鍐呭畾涔変竴涓父閲忕殑char*-based瀛楃涓詫紝蹇呴』鍐檆onst涓ゆ錛?br>const char* const authorName = "Edmund"; 榪欓噷閲囩敤string瀵硅薄姣斿叾鍓嶈緢char*-based鏇村悎閫傦紝 const std::string authorName("Edmund"); 絎簩縐嶆槸class涓撳睘甯擱噺銆備負(fù)浜嗗皢甯擱噺鐨勪綔鐢ㄥ煙闄愬埗鍦╟lass鍐咃紝浣犲繀欏昏浠栨垚涓篶lass鐨勪竴涓垚鍛橈紱鑰屼負(fù)紜繚姝ゅ父閲忓彧鏈変竴涓疄浣擄紝鍒欏繀欏誨0鏄庝負(fù)static錛?br>class GamePlayer{ private: static const int NumTurns = 5; int scores[NumTurns]; ... } 鐒惰岋紝浣犵湅鍒扮殑鏄疦umTurns鐨勫0鏄庡紡鑰屼笉鏄畾涔夊紡錛孋++閫氬父瑕佹眰鎴戜滑鎵浣跨敤鐨勪換浣曚笢瑗塊兘瑕佹湁涓涓畾涔夊紡錛屼絾濡傛灉浠栨槸涓猚lass鐨勪笓灞炲父閲忚屽張鏄痵tatic涓斾負(fù)鏁存暟綾誨瀷錛坕nts錛宑hars錛宐ools錛夛紝鍒欏仛鐗規(guī)畩澶勭悊銆傚彧瑕佷笉鍙栦粬浠殑鍦板潃錛屼綘鍙互澹版槑騫朵嬌鐢ㄤ粬浠屾棤闇鎻愪緵瀹氫箟寮忋備絾濡傛灉鍙栨煇涓猚lass涓撳睘甯擱噺鐨勫湴鍧錛屾垨綰典嬌涓嶅彇鍦板潃鑰岀紪璇戝櫒鍗村潥鎸佽鐪嬪埌涓涓畾涔夊紡錛屼綘灝卞繀欏繪彁渚涘彟澶栦竴涓畾涔夊紡錛?br>const int GamePlayer::NumTurns; 鐢變簬NumTurns鍦ㄥ0鏄庢椂宸茬粡鑾峰緱浜嗗垵鍊鹼紝鍥犳瀹氫箟鏃朵笉鍙互鍐嶈鍒濆箋傛澶栵紝瀵規(guī)墍璋撶殑“in-class鍒濆艱瀹?#8221;涔熷彧鍏佽瀵規(guī)暣鏁板父閲忚繘琛屻傚鏋滀負(fù)闈炴暣鍨嬪垯鍙互閲囩敤涓嬮潰鐨勮繖縐嶆柟寮忥細(xì) class CostEstimate{ private: static const double FudgeFactor; ... } const double CostEstimate::FudgeFactor = 1.35; 褰撲綘鍦ㄧ紪璇戞湡闇瑕佷竴涓猚lass甯擱噺鍊鹼紝渚嬪鍦ㄤ笂榪癎amePlayer::scores鐨勬暟緇勫0鏄庝腑錛屾鏃跺鏋滅紪璇戝櫒涓嶅厑璁?#8220;static鏁存暟鍨媍lass甯擱噺”瀹屾垚“in-class鍒濆艱瀹?#8221;錛屽彲閲囩敤enum鏉ヨВ鍐籌紝鍏剁悊璁哄熀紜鏄?#8220;涓涓睘浜庢灇涓劇被鍨嬬殑鏁板煎彲鏉冨厖ints琚嬌鐢?#8221;錛屼簬鏄疓amePlayer鍙畾涔夊涓嬶細(xì) class GamePlayer{ private: enum{NumTurns = 5}; int scores[NumTurns]; ... }; 娉ㄦ剰錛氬彇涓涓猚onst鐨勫兼槸鍚堟硶鐨勶紝浣嗘槸鍙栦竴涓猠num鐨勫煎氨鏄笉鍚堟硶鐨勶紝鍙栦竴涓?define鐨勫間篃鏄笉鍚堟硶鐨勩傚鏋滀綘涓嶆兂璁╁埆浜鴻幏寰椾竴涓猵ointer鎴栬卹eference鎸囧悜浣犵殑鏌愪釜鏁存暟甯擱噺錛宔num鍙互甯姪浣犲疄鐜拌繖涓害鏉熴?br>涓嬭竟緇х畫璇撮澶勭悊鍣ㄣ傚彟澶栦竴涓父瑙佺殑#define璇敤鐨勬儏鏅槸浠ヤ粬鏉ュ疄鐜板畯錛屽畯鐪嬭搗鏉ュ儚鍑芥暟錛屼絾鏄笉浼?xì)鎷涜嚧鍑芥暟璋冪敤甯︽潵鐨勯澶栧紑閿錛屼緥濡傦細(xì) #define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))銆備粬鐨勭己鐐瑰氨涓嶈浜嗭紝鏇夸唬鏂瑰紡錛?br>template<class T> inline void callWithMax(const T& a, const T& b) { f(a > b?a : b); } 鏈潯鐩葷粨錛?br>1.瀵逛簬鍗曠函甯擱噺錛屾渶濂戒互const瀵硅薄鎴栬卐nums鏇挎崲#defines錛?br>2.瀵逛簬褰技鍑芥暟鐨勫畯錛屾渶濂芥敼鐢╥nline鍑芥暟鏇挎崲#defines銆?br> Ps錛氭湰鏂囨槸絎竴嬈″湪cppblog涓婂彂琛ㄧ殑鏂囩珷錛屽懙鍛點(diǎn)傚緢鏃╁氨鎯沖湪榪欎笂闈㈠啓鐐逛簡錛屼絾鏄笉鏄繖榪欏氨鏄繖閭o紝鏄ㄥぉ涓嬪畾鍐沖績錛屽厛鎶奺ffective C++(3e)閲岄潰鐨?5鏉¤涔︾瑪璁板啓鍦ㄨ繖涓婇潰銆傛墦綆楁瘡澶╀竴涓潯鐩紝榪欓噷闈㈠ソ澶氳窡涔︿笂鐨勫彞瀛愪竴鏍鳳紝浣嗘槸鍏ㄦ槸鎴戣嚜宸辨暡榪涘幓鐨勶紝涓嶅瓨鍦ㄤ換浣曠殑paste銆傛墍鍐欏潎鏄嚜宸辨悶娓呮鐨勶紝涓嶆槑鐧藉湴鏂圭殑鏆傛椂娌℃湁娣誨姞銆?br>
]]>
久久久久久无码Av成人影院 |
色综合久久中文综合网 |
a高清免费毛片久久 |
99精品久久精品 |
亚洲国产精品久久久久婷婷软件
|
中文成人久久久久影院免费观看 |
久久久久99精品成人片牛牛影视 |
久久亚洲国产成人精品无码区 |
精品永久久福利一区二区 |
国产精品久久久天天影视香蕉
|
久久精品黄AA片一区二区三区 |
国产精品久久久久久吹潮 |
国产精品熟女福利久久AV |
久久精品国产色蜜蜜麻豆 |
久久精品国产精品亚洲毛片 |
国产福利电影一区二区三区久久老子无码午夜伦不
|
国产精久久一区二区三区 |
亚洲精品高清国产一线久久 |
久久精品成人影院 |
久久青青草原亚洲av无码app |
国产精品欧美久久久久无广告 |
国产成人久久精品一区二区三区
|
亚洲精品高清国产一久久 |
欧美精品九九99久久在观看 |
久久不见久久见免费影院www日本 |
天天躁日日躁狠狠久久 |
久久久国产精品 |
久久99精品国产一区二区三区 |
奇米影视7777久久精品 |
久久久国产精华液 |
久久99热国产这有精品 |
亚洲精品高清国产一线久久 |
囯产极品美女高潮无套久久久 |
久久久久亚洲AV无码专区桃色
|
国产精品99久久不卡 |
久久青草国产手机看片福利盒子 |
日韩AV无码久久一区二区 |
亚洲精品乱码久久久久久中文字幕
|
色综合合久久天天给综看 |
亚洲国产精品狼友中文久久久 |
午夜精品久久久久久中宇 |