锘??xml version="1.0" encoding="utf-8" standalone="yes"?>中国成人在线视频,久久久久久自在自线,欧美精品在线一区二区三区 http://m.shnenglu.com/mumutou/archive/2007/01/21/17856.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Sun, 21 Jan 2007 04:36:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/21/17856.html http://m.shnenglu.com/mumutou/comments/17856.html http://m.shnenglu.com/mumutou/archive/2007/01/21/17856.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17856.html http://m.shnenglu.com/mumutou/services/trackbacks/17856.html 闃呰鍏ㄦ枃 ]]> UML闅忕瑪 涔?Rose瀵筕C鐨勬鍚?鍙嶅悜宸ョ▼ http://m.shnenglu.com/mumutou/archive/2007/01/21/17855.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Sun, 21 Jan 2007 04:35:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/21/17855.html http://m.shnenglu.com/mumutou/comments/17855.html http://m.shnenglu.com/mumutou/archive/2007/01/21/17855.html#Feedback 1 http://m.shnenglu.com/mumutou/comments/commentRss/17855.html http://m.shnenglu.com/mumutou/services/trackbacks/17855.html
鐢?/span>
[IBM
杞歡緋誨垪
].IBM.Rational.Rose.Enterprise.v7.0-TFTISO
寤虹珛闀滃儚鍚庡畨瑁?/span>
鎵撳紑
Rose
杞歡
鐢變簬鏈漢緇忓父浣跨敤
VC6.0
寮鍙戣蔣浠?/span>
棣栧厛鏉ヨ皥璋?/font>
Rose
鍏充簬
VC6.0
鐨勬鍚戝拰閫嗗悜宸ョ▼鍚?/span>
Rose
鎬誨叡鏈?/span>
5
縐嶇被鍨嬪浘
虜聽聽聽聽聽聽聽
Use Case View
虜聽聽聽聽聽聽聽
Logical View
虜聽聽聽聽聽聽聽
Component View
虜聽聽聽聽聽聽聽
Deployment View
虜聽聽聽聽聽聽聽
Model Properties
鍏跺疄騫朵笉鑳借鏄竴縐嶅浘
聽
鐜板湪鎴戜滑鍏堟潵璋堣皥
Logical View
灝辨槸闈欐佸浘錛?/span>
緇忓父鎴戜滑浣跨敤瀹冩潵鍋氫竴浜涢潤鎬佺被搴撱?/font>
濂戒簡錛屽厛鏉ョ湅鐪嬪弽鍚戝伐紼嬪惂
[tools]->[Visual C++]->[Update Model From Code]
鍑虹幇
Model Update Tool-Select Components and Classes
濡傛灉鍦?/span>
VC++
涓嬮潰娌℃湁欏圭殑璇濓紝鐐瑰嚮
Add Component,
娣誨姞涓涓鏂借閫嗗悜宸ョ▼鐨?/span>
VC
宸ョ▼
鐐瑰嚮宸ョ▼涓嬮潰鎵鏈夌殑綾伙紝鐐瑰嚮
Next
灝卞彲浠ヤ簡銆?/span>
聽
聽
鎴戜滑鍐嶆潵鐪嬬湅姝e悜宸ョ▼
[tools]->[Visual C++]->[Update Code]
鍚屾牱瀹夎浠ヤ笂鎿嶄綔灝卞彲浠ヤ簡
聽
濡傛灉鎴戜滑娣誨姞涓涓被鐨勮瘽錛岄偅涔堝氨蹇呴』瑕佷嬌鐢?/font>
[Tools]->[Visual C++]->[Component Assignment Tool]
鏉ユ妸娣誨姞鐨勭被鍖呭惈鍒板疄琛屾鍚戝伐紼嬬殑
VC
宸ョ▼閲岄潰銆?/span>
聽
聽
聽
聽
聽
]]>UML闅忕瑪 涔?綾?鍏崇郴 http://m.shnenglu.com/mumutou/archive/2007/01/19/17776.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Fri, 19 Jan 2007 04:04:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/19/17776.html http://m.shnenglu.com/mumutou/comments/17776.html http://m.shnenglu.com/mumutou/archive/2007/01/19/17776.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17776.html http://m.shnenglu.com/mumutou/services/trackbacks/17776.html 綾誨叧緋繪誨叡鍒嗕負1.緇ф壙鍏崇郴[涓鑸寲鍏崇郴] class A{}; class B:public A {}; A鍜孊鏄戶鎵垮叧緋?br />2.鍏寵仈鍏崇郴 class A{}; class B { 聽聽聽void聽聽聽Function1(A *a); } A鍜孊鏄叧鑱斿叧緋?br />3.鑱氬悎鍏崇郴 class A{}; class B { 聽聽聽A *a; }; A鍜孊鏄仛鍚堝叧緋?br />姣斿XX甯傝繖涓被 class XX甯?br />{ 聽聽聽鍔沖姩灞聽聽聽*鍔沖姩灞1; 聽聽聽渚涚數灞 *渚涚數灞1; 聽聽聽綺灞 *綺灞1; };4.緇勫悎鍏崇郴 class A{}; class B { 聽聽聽A a; }; A鍜孊鏄粍鍚堝叧緋?br /> 緇勫悎鍏崇郴鍜岃仛鍚堝叧緋繪瘮璧鋒潵錛屽叾寮哄害瑕侀珮涓鐐癸紱
]]> C++闅忕瑪 涔?C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶 (杞澆) http://m.shnenglu.com/mumutou/archive/2007/01/16/17682.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Tue, 16 Jan 2007 05:24:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/16/17682.html http://m.shnenglu.com/mumutou/comments/17682.html http://m.shnenglu.com/mumutou/archive/2007/01/16/17682.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17682.html http://m.shnenglu.com/mumutou/services/trackbacks/17682.html
C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶
榪欐槸More Effecitve C++閲岀殑絎簩鏉″綾誨瀷杞崲璁茬殑寰堝ソ錛屼篃寰堝熀紜濂芥噦銆?br />Item M2錛氬敖閲忎嬌鐢–++椋庢牸鐨勭被鍨嬭漿鎹?br />浠旂粏鎯蟲兂鍦頒綅鍗戣幢鐨勭被鍨嬭漿鎹㈠姛鑳斤紙cast錛夛紝鍏跺湪紼嬪簭璁捐涓殑鍦頒綅灝辮薄goto璇彞涓鏍蜂護浜洪剻瑙嗐備絾鏄畠榪樹笉鏄棤娉曚護浜哄繊鍙楋紝鍥犱負褰撳湪鏌愪簺绱ц鐨勫叧澶達紝綾誨瀷杞崲榪樻槸蹇呴渶鐨勶紝榪欐椂瀹冩槸涓涓繀闇鍝併?br />涓嶈繃C椋庢牸鐨勭被鍨嬭漿鎹㈠茍涓嶄唬琛ㄦ墍鏈夌殑綾誨瀷杞崲鍔熻兘銆?br />涓鏉ュ畠浠繃浜庣矖椴侊紝鑳藉厑璁鎬綘鍦ㄤ換浣曠被鍨嬩箣闂磋繘琛岃漿鎹€備笉榪囧鏋滆榪涜鏇寸簿紜殑綾誨瀷杞崲錛岃繖浼氭槸涓涓紭鐐廣傚湪榪欎簺綾誨瀷杞崲涓瓨鍦ㄧ潃宸ㄥぇ鐨勪笉鍚岋紝渚嬪鎶婁竴涓寚鍚?const瀵硅薄鐨勬寚閽堬紙pointer-to-const-object錛夎漿鎹㈡垚鎸囧悜闈瀋onst瀵硅薄鐨勬寚閽堬紙pointer-to-non-const -object錛?鍗充竴涓粎浠呭幓闄onst鐨勭被鍨嬭漿鎹?錛屾妸涓涓寚鍚戝熀綾葷殑鎸囬拡杞崲鎴愭寚鍚戝瓙綾葷殑鎸囬拡錛堝嵆瀹屽叏鏀瑰彉瀵硅薄綾誨瀷錛夈備紶緇熺殑C椋庢牸鐨勭被鍨嬭漿鎹笉瀵逛笂榪頒袱縐嶈漿鎹㈣繘琛屽尯鍒嗐傦紙榪欎竴鐐逛篃涓嶄護浜烘儕璁訛紝鍥犱負C椋庢牸鐨勭被鍨嬭漿鎹㈡槸涓篊璇█璁捐鐨勶紝鑰屼笉鏄負C++璇█璁捐鐨勶級銆?br />浜屾潵C椋庢牸鐨勭被鍨嬭漿鎹㈠湪紼嬪簭璇彞涓毦浠ヨ瘑鍒傚湪璇硶涓婏紝綾誨瀷杞崲鐢卞渾鎷彿鍜屾爣璇嗙緇勬垚錛岃岃繖浜涘彲浠ョ敤鍦–錛嬶紜涓殑浠諱綍鍦版柟銆傝繖浣垮緱鍥炵瓟璞¤繖鏍蜂竴涓渶鍩烘湰鐨勬湁鍏崇被鍨嬭漿鎹㈢殑闂鍙樺緱寰堝洶闅撅細鈥滃湪榪欎釜紼嬪簭涓槸鍚︿嬌鐢ㄤ簡綾誨瀷杞崲錛熲濄傝繖鏄洜涓轟漢宸ラ槄璇誨緢鍙兘蹇界暐浜嗙被鍨嬭漿鎹㈢殑璇彞錛岃屽埄鐢ㄨ薄grep鐨勫伐鍏風▼搴忎篃涓嶈兘浠庤鍙ユ瀯鎴愪笂鍖哄垎鍑哄畠浠潵銆?br />C++閫氳繃寮曡繘鍥涗釜鏂扮殑綾誨瀷杞崲鎿嶄綔絎﹀厠鏈嶄簡C椋庢牸綾誨瀷杞崲鐨勭己鐐癸紝榪欏洓涓搷浣滅鏄? static_cast, const_cast, dynamic_cast, 鍜宺einterpret_cast銆傚湪澶у鏁版儏鍐典笅錛屽浜庤繖浜涙搷浣滅浣犲彧闇瑕佺煡閬撳師鏉ヤ綘涔犳儻浜庤繖鏍峰啓錛?br />(type) expression 鑰岀幇鍦ㄤ綘鎬誨簲璇ヨ繖鏍峰啓錛?br />static_cast<type>(expression) 渚嬪錛屽亣璁句綘鎯蟲妸涓涓猧nt杞崲鎴恉ouble錛屼互渚胯鍖呭惈int綾誨瀷鍙橀噺鐨勮〃杈懼紡浜х敓鍑烘誕鐐規暟鍊肩殑緇撴灉銆傚鏋滅敤C椋庢牸鐨勭被鍨嬭漿鎹紝浣犺兘榪欐牱鍐欙細 int firstNumber, secondNumber; ... double result = ((double)firstNumber)/secondNumber錛?br />濡傛灉鐢ㄤ笂榪版柊鐨勭被鍨嬭漿鎹㈡柟娉曪紝浣犲簲璇ヨ繖鏍峰啓錛?br />double result = static_cast<double>(firstNumber)/secondNumber; 榪欐牱鐨勭被鍨嬭漿鎹笉璁烘槸瀵逛漢宸ヨ繕鏄紼嬪簭閮藉緢瀹規槗璇嗗埆銆?br />static_cast 鍦ㄥ姛鑳戒笂鍩烘湰涓婁笌C椋庢牸鐨勭被鍨嬭漿鎹竴鏍峰己澶э紝鍚箟涔熶竴鏍楓傚畠涔熸湁鍔熻兘涓婇檺鍒躲備緥濡傦紝浣犱笉鑳界敤static_cast璞$敤C椋庢牸鐨勭被鍨嬭漿鎹竴鏍鋒妸 struct杞崲鎴恑nt綾誨瀷鎴栬呮妸double綾誨瀷杞崲鎴愭寚閽堢被鍨嬶紝鍙﹀錛宻tatic_cast涓嶈兘浠庤〃杈懼紡涓幓闄onst灞炴э紝鍥犱負鍙︿竴涓柊鐨勭被鍨嬭漿鎹㈡搷浣滅const_cast鏈夎繖鏍風殑鍔熻兘銆?br />鍏跺畠鏂扮殑C++綾誨瀷杞崲鎿嶄綔絎﹁鐢ㄥ湪闇瑕佹洿澶氶檺鍒剁殑鍦版柟銆俢onst_cast鐢ㄤ簬綾誨瀷杞崲鎺夎〃杈懼紡鐨刢onst鎴杤olatileness灞炴с傞氳繃浣跨敤const_cast錛屼綘鍚戜漢浠拰緙栬瘧鍣ㄥ己璋冧綘閫氳繃綾誨瀷杞崲鎯沖仛鐨勫彧鏄敼鍙樹竴浜涗笢瑗跨殑 constness鎴栬卾olatileness灞炴с傝繖涓惈涔夎緙栬瘧鍣ㄦ墍綰︽潫銆傚鏋滀綘璇曞浘浣跨敤const_cast鏉ュ畬鎴愪慨鏀筩onstness 鎴栬卾olatileness灞炴т箣澶栫殑浜嬫儏錛屼綘鐨勭被鍨嬭漿鎹㈠皢琚嫆緇濄備笅闈㈡槸涓浜涗緥瀛愶細 class Widget { ... }; class SpecialWidget: public Widget { ... }; void update(SpecialWidget *psw); SpecialWidget sw; // sw 鏄竴涓潪const 瀵硅薄銆?br />const SpecialWidget& csw = sw; // csw 鏄痵w鐨勪竴涓紩鐢?br />// 瀹冩槸涓涓猚onst 瀵硅薄 update(&csw); // 閿欒!涓嶈兘浼犻掍竴涓猚onst SpecialWidget* 鍙橀噺 // 緇欎竴涓鐞哠pecialWidget*綾誨瀷鍙橀噺鐨勫嚱鏁?br />update(const_cast<SpecialWidget*>(&csw)); // 姝g‘錛宑sw鐨刢onst琚樉紺哄湴杞崲鎺夛紙 // csw鍜宻w涓や釜鍙橀噺鍊煎湪update //鍑芥暟涓兘琚洿鏂幫級 update((SpecialWidget*)&csw); // 鍚屼笂錛屼絾鐢ㄤ簡涓涓洿闅捐瘑鍒?br />//鐨凜椋庢牸鐨勭被鍨嬭漿鎹?br />Widget *pw = new SpecialWidget; update(pw); // 閿欒錛乸w鐨勭被鍨嬫槸Widget*錛屼絾鏄?br />// update鍑芥暟澶勭悊鐨勬槸SpecialWidget*綾誨瀷 update(const_cast<SpecialWidget*>(pw)); // 閿欒錛乧onst_cast浠呰兘琚敤鍦ㄥ獎鍝?br />// constness or volatileness鐨勫湴鏂逛笂銆? // 涓嶈兘鐢ㄥ湪鍚戠戶鎵垮瓙綾昏繘琛岀被鍨嬭漿鎹€?br />鍒扮洰鍓嶄負姝紝const_cast鏈鏅氱殑鐢ㄩ斿氨鏄漿鎹㈡帀瀵硅薄鐨刢onst灞炴с?br />絎簩縐嶇壒孌婄殑綾誨瀷杞崲絎︽槸dynamic_cast錛屽畠琚敤浜庡畨鍏ㄥ湴娌跨潃綾葷殑緇ф壙鍏崇郴鍚戜笅榪涜綾誨瀷杞崲銆傝繖灝辨槸璇達紝浣犺兘鐢╠ynamic_cast鎶婃寚鍚戝熀綾葷殑鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚鎸囧悜鍏舵淳鐢熺被鎴栧叾鍏勫紵綾葷殑鎸囬拡鎴栧紩鐢紝鑰屼笖浣犺兘鐭ラ亾杞崲鏄惁鎴愬姛銆傚け璐ョ殑杞崲灝嗚繑鍥炵┖鎸囬拡錛堝綋瀵規寚閽堣繘琛岀被鍨嬭漿鎹㈡椂錛夋垨鑰呮姏鍑哄紓甯革紙褰撳寮曠敤榪涜綾誨瀷杞崲鏃訛級錛?br />Widget *pw; ... update(dynamic_cast<SpecialWidget*>(pw)); // 姝g‘錛屼紶閫掔粰update鍑芥暟涓涓寚閽?br />// 鏄寚鍚戝彉閲忕被鍨嬩負SpecialWidget鐨刾w鐨勬寚閽?br />// 濡傛灉pw紜疄鎸囧悜涓涓璞? // 鍚﹀垯浼犻掕繃鍘葷殑灝嗕嬌絀烘寚閽堛?br />void updateViaRef(SpecialWidget& rsw); updateViaRef(dynamic_cast<SpecialWidget&>(*pw)); //姝g‘銆備紶閫掔粰updateViaRef鍑芥暟 // SpecialWidget pw 鎸囬拡錛屽鏋減w // 紜疄鎸囧悜浜嗘煇涓璞?br />// 鍚﹀垯灝嗘姏鍑哄紓甯?br />dynamic_casts鍦ㄥ府鍔╀綘嫻忚緇ф壙灞傛涓婃槸鏈夐檺鍒剁殑銆傚畠涓嶈兘琚敤浜庣己涔忚櫄鍑芥暟鐨勭被鍨嬩笂錛堝弬瑙佹潯嬈綧24錛夛紝涔熶笉鑳界敤瀹冩潵杞崲鎺塩onstness錛?br />int firstNumber, secondNumber; ... double result = dynamic_cast<double>(firstNumber)/secondNumber; // 閿欒錛佹病鏈夌戶鎵垮叧緋?br />const SpecialWidget sw; ... update(dynamic_cast<SpecialWidget*>(&sw)); // 閿欒! dynamic_cast涓嶈兘杞崲 // 鎺塩onst銆?br />濡備綘鎯沖湪娌℃湁緇ф壙鍏崇郴鐨勭被鍨嬩腑榪涜杞崲錛屼綘鍙兘鎯沖埌static_cast銆傚鏋滄槸涓轟簡鍘婚櫎const錛屼綘鎬誨緱鐢╟onst_cast銆?br />榪欏洓涓被鍨嬭漿鎹㈢涓殑鏈鍚庝竴涓槸reinterpret_cast銆備嬌鐢ㄨ繖涓搷浣滅鐨勭被鍨嬭漿鎹紝鍏剁殑杞崲緇撴灉鍑犱箮閮芥槸鎵ц鏈熷畾涔夛紙implementation-defined錛夈傚洜姝わ紝浣跨敤reinterpret_casts鐨勪唬鐮佸緢闅劇Щ妞嶃?br />reinterpret_casts鐨勬渶鏅氱殑鐢ㄩ斿氨鏄湪鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲銆備緥濡傦紝鍋囪浣犳湁涓涓嚱鏁版寚閽堟暟緇勶細 typedef void (*FuncPtr)(); // FuncPtr is 涓涓寚鍚戝嚱鏁?br />// 鐨勬寚閽堬紝璇ュ嚱鏁版病鏈夊弬鏁?br />// 榪斿洖鍊肩被鍨嬩負void FuncPtr funcPtrArray[10]; // funcPtrArray 鏄竴涓兘瀹圭撼 // 10涓狥uncPtrs鎸囬拡鐨勬暟緇?br />璁╂垜浠亣璁句綘甯屾湜錛堝洜涓烘煇浜涜帿鍚嶅叾濡欑殑鍘熷洜錛夋妸涓涓寚鍚戜笅闈㈠嚱鏁扮殑鎸囬拡瀛樺叆funcPtrArray鏁扮粍錛?br />int doSomething(); 浣犱笉鑳戒笉緇忚繃綾誨瀷杞崲鑰岀洿鎺ュ幓鍋氾紝鍥犱負doSomething鍑芥暟瀵逛簬funcPtrArray鏁扮粍鏉ヨ鏈変竴涓敊璇殑綾誨瀷銆傚湪FuncPtrArray鏁扮粍閲岀殑鍑芥暟榪斿洖鍊兼槸void綾誨瀷錛岃宒oSomething鍑芥暟榪斿洖鍊兼槸int綾誨瀷銆?br />funcPtrArray[0] = &doSomething; // 閿欒錛佺被鍨嬩笉鍖歸厤 reinterpret_cast鍙互璁╀綘榪嬌緙栬瘧鍣ㄤ互浣犵殑鏂規硶鍘葷湅寰呭畠浠細 funcPtrArray[0] = // this compiles reinterpret_cast<FuncPtr>(&doSomething); 杞崲鍑芥暟鎸囬拡鐨勪唬鐮佹槸涓嶅彲縐繪鐨勶紙C++涓嶄繚璇佹墍鏈夌殑鍑芥暟鎸囬拡閮借鐢ㄤ竴鏍風殑鏂規硶琛ㄧず錛夛紝鍦ㄤ竴浜涙儏鍐典笅榪欐牱鐨勮漿鎹細浜х敓涓嶆紜殑緇撴灉錛堝弬瑙佹潯嬈綧31錛夛紝鎵浠ヤ綘搴旇閬垮厤杞崲鍑芥暟鎸囬拡綾誨瀷錛岄櫎闈炰綘澶勪簬鐫鑳屾按涓鎴樺拰灝栧垁鏋跺枆鐨勫嵄鎬ユ椂鍒匯備竴鎶婇攱鍒╃殑鍒銆備竴鎶婇潪甯擱攱鍒╃殑鍒銆?br />濡傛灉浣犱嬌鐢ㄧ殑緙栬瘧鍣ㄧ己涔忓鏂扮殑綾誨瀷杞崲鏂瑰紡鐨勬敮鎸侊紝浣犲彲浠ョ敤浼犵粺鐨勭被鍨嬭漿鎹㈡柟娉曚唬鏇縮tatic_cast, const_cast, 浠ュ強reinterpret_cast銆備篃鍙互鐢ㄤ笅闈㈢殑瀹忔浛鎹㈡潵妯℃嫙鏂扮殑綾誨瀷杞崲璇硶錛?br />#define static_cast(TYPE,EXPR) ((TYPE)(EXPR)) #define const_cast(TYPE,EXPR) ((TYPE)(EXPR)) #define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR)) 浣犲彲浠ヨ薄榪欐牱浣跨敤浣跨敤錛?br />double result = static_cast(double, firstNumber)/secondNumber; update(const_cast(SpecialWidget*, &sw)); funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething); 榪欎簺妯℃嫙涓嶄細璞$湡瀹炵殑鎿嶄綔絎︿竴鏍峰畨鍏紝浣嗘槸褰撲綘鐨勭紪璇戝櫒鍙互鏀寔鏂扮殑鐨勭被鍨嬭漿鎹㈡椂錛屽畠浠彲浠ョ畝鍖栦綘鎶婁唬鐮佸崌綰х殑榪囩▼銆?br />娌℃湁涓涓鏄撶殑鏂規硶鏉ユā鎷焏ynamic_cast鐨勬搷浣滐紝浣嗘槸寰堝鍑芥暟搴撴彁渚涗簡鍑芥暟錛屽畨鍏ㄥ湴鍦ㄦ淳鐢熺被涓庡熀綾諱箣闂磋繘琛岀被鍨嬭漿鎹€傚鏋滀綘娌℃湁榪欎簺鍑芥暟鑰屼綘鏈夊繀欏昏繘琛岃繖鏍風殑綾誨瀷杞崲錛屼綘涔熷彲浠ュ洖鍒癈椋庢牸鐨勭被鍨嬭漿鎹㈡柟娉曚笂錛屼絾鏄繖鏍風殑璇濅綘灝嗕笉鑳借幏鐭ョ被鍨嬭漿鎹㈡槸鍚﹀け璐ャ傚綋鐒訛紝浣犱篃鍙互瀹氫箟涓涓畯鏉ユā鎷?dynamic_cast鐨勫姛鑳斤紝灝辮薄妯℃嫙鍏跺畠鐨勭被鍨嬭漿鎹竴鏍鳳細 #define dynamic_cast(TYPE,EXPR) (TYPE)(EXPR) 璇瘋浣忥紝榪欎釜妯℃嫙騫朵笉鑳藉畬鍏ㄥ疄鐜癲ynamic_cast鐨勫姛鑳斤紝瀹冩病鏈夊姙娉曠煡閬撹漿鎹㈡槸鍚﹀け璐ャ?br />鎴戠煡閬擄紝鏄殑錛屾垜鐭ラ亾錛屾柊鐨勭被鍨嬭漿鎹㈡搷浣滅涓嶆槸寰堢編瑙傝屼笖鐢ㄩ敭鐩橀敭鍏ヤ篃寰堥夯鐑︺傚鏋滀綘鍙戠幇瀹冧滑鐪嬩笂鍘誨疄鍦ㄤ護浜鴻鍘岋紝C椋庢牸鐨勭被鍨嬭漿鎹㈣繕鍙互緇х畫浣跨敤騫朵笖鍚堟硶銆傜劧鑰岋紝姝f槸鍥犱負鏂扮殑綾誨瀷杞崲絎︾己涔忕編鎰熸墠鑳戒嬌瀹冨譏琛ヤ簡鍦ㄥ惈涔夌簿紜у拰鍙鯨璁ゆт笂鐨勭己鐐廣傚茍涓旓紝浣跨敤鏂扮被鍨嬭漿鎹㈢鐨勭▼搴忔洿瀹規槗琚В鏋愶紙涓嶈鏄浜哄伐榪樻槸瀵逛簬宸ュ叿紼嬪簭錛夛紝瀹冧滑鍏佽緙栬瘧鍣ㄦ嫻嬪嚭鍘熸潵涓嶈兘鍙戠幇鐨勯敊璇傝繖浜涢兘鏄斁寮僀椋庢牸綾誨瀷杞崲鏂規硶鐨勫己鏈夊姏鐨勭悊鐢便傝繕鏈夌涓変釜鐞嗙敱錛氫篃璁歌綾誨瀷杞崲絎︿笉緹庤鍜岄敭鍏ラ夯鐑︽槸涓浠跺ソ浜嬨?
]]> C++闅忕瑪 涔?explicit 鍏抽敭瀛?杞澆) http://m.shnenglu.com/mumutou/archive/2007/01/16/17681.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Tue, 16 Jan 2007 05:21:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/16/17681.html http://m.shnenglu.com/mumutou/comments/17681.html http://m.shnenglu.com/mumutou/archive/2007/01/16/17681.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17681.html http://m.shnenglu.com/mumutou/services/trackbacks/17681.html explicit鍏抽敭瀛楃敤浜庡彇娑堟瀯閫犲嚱鏁扮殑闅愬紡杞崲錛屽鏈夊涓弬鏁扮殑鏋勯犲嚱鏁頒嬌鐢╡xplicit鏄釜璇硶閿欒銆?br />
In C++ it is possible to declare constructors for a class, taking a single parameter, and use those constructors for doing type conversion. For example:
class
聽A聽{
public
: 聽聽聽聽聽聽聽 A(
int
); };
void
聽f(A)聽{}
void
聽g() { 聽聽聽聽聽聽聽聽 A聽a1聽
=
聽
37
; 聽聽聽聽聽聽聽聽 A聽a2聽
=
聽A(
47
); 聽聽聽聽聽聽聽聽 A聽a3(
57
); 聽聽聽聽聽聽聽聽 a1聽
=
聽
67
; 聽聽聽聽聽聽聽聽 f(
77
); }
A declaration like: 聽A a1 = 37; says to call the A(int) constructor to create an A object from
the integer value. Such a constructor is called a "converting
constructor".
However, this type of implicit conversion can be confusing, and there is a way of disabling it, using a new keyword "explicit" in the constructor declaration:
class
聽A聽{
public
: 聽聽聽聽聽聽聽
explicit
聽A(
int
); };
void
聽f(A)聽{}
void
聽g() { 聽聽聽聽聽聽聽聽聽 A聽a1聽
=
聽
37
;聽聽聽聽聽聽
//
聽illegal
聽聽聽聽聽聽聽聽聽 A聽a2聽
=
聽A(
47
);聽聽聽
//
聽OK
聽聽聽聽聽聽聽聽聽 A聽a3(
57
);聽聽聽聽聽聽聽
//
聽OK
聽聽聽聽聽聽聽聽聽 a1聽
=
聽
67
;聽聽聽聽聽聽聽聽
//
聽illegal
聽聽聽聽聽聽聽聽聽 f(
77
);聽聽聽聽聽聽聽聽聽聽
//
聽illegal
}
Using the explicit keyword, a constructor is declared to be "nonconverting", and explicit constructor syntax is required:
class
聽A聽{
public
: 聽聽聽聽聽聽聽聽
explicit
聽A(
int
); 聽聽聽聽聽聽聽聽};
void
聽f(A)聽{}
void
聽g() { 聽聽聽聽聽聽聽聽A聽a1聽
=
聽A(
37
); 聽聽聽聽聽聽聽聽A聽a2聽
=
聽A(
47
); 聽聽聽聽聽聽聽聽A聽a3(
57
); 聽聽聽聽聽聽聽聽a1聽
=
聽A(
67
); 聽聽聽聽聽聽聽聽f(A(
77
)); }
Note that an expression such as:
A(47)
is closely related to function-style casts supported by C++. For example:
double d = 12.34; int i = int(d);
]]> C++闅忕瑪 涔?鏂囦歡鎿嶄綔(杞澆) http://m.shnenglu.com/mumutou/archive/2007/01/16/17680.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Tue, 16 Jan 2007 05:18:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/16/17680.html http://m.shnenglu.com/mumutou/comments/17680.html http://m.shnenglu.com/mumutou/archive/2007/01/16/17680.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17680.html http://m.shnenglu.com/mumutou/services/trackbacks/17680.html
C++鏂囦歡鎿嶄綔
聽鍘熸枃鍦板潃錛歨ttp://www.layz.net/blog/user1/xuanxuan/archives/2006/67.html 聽鍦–++涓紝鏈変竴涓猻tream榪欎釜綾伙紝鎵鏈夌殑I/O閮戒互榪欎釜鈥滄祦鈥濈被涓哄熀紜鐨勶紝鍖呮嫭鎴戜滑瑕佽璇嗙殑鏂囦歡I/O錛宻tream榪欎釜綾繪湁涓や釜閲嶈鐨勮繍綆楃錛? 1銆佹彃鍏ュ櫒(<<) 銆銆鍚戞祦杈撳嚭鏁版嵁銆傛瘮濡傝緋葷粺鏈変竴涓粯璁ょ殑鏍囧噯杈撳嚭嫻?cout)錛屼竴鑸儏鍐典笅灝辨槸鎸囩殑鏄劇ず鍣紝鎵浠ワ紝cout<<"Write Stdout"<<'\n';灝辮〃紺烘妸瀛楃涓?Write Stdout"鍜屾崲琛屽瓧絎?'\n')杈撳嚭鍒版爣鍑嗚緭鍑烘祦銆? 2銆佹瀽鍙栧櫒(>>) 銆銆浠庢祦涓緭鍏ユ暟鎹傛瘮濡傝緋葷粺鏈変竴涓粯璁ょ殑鏍囧噯杈撳叆嫻?cin)錛屼竴鑸儏鍐典笅灝辨槸鎸囩殑閿洏錛屾墍浠ワ紝cin>>x;灝辮〃紺轟粠鏍囧噯杈撳叆嫻佷腑璇誨彇涓涓寚瀹氱被鍨?鍗沖彉閲弜鐨勭被鍨?鐨勬暟鎹? 銆銆鍦–++涓紝瀵規枃浠剁殑鎿嶄綔鏄氳繃stream鐨勫瓙綾籪stream(file stream)鏉ュ疄鐜扮殑錛屾墍浠ワ紝瑕佺敤榪欑鏂瑰紡鎿嶄綔鏂囦歡錛屽氨蹇呴』鍔犲叆澶存枃浠秄stream.h銆備笅闈㈠氨鎶婃綾葷殑鏂囦歡鎿嶄綔榪囩▼涓涓閬撴潵銆? 涓銆佹墦寮鏂囦歡 銆銆鍦╢stream綾諱腑錛屾湁涓涓垚鍛樺嚱鏁皁pen()錛屽氨鏄敤鏉ユ墦寮鏂囦歡鐨勶紝鍏跺師鍨嬫槸錛? void open(const char* filename,int mode,int access); 鍙傛暟錛? filename錛氥銆瑕佹墦寮鐨勬枃浠跺悕 mode錛氥銆銆銆瑕佹墦寮鏂囦歡鐨勬柟寮? access錛氥銆銆鎵撳紑鏂囦歡鐨勫睘鎬? 鎵撳紑鏂囦歡鐨勬柟寮忓湪綾籭os(鏄墍鏈夋祦寮廔/O綾葷殑鍩虹被)涓畾涔夛紝甯哥敤鐨勫煎涓嬶細 ios::app錛氥銆銆浠ヨ拷鍔犵殑鏂瑰紡鎵撳紑鏂囦歡 ios::ate錛氥銆銆鏂囦歡鎵撳紑鍚庡畾浣嶅埌鏂囦歡灝撅紝ios:app灝卞寘鍚湁姝ゅ睘鎬? ios::binary錛?銆浠ヤ簩榪涘埗鏂瑰紡鎵撳紑鏂囦歡錛岀己鐪佺殑鏂瑰紡鏄枃鏈柟寮忋備袱縐嶆柟寮忕殑鍖哄埆瑙佸墠鏂? ios::in錛氥銆銆 鏂囦歡浠ヨ緭鍏ユ柟寮忔墦寮 ios::out錛氥銆銆鏂囦歡浠ヨ緭鍑烘柟寮忔墦寮 ios::nocreate錛?涓嶅緩绔嬫枃浠訛紝鎵浠ユ枃浠朵笉瀛樺湪鏃舵墦寮澶辮觸銆 ios::noreplace錛氫笉瑕嗙洊鏂囦歡錛屾墍浠ユ墦寮鏂囦歡鏃跺鏋滄枃浠跺瓨鍦ㄥけ璐? ios::trunc錛氥銆濡傛灉鏂囦歡瀛樺湪錛屾妸鏂囦歡闀垮害璁句負0 銆銆鍙互鐢ㄢ滄垨鈥濇妸浠ヤ笂灞炴ц繛鎺ヨ搗鏉ワ紝濡俰os::out|ios::binary 銆銆鎵撳紑鏂囦歡鐨勫睘鎬у彇鍊兼槸錛? 0錛氭櫘閫氭枃浠訛紝鎵撳紑璁塊棶 1錛氬彧璇繪枃浠? 2錛氶殣鍚枃浠? 4錛氱郴緇熸枃浠? 銆銆鍙互鐢ㄢ滄垨鈥濇垨鑰呪?鈥濇妸浠ヤ笂灞炴ц繛鎺ヨ搗鏉?錛屽3鎴?|2灝辨槸浠ュ彧璇誨拰闅愬惈灞炴ф墦寮鏂囦歡銆? 銆銆渚嬪錛氫互浜岃繘鍒惰緭鍏ユ柟寮忔墦寮鏂囦歡c:\config.sys 銆銆fstream file1; 銆銆file1.open("c:\\config.sys",ios::binary|ios::in,0); 銆銆濡傛灉open鍑芥暟鍙湁鏂囦歡鍚嶄竴涓弬鏁幫紝鍒欐槸浠ヨ/鍐欐櫘閫氭枃浠舵墦寮錛屽嵆錛? 銆銆file1.open("c:\\config.sys");<=>file1.open("c:\\config.sys",ios::in|ios::out,0); 銆銆鍙﹀錛宖stream榪樻湁鍜宱pen()涓鏍風殑鏋勯犲嚱鏁幫紝瀵逛簬涓婁緥錛屽湪瀹氫箟鐨勬椂渚氨鍙互鎵撳紑鏂囦歡浜嗭細 銆銆fstream file1("c:\\config.sys"); 銆銆鐗瑰埆鎻愬嚭鐨勬槸錛宖stream鏈変袱涓瓙綾伙細ifstream(input file stream)鍜宱fstream(outpu file stream)錛宨fstream榛樿浠ヨ緭鍏ユ柟寮忔墦寮鏂囦歡錛岃宱fstream榛樿浠ヨ緭鍑烘柟寮忔墦寮鏂囦歡銆? 銆銆ifstream file2("c:\\pdos.def");//浠ヨ緭鍏ユ柟寮忔墦寮鏂囦歡 銆銆ofstream file3("c:\\x.123");//浠ヨ緭鍑烘柟寮忔墦寮鏂囦歡 銆銆鎵浠ワ紝鍦ㄥ疄闄呭簲鐢ㄤ腑錛屾牴鎹渶瑕佺殑涓嶅悓錛岄夋嫨涓嶅悓鐨勭被鏉ュ畾涔夛細濡傛灉鎯充互杈撳叆鏂瑰紡鎵撳紑錛屽氨鐢╥fstream鏉ュ畾涔夛紱濡傛灉鎯充互杈撳嚭鏂瑰紡鎵撳紑錛屽氨鐢╫fstream鏉ュ畾涔夛紱濡傛灉鎯充互杈撳叆/杈撳嚭鏂瑰紡鏉ユ墦寮錛屽氨鐢╢stream鏉ュ畾涔夈? 浜屻佸叧闂枃浠? 銆銆鎵撳紑鐨勬枃浠朵嬌鐢ㄥ畬鎴愬悗涓瀹氳鍏抽棴錛宖stream鎻愪緵浜嗘垚鍛樺嚱鏁癱lose()鏉ュ畬鎴愭鎿嶄綔錛屽錛歠ile1.close();灝辨妸file1鐩歌繛鐨勬枃浠跺叧闂? 涓夈佽鍐欐枃浠? 銆銆璇誨啓鏂囦歡鍒嗕負鏂囨湰鏂囦歡鍜屼簩榪涘埗鏂囦歡鐨勮鍙栵紝瀵逛簬鏂囨湰鏂囦歡鐨勮鍙栨瘮杈冪畝鍗曪紝鐢ㄦ彃鍏ュ櫒鍜屾瀽鍙栧櫒灝卞彲浠ヤ簡錛涜屽浜庝簩榪涘埗鐨勮鍙栧氨瑕佸鏉備簺錛屼笅瑕佸氨璇︾粏鐨勪粙緇嶈繖涓ょ鏂瑰紡 銆銆1銆佹枃鏈枃浠剁殑璇誨啓 銆銆鏂囨湰鏂囦歡鐨勮鍐欏緢綆鍗曪細鐢ㄦ彃鍏ュ櫒(<<)鍚戞枃浠惰緭鍑猴紱鐢ㄦ瀽鍙栧櫒(>>)浠庢枃浠惰緭鍏ャ傚亣璁緁ile1鏄互杈撳叆鏂瑰紡鎵撳紑錛宖ile2浠ヨ緭鍑烘墦寮銆傜ず渚嬪涓嬶細 銆銆file2<<"I Love You";//鍚戞枃浠跺啓鍏ュ瓧絎︿覆"I Love You" 銆銆int i; 銆銆file1>>i;//浠庢枃浠惰緭鍏ヤ竴涓暣鏁板箋? 銆銆榪欑鏂瑰紡榪樻湁涓縐嶇畝鍗曠殑鏍煎紡鍖栬兘鍔涳紝姣斿鍙互鎸囧畾杈撳嚭涓?6榪涘埗絳夌瓑錛屽叿浣撶殑鏍煎紡鏈変互涓嬩竴浜? 鎿嶇旱絎?鍔熻兘 杈撳叆/杈撳嚭 dec 鏍煎紡鍖栦負鍗佽繘鍒舵暟鍊兼暟鎹?杈撳叆鍜岃緭鍑? endl 杈撳嚭涓涓崲琛岀騫跺埛鏂版嫻?杈撳嚭 ends 杈撳嚭涓涓┖瀛楃 杈撳嚭 hex 鏍煎紡鍖栦負鍗佸叚榪涘埗鏁板兼暟鎹?杈撳叆鍜岃緭鍑? oct 鏍煎紡鍖栦負鍏繘鍒舵暟鍊兼暟鎹?杈撳叆鍜岃緭鍑? setpxecision(int p) 璁劇疆嫻偣鏁扮殑綺懼害浣嶆暟 杈撳嚭 銆銆姣斿瑕佹妸123褰撲綔鍗佸叚榪涘埗杈撳嚭錛歠ile1<<<123;瑕佹妸3.1415926浠?浣嶇簿搴﹁緭鍑猴細FILE1<<<3.1415926銆? 銆銆2銆佷簩榪涘埗鏂囦歡鐨勮鍐? 鈶爌ut() 銆銆put()鍑芥暟鍚戞祦鍐欏叆涓涓瓧絎︼紝鍏跺師鍨嬫槸ofstream &put(char ch)錛屼嬌鐢ㄤ篃姣旇緝綆鍗曪紝濡俧ile1.put('c');灝辨槸鍚戞祦鍐欎竴涓瓧絎?c'銆? 鈶et() 銆銆get()鍑芥暟姣旇緝鐏墊椿錛屾湁3縐嶅父鐢ㄧ殑閲嶈澆褰㈠紡錛? 銆銆涓縐嶅氨鏄拰put()瀵瑰簲鐨勫艦寮忥細ifstream &get(char &ch);鍔熻兘鏄粠嫻佷腑璇誨彇涓涓瓧絎︼紝緇撴灉淇濆瓨鍦ㄥ紩鐢╟h涓紝濡傛灉鍒版枃浠跺熬錛岃繑鍥炵┖瀛楃銆傚file2.get(x);琛ㄧず浠庢枃浠朵腑璇誨彇涓涓瓧絎︼紝騫舵妸璇誨彇鐨勫瓧絎︿繚瀛樺湪x涓? 銆銆鍙︿竴縐嶉噸杞藉艦寮忕殑鍘熷瀷鏄細 int get();榪欑褰㈠紡鏄粠嫻佷腑榪斿洖涓涓瓧絎︼紝濡傛灉鍒拌揪鏂囦歡灝撅紝榪斿洖EOF錛屽x=file2.get();鍜屼笂渚嬪姛鑳芥槸涓鏍風殑銆? 銆銆榪樻湁涓縐嶅艦寮忕殑鍘熷瀷鏄細ifstream &get(char *buf,int num,char delim='\n')錛涜繖縐嶅艦寮忔妸瀛楃璇誨叆鐢?buf 鎸囧悜鐨勬暟緇勶紝鐩村埌璇誨叆浜?num 涓瓧絎︽垨閬囧埌浜嗙敱 delim 鎸囧畾鐨勫瓧絎︼紝濡傛灉娌′嬌鐢?delim 榪欎釜鍙傛暟錛屽皢浣跨敤緙虹渷鍊兼崲琛岀'\n'銆備緥濡傦細 銆銆file2.get(str1,127,'A');//浠庢枃浠朵腑璇誨彇瀛楃鍒板瓧絎︿覆str1錛屽綋閬囧埌瀛楃'A'鎴栬鍙栦簡127涓瓧絎︽椂緇堟銆? 鈶㈣鍐欐暟鎹潡 銆銆瑕佽鍐欎簩榪涘埗鏁版嵁鍧楋紝浣跨敤鎴愬憳鍑芥暟read()鍜寃rite()鎴愬憳鍑芥暟錛屽畠浠師鍨嬪涓嬶細 銆銆銆銆read(unsigned char *buf,int num); 銆銆銆銆write(const unsigned char *buf,int num); 銆銆read()浠庢枃浠朵腑璇誨彇 num 涓瓧絎﹀埌 buf 鎸囧悜鐨勭紦瀛樹腑錛屽鏋滃湪榪樻湭璇誨叆 num 涓瓧絎︽椂灝卞埌浜嗘枃浠跺熬錛屽彲浠ョ敤鎴愬憳鍑芥暟 int gcount();鏉ュ彇寰楀疄闄呰鍙栫殑瀛楃鏁幫紱鑰?write() 浠巄uf 鎸囧悜鐨勭紦瀛樺啓 num 涓瓧絎﹀埌鏂囦歡涓紝鍊煎緱娉ㄦ剰鐨勬槸緙撳瓨鐨勭被鍨嬫槸 unsigned char *錛屾湁鏃跺彲鑳介渶瑕佺被鍨嬭漿鎹€? 渚嬶細 銆銆銆銆unsigned char str1[]="I Love You"; 銆銆銆銆int n[5]; 銆銆銆銆ifstream in("xxx.xxx"); 銆銆銆銆ofstream out("yyy.yyy"); 銆銆銆銆out.write(str1,strlen(str1));//鎶婂瓧絎︿覆str1鍏ㄩ儴鍐欏埌yyy.yyy涓? 銆銆銆銆in.read((unsigned char*)n,sizeof(n));//浠巟xx.xxx涓鍙栨寚瀹氫釜鏁存暟錛屾敞鎰忕被鍨嬭漿鎹? 銆銆銆銆in.close();out.close(); 鍥涖佹嫻婨OF 銆銆鎴愬憳鍑芥暟eof()鐢ㄦ潵媯嫻嬫槸鍚﹀埌杈炬枃浠跺熬錛屽鏋滃埌杈炬枃浠跺熬榪斿洖闈?鍊鹼紝鍚﹀垯榪斿洖0銆傚師鍨嬫槸int eof(); 渚嬶細銆銆if(in.eof())ShowMessage("宸茬粡鍒拌揪鏂囦歡灝撅紒"); 浜斻佹枃浠跺畾浣? 銆銆鍜孋鐨勬枃浠舵搷浣滄柟寮忎笉鍚岀殑鏄紝C++ I/O緋葷粺綆$悊涓や釜涓庝竴涓枃浠剁浉鑱旂郴鐨勬寚閽堛備竴涓槸璇繪寚閽堬紝瀹冭鏄庤緭鍏ユ搷浣滃湪鏂囦歡涓殑浣嶇疆錛涘彟涓涓槸鍐欐寚閽堬紝瀹冧笅嬈″啓鎿嶄綔鐨勪綅緗傛瘡嬈℃墽琛岃緭鍏ユ垨杈撳嚭鏃訛紝鐩稿簲鐨勬寚閽堣嚜鍔ㄥ彉鍖栥傛墍浠ワ紝C++鐨勬枃浠跺畾浣嶅垎涓鴻浣嶇疆鍜屽啓浣嶇疆鐨勫畾浣嶏紝瀵瑰簲鐨勬垚鍛樺嚱鏁版槸 seekg()鍜?seekp()錛宻eekg()鏄緗浣嶇疆錛宻eekp鏄緗啓浣嶇疆銆傚畠浠渶閫氱敤鐨勫艦寮忓涓嬶細 銆銆銆銆istream &seekg(streamoff offset,seek_dir origin); 銆銆銆銆ostream &seekp(streamoff offset,seek_dir origin); 銆銆streamoff瀹氫箟浜?iostream.h 涓紝瀹氫箟鏈夊亸縐婚噺 offset 鎵鑳藉彇寰楃殑鏈澶у鹼紝seek_dir 琛ㄧず縐誨姩鐨勫熀鍑嗕綅緗紝鏄竴涓湁浠ヤ笅鍊肩殑鏋氫婦錛? ios::beg錛氥銆鏂囦歡寮澶? ios::cur錛氥銆鏂囦歡褰撳墠浣嶇疆 ios::end錛氥銆鏂囦歡緇撳熬 銆銆榪欎袱涓嚱鏁頒竴鑸敤浜庝簩榪涘埗鏂囦歡錛屽洜涓烘枃鏈枃浠朵細鍥犱負緋葷粺瀵瑰瓧絎︾殑瑙i噴鑰屽彲鑳戒笌棰勬兂鐨勫間笉鍚屻? 渚嬶細 銆銆銆銆 file1.seekg(1234,ios::cur);//鎶婃枃浠剁殑璇繪寚閽堜粠褰撳墠浣嶇疆鍚戝悗縐?234涓瓧鑺? 銆銆銆銆 file2.seekp(1234,ios::beg);//鎶婃枃浠剁殑鍐欐寚閽堜粠鏂囦歡寮澶村悜鍚庣Щ1234涓瓧鑺?/setpxecision(5)>
]]> C++闅忕瑪 涔?鍑芥暟妯℃澘(Function Template)1 (鍘熷垱) http://m.shnenglu.com/mumutou/archive/2007/01/10/17497.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Wed, 10 Jan 2007 06:36:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/10/17497.html http://m.shnenglu.com/mumutou/comments/17497.html http://m.shnenglu.com/mumutou/archive/2007/01/10/17497.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17497.html http://m.shnenglu.com/mumutou/services/trackbacks/17497.html 1.Function Template鍙互閽堝涓嶅悓鐨凾emplate arguments瀹屾垚涓涓郴鍒楃殑鍑芥暟 渚嬪 template<typename T> inline T const & max(T const &a,T const &b) { 聽聽聽return聽聽聽a>b?a:b; } 2.Function template鍙互浠庝紶閫掕繃鏉ョ殑arguments鐨勭被鍨嬫潵鍏蜂綋鍖?br />int a = ::max(10,20); 閭d箞Function template 灝卞叿浣撳寲涓?br />inline int const& max(int const &a,int const & b) 3.浣犲彲浠ュ叿浣撴寚鍑哄畠鐨勫弬鏁扮被鍨?br />int a = ::max<int>(10,20); 4.Function template鍙互琚噸杞給verloaded inline T const& max(T const &a,T const &b,T const &c) { 聽聽聽return ::max(::max(a,b),c); } 褰撶劧璁頒綇涓鐐癸紝閲嶈澆鐨勭浉浼肩偣瓚婂皬瓚婂ソ
]]> C++闅忕瑪 涔?鍏充簬C++涓殑鎸囬拡闂 http://m.shnenglu.com/mumutou/archive/2007/01/09/17458.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Tue, 09 Jan 2007 05:48:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/09/17458.html http://m.shnenglu.com/mumutou/comments/17458.html http://m.shnenglu.com/mumutou/archive/2007/01/09/17458.html#Feedback 1 http://m.shnenglu.com/mumutou/comments/commentRss/17458.html http://m.shnenglu.com/mumutou/services/trackbacks/17458.html
鍘熸枃鍑哄
http://community.csdn.net/Expert/topic/5279/5279199.xml?temp=.2457392
鍦ㄦ枃绔犱腑澶у鍦ㄨ璁轟竴涓棶棰? 濡傛灉娌℃湁瀛樺偍涓婃病鏈夊尯鍒殑璇?璇風湅涓嬩緥錛?br />float a=3.45; int * p1=&a; float * p2=&a; cout<<"p1"<<"=>"<<*p1<<endl; cout<<"p2"<<"=>"<<*p2<<endl;
緇撴灉鏄細 p1=>1107951616 p2=>3.45
涔︿笂鐨勮В閲婃槸錛歱1灝界涓巔2鐨勫湴鍧鐩稿悓錛屼絾瀹冩槸鏁村瀷鎸囬拡錛屽畠鎬繪槸璁塊棶璇ュ湴鍧涓殑鏁村瀷鏁般?br />棣栧厛鍦?2浣岰PU涓婇潰,鎸囬拡閮芥槸4浣嶇殑,渚嬪0xXX XX XX XX 閭d箞鏃㈢劧鎸囬拡鏄竴鏍風殑,閭d箞涓轟粈涔堟寚閽堢被鍨嬩笉鍚岀殑璇?璇誨嚭鏉ョ殑鏁版嵁灝卞彉浜嗘牱鍛? 榪欐槸緙栬瘧鍣ㄧ殑闂,渚嬪鎴戞湁涓緥瀛?br /> char *p = 'c'; int *p1 = 10; 鍦?2浣嶆満鍣ㄤ笂闈?br />榪欓噷闈1鏄寚鍚?瀛楄妭鐨刬nt鍙橀噺,鑰宲鏄寚鍚?瀛楄妭鐨刢har 鍙橀噺 榪欐牱緙栬瘧鍣ㄥ湪鐢╬1鍙橀噺鐨勬椂鍊?浼氬彇0x XX XX XX XX鍚庨潰鐨?涓瓧鑺?br />鑰宲鍙橀噺,鍙細鍙?x XX XX XX XX鍚庨潰鐨?涓瓧鑺?br /> 鍥犱負鏈漢鐜板湪鍦ㄧ綉鍚ч噷闈涓嶇煡閬撳ぇ瀹舵湁娌℃湁鍦ㄧ綉鍚ч噷闈㈢鍒拌鏈塩++緙栬瘧鍣ㄧ殑璁$畻鏈篯 鏅氫笂鎴戠粰澶у涓涓緥瀛?鍙互浠庡叾鍐呭瓨涓婇潰鐪嬬殑寰堟竻妤?/font>
]]> C++闅忕瑪 涔?娉涘瀷緙栫▼涓庤璁℃柊鎬濈淮(杞澆) http://m.shnenglu.com/mumutou/archive/2007/01/04/17238.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Thu, 04 Jan 2007 07:07:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/04/17238.html http://m.shnenglu.com/mumutou/comments/17238.html http://m.shnenglu.com/mumutou/archive/2007/01/04/17238.html#Feedback 0 http://m.shnenglu.com/mumutou/comments/commentRss/17238.html http://m.shnenglu.com/mumutou/services/trackbacks/17238.html 聽聽浣滆咃細寰愭櫙鍛?br /> 聽聽聽姘歌繙璁頒綇錛岀紪鍐欎唬鐮佺殑瀹楁棬鍦ㄤ簬綆鍗曟槑浜嗭紝涓嶈浣跨敤璇█涓殑鍐峰兓鐗規э紝鑰嶅皬鑱槑錛岄噸瑕佺殑鏄紪鍐欎綘鐞嗚В鐨勪唬鐮侊紝鐞嗚В浣犵紪鍐欑殑浠g爜錛岃繖鏍蜂綘鍙兘浼氬仛鐨勬洿濂姐?
--- Herb Sutter
聽聽聽 1998騫達紝鍥介檯C++鏍囧噯姝e紡閫氳繃錛屾爣鍑嗗寲瀵笴++鏈閲嶈鐨勮礎鐚槸錛氬"寮哄ぇ鐨勬娊璞℃蹇?緇欎簬鏇存湁鍔涚殑鏀寔錛屼互闄嶄綆杞歡鐨勫鏉傚害錛孋++鎻愪緵浜嗕簩縐嶅姛鑳藉己澶х殑鎶借薄鏂規硶錛氶潰鍚戝璞$紪紼嬩笌娉涘瀷緙栫▼銆傞潰鍚戝璞$紪紼嬪ぇ瀹朵竴瀹氬緢鐔熸倝浜嗭紝榪欓噷灝變笉鍐嶅搯鍡︿簡銆傛彁鍒版硾鍨嬬紪紼?Generic Programming)錛屾湁鐨勪漢鍙兘榪樹笉澶啛鎮夛紝浣嗘槸鎻愬埌STL錛屼綘灝變竴瀹氫細鏈夋墍鑰抽椈浜嗐係TL(Standard Template Library錛屾爣鍑嗘ā鏉垮簱) 鍏跺疄灝辨槸娉涘瀷緙栫▼鐨勫疄鐜板搧錛孲TL鏄敱Alexander Stepanov(STL涔嬬埗)銆丏avid R Musser鍜孧eng Lee涓変綅澶у笀鍏卞悓鍙戝睍錛屼簬1994騫磋綰沖叆C++鏍囧噯紼嬪簭搴撱係TL铏界劧鍔犲叆C++鏍囧噯搴撶殑鏃墮棿鐩稿杈冩櫄錛屼絾瀹冨嵈鏄疌++鏍囧噯紼嬪簭搴撲腑鏈鍏烽潻鍛芥х殑閮ㄥ垎錛屽悓鏃朵篃鏄疌++鏍囧噯紼嬪簭搴撲腑鏈閲嶈鐨勭粍鎴愰儴鍒嗐傜敱浜庢柊鐨凜++鏍囧噯搴撲腑鍑犱箮姣忎竴鏍蜂笢瑗塊兘鏄敱妯℃澘(Template)鏋勬垚鐨勶紝褰撶劧錛孲TL涔熶笉浼氫緥澶栥傛墍浠ワ紝鍦ㄨ繖閲屾湁蹇呰鍏堟瑕佽鏄庝竴涓嬫ā鏉跨殑鏈夊叧姒傚康銆? 妯℃澘姒傚康 聽聽聽 閫氳繃浣跨敤妯℃澘鍙互浣跨▼搴忓叿鏈夋洿濂界殑浠g爜閲嶇敤鎬с傝浣忥紝妯℃澘鏄婧愪唬鐮佽繘琛岄噸鐢紝鑰屼笉鏄氳繃緇ф壙鍜岀粍鍚堥噸鐢ㄥ璞′唬鐮侊紝褰撶敤鎴蜂嬌鐢ㄦā鏉挎椂錛屽弬鏁扮敱緙栬瘧鍣ㄦ潵鏇挎崲銆傛ā鏉跨敱綾繪ā鏉垮拰鍑芥暟妯℃澘浜岄儴鍒嗙粍鎴愶紝浠ユ墍澶勭悊鐨勬暟鎹被鍨嬬殑璇存槑浣滀負鍙傛暟鐨勭被灝卞彨綾繪ā鏉匡紝鑰屼互鎵澶勭悊鐨勬暟鎹被鍨嬬殑璇存槑浣滀負鍙傛暟鐨勫嚱鏁板彨鍋氬嚱鏁版ā鏉褲傛ā鏉垮弬鏁板彲浠ョ敱綾誨瀷鍙傛暟鎴栭潪綾誨瀷鍙傛暟緇勬垚錛岀被鍨嬪弬鏁板彲鐢╟lass鍜宼ypename鍏抽敭瀛楁潵鎸囨槑錛屼簩鑰呯殑鎰忎箟鐩稿悓錛岄兘琛ㄧず鍚庨潰鐨勫弬鏁板悕浠h〃涓涓綔鍦ㄧ殑鍐呯疆鎴栫敤鎴峰畾涔夌殑綾誨瀷錛岄潪綾誨瀷鍙傛暟鐢變竴涓櫘閫氬弬鏁板0鏄庢瀯鎴愩備笅闈㈡槸綾繪ā鏉垮拰鍑芥暟妯℃澘鐨勭畝鍗曠敤娉曪細 template<class T1, int Size> class Queue // 綾繪ā鏉匡紝鍏朵腑T1涓虹被鍨嬪弬鏁幫紝Size涓洪潪綾誨瀷鍙傛暟 { public: explicit Queue():size_(Size){}; // 鏄懼紡鏋勯狅紝閬垮厤闅愬紡杞崲 鈥︹?template<class T2> void assign(T2 first,T2 last); // 鍐呭祵鍑芥暟妯℃澘 private: T* temp_; int size_; } // 綾繪ā鏉夸腑鍐呭祵鍑芥暟妯℃澘Compare鐨勫鍥村疄鐜?濡傚湪Queue綾誨瀹炵幇) template<class T1,int Size> template<class T2> void Queue<T1,Size>::assign (T2 first,T2 last) {}; // 妯℃澘鐨勪嬌鐢ㄦ柟娉?int ia[4] = {0,1,2,3}; Queue<int, sizeof(ia)/sizeof(int)> qi; qi.assign(ai,ai+4); 娉涘瀷緙栫▼ 聽聽聽 娉涘瀷緙栫▼鍜岄潰鍚戝璞$紪紼嬩笉鍚岋紝瀹冨茍涓嶈姹備綘閫氳繃棰濆鐨勯棿鎺ュ眰鏉ヨ皟鐢ㄥ嚱鏁幫紝瀹冭浣犵紪鍐欏畬鍏ㄤ竴鑸寲騫跺彲閲嶅浣跨敤鐨勭畻娉曪紝鍏舵晥鐜囦笌閽堝鏌愮壒瀹氭暟鎹被鍨嬭岃璁$殑綆楁硶鐩稿悓銆傛硾鍨嬬紪紼嬬殑浠h〃浣滃搧STL鏄竴縐嶉珮鏁堛佹硾鍨嬨佸彲浜や簰鎿嶄綔鐨勮蔣浠剁粍浠躲傛墍璋撴硾鍨?Genericity)錛屾槸鎸囧叿鏈夊湪澶氱鏁版嵁綾誨瀷涓婄殕鍙搷浣滅殑鍚剰錛屼笌妯℃澘鏈変簺鐩鎬技銆係TL宸ㄥぇ錛岃屼笖鍙互鎵╁厖錛屽畠鍖呭惈寰堝璁$畻鏈哄熀鏈畻娉曞拰鏁版嵁緇撴瀯錛岃屼笖灝嗙畻娉曚笌鏁版嵁緇撴瀯瀹屽叏鍒嗙錛屽叾涓畻娉曟槸娉涘瀷鐨勶紝涓嶄笌浠諱綍鐗瑰畾鏁版嵁緇撴瀯鎴栧璞$被鍨嬬郴鍦ㄤ竴璧楓係TL浠ヨ凱浠e櫒(Iterators)鍜屽鍣?Containers)涓哄熀紜錛屾槸涓縐嶆硾鍨嬬畻娉?Generic Algorithms)搴擄紝瀹瑰櫒鐨勫瓨鍦ㄤ嬌榪欎簺綆楁硶鏈変笢瑗垮彲浠ユ搷浣溿係TL鍖呭惈鍚勭娉涘瀷綆楁硶(algorithms)銆佹硾鍨嬫寚閽?iterators)銆佹硾鍨嬪鍣?containers)浠ュ強鍑芥暟瀵硅薄(function objects)銆係TL騫墮潪鍙槸涓浜涙湁鐢ㄧ粍浠剁殑闆嗗悎錛屽畠鏄弿榪拌蔣浠剁粍浠舵娊璞¢渶姹傛潯浠剁殑涓涓瑙勮屾湁鏉$悊鐨勬灦鏋勩? 聽聽聽 榪唬鍣?Iterators)鏄疭TL鐨勬牳蹇冿紝瀹冧滑鏄硾鍨嬫寚閽堬紝鏄竴縐嶆寚鍚戝叾浠栧璞?objects)鐨勫璞★紝榪唬鍣ㄨ兘澶熼亶鍘嗙敱瀵硅薄鎵褰㈡垚鐨勫尯闂?range)銆傝凱浠e櫒璁╂垜浠緱浠ュ皢瀹瑰櫒(containers)涓庝綔鐢ㄥ叾涓婄殑綆楁硶(algorithms)鍒嗙錛屽ぇ澶氭暟鐨勭畻娉曡嚜韜茍涓嶇洿鎺ユ搷浣滀簬瀹瑰櫒涓婏紝鑰屾槸鎿嶄綔浜庤凱浠e櫒鎵褰㈡垚鐨勫尯闂翠腑銆傝凱浠e櫒涓鑸垎涓轟簲縐嶏細Input Iterator銆丱utput Iterator銆丗orward Iterator銆丅idirections Iterator鍜孯andom Access Iterator銆侷nput Iterator灝辮薄鍙粠杈撳叆鍖洪棿涓鍙栨暟鎹竴鏍鳳紝鍏鋒湁鍙鎬э紝灞炰簬鍗曞悜縐誨姩錛屽STL涓殑istream_iterator銆侽utput Iterator鍒氬ソ鐩稿弽錛屽彧鍐欏嚭鏁版嵁鍒拌緭鍑哄尯闂翠腑錛屽叿鏈夊彧鍐欐э紝灞炰簬鍗曞悜縐誨姩錛屽STL涓殑ostream_iterator銆侳orward Iterator涔熷睘浜庡崟鍚戠Щ鍔紝浣嗕笉鍚屼箣澶勬槸瀹冨悓鏃跺叿鏈夋暟鎹銆佸啓鎬с侭idirections Iterator濡傚悕縐版殫紺猴紝鏀寔鍙屽悜縐誨姩錛屼笉浣嗗彲浠ョ瘡鍔?++)鍙栧緱涓嬩竴涓厓绱狅紝鑰屼笖鍙互閫掑噺(--)鍙栧墠涓涓厓绱狅紝鏀寔璇匯佸啓鎬с俁andom Access Iterator鍔熻兘鏈寮猴紝闄や簡浠ヤ笂鍚勮凱浠e櫒鐨勫姛鑳藉錛岃繕鏀寔闅忔満鍏冪礌璁塊棶(p+=n)錛屼笅鏍?p[n])銆佺浉鍑?p1-p2)鍙婂墠鍚庢搴忓叧緋?p1<p2)絳夈侷nput Iterator鍜孫utput Iterator灞炰簬鍚岀瓑鏈寮辯殑浜岀榪唬鍣紝Forward Iterator鏄墠浜岃呭姛鑳界殑寮哄寲(refinement)錛孊idirections Iterator鍙堟槸Forward Iterator榪唬鍣ㄧ殑寮哄寲錛屾渶鍚嶳andom Access Iterator鍙堟槸Bidirections Iterator榪唬鍣ㄧ殑寮哄寲銆傚涓嬬畝鍗曠ず渚嬪睍紺篒nput Iterator銆丗orward Iterator銆丅idirections Iterator鍜孯adom Access Iterator榪唬鍣ㄧ殑鍔熻兘錛堝叾涓璱nput_iterator_tag絳夊甫tag瀛楃涓蹭負鍚勪笉鍚岃凱浠e櫒鐨勪笓灞炴爣璇嗭級錛? 1銆両nputIterator template<class InputIterator, class Distance> void advance(InputIterator& i, Distance n, input_iterator_tag) { for(; n>0; --n,++i){} // InputIterator鍏鋒湁++鎬?} 2銆丗orwardIterator template<class ForwardIterator, class Distance> void advance(ForwardIterator& i, Distance n,forward_iterator_tag) { advance(i, n, input_iterator_tag()); } 3銆丅idirectionalIterator template<class BidirectionalIterator, class Distance> void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag) { if(n>=0) // 鍏鋒湁++銆?-鎬?for(; n>0; --n,++i){} else for(; n>0; ++n,--i){} } 4銆丷andomAccessIterator template<class RandomAccessIterator, class Distance> void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag) { i += n; // 鍏鋒湁++銆?-銆?=絳夋?} 聽聽聽 鍑芥暟瀵硅薄(Function object)涔熺О浠垮嚱鏁?Functor)錛屾槸涓縐嶈兘浠ヤ竴鑸嚱鏁拌皟鐢ㄨ娉曟潵璋冪敤鐨勫璞★紝鍑芥暟鎸囬拡(Function pointer)鏄竴縐嶅嚱鏁板璞★紝鎵鏈夊叿鏈塷perator()鎿嶄綔絎﹂噸杞界殑鎴愬憳鍑芥暟涔熸槸鍑芥暟瀵硅薄銆傚嚱鏁板璞′竴鑸垎涓烘棤鍙傚嚱鏁?Generator)錛屽崟鍙傚嚱鏁?Unary Function)鍜屽弻鍙傚嚱鏁?Binary Function)涓夌褰㈠紡錛屽畠浠垎鍒兘浠()銆乫(x)鍜宖(x,y)鐨勫艦寮忚璋冪敤錛孲TL瀹氫箟鐨勫叾浠栨墍鏈夊嚱鏁板璞¢兘鏄繖涓夌姒傚康鐨勫己鍖栥傚涓嬬畝鍗曠ず渚嬪睍紺哄嚑縐嶅艦寮忕殑瀹炵幇錛?br /> 1銆佹棤鍙?Generator)褰㈠紡 struct counter { typedef int result_type; counter(result_type init=0):n(init){} result_type operator() { return n++;} result_type n; } 2銆佸崟鍙?Unary Function)褰㈠紡 template<class Number> struct even // 鍑芥暟瀵硅薄even錛屾壘鍑虹涓涓伓鏁?{ bool operator()(Number x) const {return (x&1) == 0;} } // 浣跨敤綆楁硶find_if鍦ㄥ尯闂碅鍒癆+N涓壘鍒版弧瓚沖嚱鏁板璞ven鐨勫厓绱?int A[] = {1,0,3,4}; const int N=sizeof(A)/sizeof(int); find_if(A,A+N, even<int>()); 3銆佸弻鍙?Binary Function)褰㈠紡 struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1<s2) < 0;} }; // 浣跨敤鍑芥暟瀵硅薄ltstr錛岃緭鍑簊et瀹瑰櫒涓瑼鍜孊鐨勫茍闆?const int N=3 const char* a[N] = {"xjz","xzh","gh"}; const char* b[N]= {"jzx","zhx","abc"}; set<const char*,ltstr> A(a,a+N); set<const char*,ltstr> B(b,b+N); set_union(A.begin(),A.end(),B.begin(),B.end(), ostream_iterator<const char*>(cout," "), ltstr()); 聽聽聽 瀹瑰櫒(container)鏄竴縐嶅璞?object)錛屽彲浠ュ寘鍚茍綆$悊鍏跺畠鐨勫璞★紝騫舵彁渚涜凱浠e櫒(iterators)鐢ㄤ互瀹氬潃鍏舵墍鍖呭惈涔嬪厓绱犮傛牴鎹凱浠e櫒縐嶇被鐨勪笉鍚岋紝瀹瑰櫒涔熷垎涓哄嚑涓紝浠nput Iterator涓鴻凱浠e櫒鐨勪竴鑸琧ontainer錛屼互Forward Iterator涓鴻凱浠e櫒鐨凢orward Container錛屼互Bidirectional Iterator 涓鴻凱浠e櫒鐨凴eversible Container錛屼互Random Access Iterator涓鴻凱浠e櫒鐨凴andom Access Container銆係TL瀹氫箟浜岀澶у皬鍙彉鐨勫鍣細搴忓垪寮忓鍣?Sequence Container)鍜屽叧鑱斿紡瀹瑰櫒(Associative Container)搴忓垪寮忓鍣ㄥ寘鎷瑅ector銆乴ist鍜宒eque錛屽叧鑱斿紡瀹瑰櫒鍖呮嫭set銆乵ap銆乵ultiset鍜宮ultimap銆備互涓嬬ず渚嬬畝鍗曡鏄庨儴鍒嗗鍣ㄧ殑浣跨敤錛?1銆乿ector浣跨敤 // 灝咥涓互鍏冪礌5涓哄垎鍓茬偣錛屽垎鍒帓搴忥紝浣挎帓搴忓悗5鍚庨潰鐨勫厓绱犻兘澶т簬5涔嬪墠鐨勫厓绱?鍚庡尯闂翠笉鎺掑簭)錛?// 鐒跺悗杈撳嚭 int main() { int A[] = {7,2,6,4,5,8,9,3,1}; const int N=sizeof(A)/sizeof(int); vector<int> V(A,A+N); partial_sort(V,V+5,V+N); copy(V,V+N,ostream_iterator<int>(cout," ")); cout << endl; } 杈撳嚭鍙兘鏄細1 2 3 4 5 8 9 7 6 2銆乴ist浣跨敤 // 浜х敓涓絀簂ist錛屾彃鍏ュ厓绱犲悗鎺掑簭錛岀劧鍚庤緭鍑?int main() { list<int> L1; L1.push_back(0); L1.push_front(1); L1.insert(++L1.begin,3); L1.sort(); copy(L1.begin(),L1.end(),ostream_iterator<int>(cout," ")); } 杈撳嚭錛? 1 3 3銆乨eque浣跨敤 int main() { deque<int> Q; Q.push_back(3); Q.push_front(1); Q.insert(Q.begin()+1,2); Copy(Q.begin(),Q.end(),ostream_iterator<int>(cout," ")); } 杈撳嚭錛? 2 3 4銆乵ap浣跨敤 int main() { map<string,int> M; M.insert(make_pair("A",11); pair<map<string,int>::iterator, bool> p = M.insert(make_pair("C",5)); if(p.second) cout << p.first->second<<endl; } 杈撳嚭錛? 5銆乵ultiset浣跨敤 int main() { const int N = 5; int a[N] = {4,1,1,3,5}; multiset<int> A(a,a+N); copy(A.begin(),A.end(),ostream_iterator<int>(cout," ")); } 杈撳嚭錛? 1 3 4 5 璁捐鏂版濈淮 聽聽聽 灝嗚璁℃ā寮?design patterns)銆佹硾鍨嬬紪紼?generic programming)鍜岄潰鍚戝璞$紪紼?object-oriented programming)鏈夋満鐨勭粨鍚堣搗鏉ワ紝渚垮艦鎴愪簡璁捐鏂版濈淮銆傚叾涓紝璁捐妯″紡鏄粡榪囨彁鐐肩殑鍑鴻壊璁捐鏂規硶錛屽浜庡緢澶氭儏鍐典笅紕板埌鐨勯棶棰橈紝瀹冮兘鏄悎鐞嗚屽彲澶嶇敤鐨勮В鍐蟲柟妗堬紱娉涘瀷緙栫▼鏄竴縐嶅吀鑼?paradigm)錛屼笓娉ㄤ簬灝嗙被鍨嬫娊璞″寲錛屽艦鎴愬姛鑳介渶姹傛柟闈㈢殑涓涓簿緇嗛泦鍚堬紝騫跺埄鐢ㄨ繖浜涢渶姹傛潵瀹炵幇綆楁硶錛岀浉鍚岀殑綆楁硶鍙互榪愮敤浜庡箍娉涚殑綾誨瀷闆嗕腑錛屾墍璋撴硾鍨嬶紝灝辨槸鍏鋒湁鍦ㄥ縐嶆暟鎹被鍨嬩笂鐨嗗彲鎿嶄綔鐨勫惈鎰忥紱鏈鍚庡悓闈㈣薄瀵硅薄緙栫▼涓殑澶氭?polymorphism)鍜屾ā鏉?templates)絳夋妧鏈浉緇撳悎錛屼究鑾峰緱鏋侀珮灞傛涓婄殑鍏鋒湁鍙鐢ㄦх殑娉涘瀷緇勪歡銆傛硾鍨嬬粍浠墮鍏堝疄鐜頒簡璁捐妯″潡錛屽彲浠ヨ鐢ㄦ埛鎸囧畾綾誨瀷鍜岃涓猴紝浠庤屽艦鎴愬悎鐞嗙殑璁捐錛屼富瑕佺壒鐐規槸鐏墊椿銆侀氱敤鍜屾槗鐢ㄣ? 聽聽聽 policies鍜宲olicy綾伙紝鏄竴縐嶉噸瑕佺殑綾昏璁℃妧鏈紝鎵璋損olicy錛屾槸鐢ㄦ潵瀹氫箟涓涓被鎴栫被妯℃澘鐨勬帴鍙o紝璇ユ帴鍙g敱涓嬪垪涔嬩竴鎴栧叏閮ㄧ粍鎴愶細鍐呴儴綾誨瀷瀹氫箟銆佹垚鍛樺嚱鏁板拰鎴愬憳鍙橀噺銆傚熀浜巔olicy鐨勭被鐢辮澶氬皬鍨嬬被(縐頒負policies)緇勬垚錛屾瘡涓涓繖鏍風殑灝忓瀷綾誨彧璐熻矗鍗曠函濡傝涓烘垨緇撴瀯鐨勬煇涓鏂歸潰銆侾olicies鏈哄埗鐢辨ā鏉垮拰澶氶噸緇ф壙緇勬垚錛屽畠浠彲浠ヤ簰鐩告販鍚堟惌閰嶏紝浠庤屽艦鎴愯璁℃垘鐨勫鏍鋒э紝閫氳繃plicy綾伙紝涓嶄絾鍙互瀹氬埗琛屼負錛屼篃鍙互瀹氬埗緇撴瀯銆? 涓嬮潰綆鍗曚婦渚嬭鏄庢硾鍖栨濈淮鍜岄潰鍚戝璞℃濈淮鍦ㄩ儴鍒嗚璁℃ā寮忎腑鐨勮繍鐢ㄣ? 聽聽聽 Singletons璁捐妯″紡娉涘寲瀹炵幇 Singleton妯″紡鏄竴縐嶄繚璇佷竴涓璞?class)鍙湁涓涓疄浣擄紝騫朵負瀹冩彁渚涗竴涓叏灞璁塊棶鐐廣係ingleton鏄竴縐嶇粡榪囨敼榪涚殑鍏ㄥ眬鍙橀噺錛屾棦鍦ㄧ▼搴忎腑鍙兘鏈夊敮涓瀹炰綋鐨勭被鍨嬶紝瀹冪殑閲嶇偣涓昏闆嗕腑鍦ㄤ駭鐢熷拰綆$悊涓涓嫭绔嬪璞′笂錛岃屼笖涓嶅厑璁鎬駭鐢熷彟涓涓繖鏍風殑瀵硅薄銆? 鍏堣鎴戜滑鐪嬬湅涓鑸殑C++瀹炵幇鐨勫熀鏈墜娉曪紝涓嬮潰鏄疄鐜版簮鐮侊細 // Singleton.h鏂囦歡涓?class Singleton { public: static Singleton& Instance() { if(!pInstance_){ if(destroyed_){ // 寮曠敤鏄惁宸茬粡澶辨晥 OnDeadReference(); } else { Create(); // 絎竴嬈℃椂鍒涘緩瀹炰緥 } } return *pInstance_; } private: Singleton(); // 紱佹榛樿鏋勯?Singleton(const Singleton&); // 紱佹鎷瘋礉鏋勯?Singleton& operator= (const Singleton&);銆 // 紱佹璧嬪兼搷浣?static void Create() // 浼犲姞鍒涘緩鐨勫疄渚嬪紩鐢?{ static Singleton theInstance; pInstance_ = &theInstance; } static void OnDeadReference() { throw std::runtime_error(" 瀹炰緥琚笉姝e綋娑堟瘉"); } virtual ~Singleton() { pInstance- = 0; destroyed_ = true; } static Singleton *pInstance_; static bool destroyed_; } // Singleton.cpp涓潤鎬佹垚鍛樺彉閲忓垵濮嬪寲 Singleton* Singleton::pInstance_ = 0; Bool Singleton::destroyed_ = false; 聽聽聽 濡備笂鎵紺猴紝Singleton妯″紡瀹炵幇涓彧鏈変竴涓猵ublic鎴愬憳Instance()鐢ㄦ潵絎竴嬈′嬌鐢ㄦ椂鍒涘緩鍗曚竴瀹炰緥錛屽綋絎簩嬈′嬌鐢ㄦ椂闈欐佸彉閲忓皢宸茬粡琚瀹氬ソ錛屼笉浼氬啀嬈″垱寤哄疄渚嬨傝繕灝嗛粯璁ゆ瀯閫犲嚱鏁般佹嫹璐濇瀯閫犲嚱鏁板拰璧嬪兼搷浣滅鏀懼湪private涓紝鐩湴鏄笉璁╃敤鎴蜂嬌鐢ㄥ畠浠傚彟澶栵紝涓洪伩鍏嶅疄渚嬫剰澶栨秷姣佸悗鍐嶅疄渚嬪寲鎯呭喌錛屽姞鍏ラ潤鎬佸竷灝斿彉閲廳estroy_鏉ヨ繘琛屽垽鏂槸鍚﹀嚭閿欙紝浠庤岃揪鍒扮ǔ瀹氭с?br />聽聽聽 浠庝笂闈竴鑸疄鐜板彲浠ョ湅鍑篠ingleton妯″紡瀹炵幇涓昏鍦ㄤ簬鍒涘緩(Creation)鏂歸潰鍜岀敓瀛樻湡(Lifetime)鏂歸潰錛屾棦鍙互閫氳繃鍚勭鏂規硶鏉ュ垱寤篠ingleton銆侰reation蹇呯劧鑳藉垱寤哄拰鎽ф瘉瀵硅薄錛屽繀鐒惰寮鏀捐繖涓や釜鐩稿簲鍑芥暟錛屽皢鍒涘緩浣滀負鐙珛絳栫暐鍒嗙寮鏉ユ槸蹇呴渶鐨勶紝榪欐牱浣犲氨鍙互鍒涘緩澶氭佸璞′簡錛屾墍浠ユ硾鍖朣ingleton騫朵笉鎷ユ湁Creator瀵硅薄錛屽畠琚斁鍦–reationPolicy<T>綾繪ā鏉夸箣涓傜敓鍛芥湡鏄寚瑕侀伒寰狢++瑙勫垯錛屽悗鍒涘緩閮藉厛鎽ф瘉錛岃礋璐g▼搴忕敓鍛芥湡鏌愪竴鏃跺埢鎽ф瘉Singleton瀵硅薄銆? 涓嬮潰鏄竴涓畝鍗曠殑娉涘寲Singleton妯″紡鐨勫疄鐜?涓嶈冭檻綰跨▼鍥犵礌) template < class T, template<class> calss CreationPolicy = CreateUsingNew, template<class> class LifetimePolicy=DefaultLifetime, > classs SingletonHolder { public: static T& Instance() { if(!pInstance_) { if(destroyed_) { LifetimePolicy<T>::OnDeadReference(); destroyed_ = false; } pInstance_ = CreationPolicy<T>::Create(); LifetimePolicy<T>::SchedultCall(&DestorySingleton); } return *pInstance_; } private: static void DestroySinleton() { assert(!destroyed_); CreationPlicy<T>::Destroy(pInstance_); pInstance_ = 0; destroyed_ = true; } SingletonHolder(); SingletonHolder (const SingletonHolder &); SingletonHolder & operator= (const SingletonHolder &);銆 Static T* pInstance_; Static bool destroyed_; }; 聽聽聽 Instance()鏄疭ingletonHolder寮鏀劇殑鍞竴涓涓猵ublic鍑芥暟錛屽畠鍦–reationPolicy銆丩ifetimePolicy涓墦閫犱簡涓灞傚澹熾傚叾涓ā鏉垮弬鏁扮被鍨婽錛屾帴鏀剁被鍚嶏紝鏃㈤渶瑕佽繘琛孲ingleton鐨勭被銆傛ā鏉垮弬鏁板唴鐨勭被妯℃澘緙虹渷鍙傛暟CreateUsingNew鏄寚閫氳繃new鎿嶄綔絎﹀拰榛樿鏋勯犲嚱鏁版潵浜х敓瀵硅薄錛孌efaultLifetime鏄氳繃C++瑙勫垯鏉ョ鐞嗙敓鍛芥湡銆侺ifetimePolicy<T>涓湁浜屼釜鎴愬憳鍑芥暟錛孲cheduleDestrution()鍑芥暟鎺ュ彈涓涓嚱鏁版寚閽堬紝鎸囧悜鏋愭瀯鎿嶄綔鐨勫疄闄呮墽琛屽嚱鏁幫紝濡備笂闈estorySingleton鏋愭瀯鍑芥暟錛汷nDeadReference()鍑芥暟鍚屼笂闈竴鑸珻++涓悓鍚嶅嚱鏁扮浉鍚岋紝鏄礋璐e彂鐜板け鏁堝疄渚嬫潵鎶涘嚭寮傚父鐨勩侰reationPlicy<T>涓殑Create()鍜孌estroy()涓ゅ嚱鏁版槸鐢ㄦ潵鍒涘緩騫舵懅姣佸叿浣撳璞$殑銆? 涓嬮潰鏄笂榪版硾鍖朣ingleton妯″紡瀹炵幇鐨勪嬌鐢細 1銆佸簲鐢ㄤ竴 class A{}; typedef SingletonHolder<A, CreateUsingNew> SingleA; 2銆佸簲鐢ㄤ簩 class A{}; class Derived : public A {}; template<class T> struct MyCreator : public CreateUsingNew<T> { static T* Create() { return new Derived; } static void Destroy(T* pInstance) { delete pInstance; } } typedef SingletonHolder<A,MyCreator> SingleA; 聽聽聽 閫氳繃涓婇潰紺轟緥鍙互鐪嬪嚭錛?SingletonHolder閲囩敤鍩轟簬plicy璁捐瀹炵幇錛屽畠灝哠ingleton瀵硅薄鍒嗚В涓烘暟涓猵olicies錛屾ā鏉垮弬鏁扮被涓瑿reationPolicy鍜孡ifetimePolicy鐩稿綋浜庝簩涓猵olicies灝佽浣撱傚埄鐢ㄥ畠浠彲浠ュ崗鍔╁埗浣滃嚭浣跨敤鑰呰嚜瀹氫箟鐨凷ingleton瀵硅薄錛屽悓鏃惰繕棰勭暀浜嗚皟鏁村拰鎵╁睍鐨勭┖闂淬傜敱姝よ屽緱錛屾硾鍨嬬粍浠?generic components)錛屾槸涓縐嶅彲澶嶇敤鐨勮璁℃ā鏉匡紝緇撳悎浜嗘ā鏉垮拰妯″紡錛屾槸C++涓垱閫犲彲鎵╁厖璁捐鐨勬柊鏂規硶錛屾彁渚涗簡浠庤璁″埌浠g爜鐨勭畝鏄撹繃娓★紝甯姪鎴戜滑緙栧啓娓呮櫚銆佺伒媧匯侀珮搴﹀彲澶嶇敤鐨勪唬鐮併? 鍙傝冩枃鐚?
C++ Primer(絎笁鐗? --- 娼樼埍姘戠瓑璇?
Effective C++(絎簩鐗? --- 渚嵎璇?
More Effective C++ --- 渚嵎璇?
Exceptional C++ --- 鍗撳皬娑涜瘧
More Exceptional C++ --- 鏂兼槬鏅瘧
娣卞害鎺㈢儲C++瀵硅薄妯″瀷 --- 渚嵎璇?
娉涘瀷緙栫▼涓嶴TL --- 渚嵎璇?
C++ STL紼嬪簭鍛樺紑鍙戞寚鍗?--- 褰湪鏍圭瓑綆?
璁捐妯″紡錛氬彲澶嶇敤闈㈠悜瀵硅薄杞歡鐨勫厓绱?--- 鏉庤嫳鍐涚瓑璇?
C++璁捐鏂版濈淮 --- 渚嵎絳夎瘧
]]> C++闅忕瑪 涔?STL[vector]鐨勫瓨鍌ㄦ妧鏈?鍘熷垱) http://m.shnenglu.com/mumutou/archive/2007/01/04/17231.html鏈ㄦ湪澶?/dc:creator>鏈ㄦ湪澶?/author>Thu, 04 Jan 2007 06:26:00 GMT http://m.shnenglu.com/mumutou/archive/2007/01/04/17231.html http://m.shnenglu.com/mumutou/comments/17231.html http://m.shnenglu.com/mumutou/archive/2007/01/04/17231.html#Feedback 1 http://m.shnenglu.com/mumutou/comments/commentRss/17231.html http://m.shnenglu.com/mumutou/services/trackbacks/17231.html 棣栧厛鎴戜滑鍏堟潵鐪婨xample Code: #include <vector> #include <iostream> #include <memory> using namespace std; void main() { 聽vector<int> v; //聽cout<<v.allocator; 聽v.push_back(0); 聽v.push_back(1); 聽v.push_back(2); 聽v.push_back(3); 聽v.push_back(4); 聽v.push_back(5); 聽cout<<v.max_size(); } 鍒╃敤VC6.0鐨勫唴瀛樿皟璇?br />聽v.push_back(0);涔嬪悗 //_First榪唬鍣?0481B40 //_Last榪唬鍣?0481B44 //_End榪唬鍣?04B1B44 聽v.push_back(1);涔嬪悗 //_First榪唬鍣?0481B00 //_Last榪唬鍣?0481B08 //_End榪唬鍣?04B1B08涓轟粈涔堝湪鎵ц涓嬈ush_back涔嬪悗,榪唬鍣ㄥ叏閮ㄤ細鍙樺憿? 涓嬮潰鎴戜滑鐪嬬湅P.J. Plauger鐨勪唬鐮?br />聽void insert(iterator _P, size_type _M, const _Ty& _X) 聽聽{if (_End - _Last < _M) 聽聽聽{size_type _N = size() + (_M < size() ? size() : _M); 聽聽聽iterator _S = allocator.allocate(_N, (void *)0); 聽聽聽iterator _Q = _Ucopy(_First, _P, _S); 聽聽聽_Ufill(_Q, _M, _X); 聽聽聽_Ucopy(_P, _Last, _Q + _M); 聽聽聽_Destroy(_First, _Last); 聽聽聽allocator.deallocate(_First, _End - _First); 聽聽聽_End = _S + _N; 聽聽聽_Last = _S + size() + _M; 聽聽聽_First = _S; } 聽聽else if (_Last - _P < _M) 聽聽聽{_Ucopy(_P, _Last, _P + _M); 聽聽聽_Ufill(_Last, _M - (_Last - _P), _X); 聽聽聽fill(_P, _Last, _X); 聽聽聽_Last += _M; } 聽聽else if (0 < _M) 聽聽聽{_Ucopy(_Last - _M, _Last, _Last); 聽聽聽copy_backward(_P, _Last - _M, _Last); 聽聽聽fill(_P, _P + _M, _X); 聽聽聽_Last += _M; }} 鍏朵腑M = 1; 褰揰End - _Last < _M鏃?灝辮閲嶆柊鍒嗛厤鍐呭瓨浜?鍝﹀師鏉ユ椂榪欐牱鐨?[涓漢璁や負,鍦ㄦ柟渚胯皟璇曠殑鏃跺?鍙互鎶奀:\MSDEV\VC98\Include\涓嬮潰鐨剉ector鏂囦歡涓殑protected鏀規垚public:] 涓嬮潰鎴戠粰鍑哄湪5嬈℃彃鍏ヤ箣鍚庡叾鍐呭瓨鍒嗛厤 push_back(2) //00481AC0 //00481ACC //00481AD0 push_back(3); //00481AC0 //00481AD0 //00481AD0 push_back(4); //00481B20 //00481B34 //00481B40 push_back(5); //00481B20 //00481B38 //00481B40 娉ㄦ剰娌℃湁,_Last - _First涔嬪悗鐨勬槑鏄炬槸size() * 4 [娉?鍦╒C6.0鐨凷TL鐗堟湰鏄噰鐢ㄧ殑PJSTL鐗堟湰,鏄竴縐嶅叕璁ゆ渶鍨冨溇鐨凷TL鐗堟湰 鍦–++ Builder涓殑STL鐗堟湰鏄噰鐢ㄧ殑RW鐗堟湰,Rouge Wave鍏徃 鍦╱nix涓嬮潰GCC閲囩敤鐨勬槸SGI Silicon Graphics Computer System Inc鍏徃STL鐗堟湰,鎴戣涓哄湪鍙鎬?鍙Щ妞嶆ф柟闈㈡渶濂界殑涓涓増鏈琞
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产精品久久二区二区 |
欧美一区二区视频97 |
欧美激情一区二区三级高清视频 |
亚洲欧美一区二区激情 |
亚洲永久精品大片 |
香蕉尹人综合在线观看 |
久久精品主播 |
欧美成人激情在线 |
欧美日韩一区二 |
国产老女人精品毛片久久 |
国产一区二区三区四区hd |
在线成人国产 |
亚洲一区二区黄色 |
久久人人爽国产 |
亚洲人成网站在线播 |
一本到12不卡视频在线dvd |
亚洲欧美激情一区二区 |
久久天堂av综合合色 |
欧美日韩第一区 |
好吊一区二区三区 |
亚洲一级黄色av |
女同一区二区 |
亚洲免费一级电影 |
欧美阿v一级看视频 |
国产精品视频99 |
亚洲美女精品一区 |
久久国产精品网站 |
亚洲全部视频 |
久久aⅴ国产欧美74aaa |
欧美日韩免费观看一区 |
一色屋精品视频在线观看网站 |
在线综合亚洲欧美在线视频 |
久久综合99re88久久爱 |
亚洲午夜精品福利 |
欧美夫妇交换俱乐部在线观看 |
国产日韩一区欧美 |
亚洲深夜影院 |
亚洲国产高清一区二区三区 |
欧美一区国产一区 |
国产精品人人爽人人做我的可爱 |
亚洲伦理在线免费看 |
老司机午夜精品 |
亚洲欧美日韩国产成人 |
欧美日韩综合精品 |
av成人毛片 |
亚洲激情视频网站 |
欧美freesex交免费视频 |
一区二区三区我不卡 |
久久久久久网站 |
香蕉乱码成人久久天堂爱免费 |
国产精品国产自产拍高清av |
一本色道久久综合亚洲精品小说
|
麻豆国产精品va在线观看不卡 |
国产精品一区二区久久久 |
99视频国产精品免费观看 |
欧美刺激午夜性久久久久久久 |
亚洲男女自偷自拍 |
国产精品一区二区欧美 |
亚洲欧美伊人 |
亚洲欧美成人一区二区三区 |
国产精品二区在线 |
亚洲欧美激情诱惑 |
亚洲午夜高清视频 |
国产美女搞久久 |
欧美综合第一页 |
欧美一区二区三区日韩视频 |
国产区欧美区日韩区 |
久久精品国产一区二区三 |
小处雏高清一区二区三区 |
国产免费成人在线视频 |
欧美制服第一页 |
久久久.com |
亚洲激情亚洲 |
亚洲理论在线 |
国产欧美一区二区精品性 |
久久国产日韩欧美 |
久久久www免费人成黑人精品 |
精品88久久久久88久久久 |
欧美va亚洲va国产综合 |
欧美99在线视频观看 |
亚洲一区二区在线观看视频 |
午夜精品久久久久久久99黑人
|
亚洲国产成人精品久久 |
欧美韩国日本综合 |
欧美日韩精品国产 |
久久国产综合精品 |
欧美成人午夜激情在线 |
亚洲欧美另类国产 |
久久久国产视频91 |
日韩视频在线免费 |
午夜精品一区二区三区在线
|
亚洲国产中文字幕在线观看 |
亚洲精品日韩综合观看成人91 |
国产精品免费小视频 |
狂野欧美一区 |
欧美视频手机在线 |
蜜臀va亚洲va欧美va天堂 |
欧美精品啪啪 |
久久精品一区二区国产 |
欧美精品aa |
久久一区二区精品 |
国产精品九九久久久久久久 |
欧美18av |
国产日韩在线看 |
99精品国产热久久91蜜凸 |
激情欧美日韩 |
亚洲欧美日韩国产综合 |
亚洲卡通欧美制服中文 |
欧美在线亚洲综合一区 |
亚洲午夜激情网站 |
欧美成人免费全部观看天天性色 |
欧美在线免费播放 |
欧美日韩天堂 |
亚洲国产精品久久久久 |
激情久久久久久 |
欧美一区二区三区的 |
亚洲韩国青草视频 |
韩日在线一区 |
亚洲欧美资源在线 |
亚洲综合精品 |
在线精品福利 |
亚洲人成人77777线观看 |
伊人久久男人天堂 |
欧美一区二区三区精品电影 |
亚洲系列中文字幕 |
欧美日韩精品欧美日韩精品 |
欧美电影在线观看完整版 |
国语对白精品一区二区 |
亚洲免费伊人电影在线观看av |
日韩一级二级三级 |
欧美大片网址 |
亚洲激情av在线 |
亚洲人成人77777线观看 |
久久久久久久久久久一区
|
亚洲国产成人久久综合 |
在线成人国产 |
免费成人激情视频 |
欧美激情自拍 |
亚洲欧洲日韩在线 |
欧美激情bt |
亚洲精品中文在线 |
亚洲天堂av高清 |
国产精品久久久久久久久久久久久久
|
久久激情视频 |
久热精品视频在线免费观看 |
一区二区在线不卡 |
欧美成人资源 |
一区二区日韩欧美 |
欧美一乱一性一交一视频 |
国产欧美精品国产国产专区 |
欧美在线观看视频一区二区 |
麻豆freexxxx性91精品 |
亚洲人成艺术 |
国产精品国产三级国产 |
午夜精品久久久久 |
欧美/亚洲一区 |
一区二区高清视频 |
国产酒店精品激情 |
欧美成人a∨高清免费观看 |
亚洲精品一区在线 |
欧美在线视频观看免费网站 |
伊人男人综合视频网 |
欧美大片一区 |
亚洲欧美第一页 |
美女视频一区免费观看 |
99re6热在线精品视频播放速度 |
国产精品啊啊啊 |
久久视频精品在线 |
一区二区三区高清不卡 |
久久综合中文 |
亚洲一区久久 |
在线成人性视频 |
国产精品激情电影 |
老司机67194精品线观看 |
亚洲午夜精品久久 |
亚洲电影免费观看高清完整版在线 |
国产精品99久久久久久白浆小说 |
国产一区二区你懂的 |
亚洲欧美日韩成人 |
国产最新精品精品你懂的 |
你懂的成人av |
亚洲午夜91 |
亚洲黄色有码视频 |
久久久久久婷 |
亚洲永久免费视频 |
亚洲欧洲精品成人久久奇米网 |
国产精品视频导航 |
欧美人与性动交a欧美精品 |
欧美在线观看网站 |
亚洲一区成人 |
99re热这里只有精品视频
|
一区二区激情 |
在线欧美一区 |
国产精品一区二区你懂的 |
欧美日本在线看 |
毛片一区二区三区 |
久久欧美肥婆一二区 |
欧美一区二区高清 |
亚洲综合日韩中文字幕v在线 |
最新中文字幕一区二区三区 |