From cc4de970372e68d1211156ae902da7ea38d5fbb4 Mon Sep 17 00:00:00 2001 From: gxf <3295584788@qq.com> Date: 星期一, 10 二月 2025 09:35:10 +0800 Subject: [PATCH] Merge branch 'master' of ssh://115.28.86.8:29418/~admin/PCB工厂智能制造_9.19_250104 --- Group_马建强/Client/刘丰毅/document/LFY嵌入式.doc | 0 PCB_项目总结.txt | 110 + /dev/null | 2 Group_王小刚/Client/王小刚/document/C++知识点计划表.xlsx | 0 Group_马建强/Client/刘丰毅/document/LFYc++.doc | 0 Group_王小刚/Client/卢发阳/document/C++知识点.txt | 4132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Group_马建强/Client/刘丰毅/document/LFYC笔记.doc | 0 7 files changed, 4,243 insertions(+), 1 deletions(-) diff --git "a/Group_\347\216\213\345\260\217\345\210\232/Client/\345\215\242\345\217\221\351\230\263/document/C++\347\237\245\350\257\206\347\202\271.txt" "b/Group_\347\216\213\345\260\217\345\210\232/Client/\345\215\242\345\217\221\351\230\263/document/C++\347\237\245\350\257\206\347\202\271.txt" new file mode 100644 index 0000000..1c5e1f7 --- /dev/null +++ "b/Group_\347\216\213\345\260\217\345\210\232/Client/\345\215\242\345\217\221\351\230\263/document/C++\347\237\245\350\257\206\347\202\271.txt" @@ -0,0 +1,4132 @@ +缁撴瀯浣� + +1銆佹蹇碉細缁撴瀯浣撴槸鐢变竴绯诲垪鍏锋湁鐩稿悓绫诲瀷鎴栦笉鍚岀被鍨嬬殑鏁版嵁鏋勬垚鐨勬暟鎹泦鍚堬紝瀹冨厑璁稿皢涓嶅悓绫诲瀷鐨勬暟鎹粍鍚堝湪涓�璧凤紝褰㈡垚涓�涓柊鐨勩�佹洿澶嶆潅鐨勬暟鎹被鍨嬨�傚彲浠ユ妸缁撴瀯浣撶湅浣滄槸涓�涓� 鈥滄暟鎹鍣ㄢ�濓紝鐢ㄤ簬瀛樺偍澶氫釜鐩稿叧鐨勬暟鎹」锛岃繖浜涙暟鎹」琚О涓虹粨鏋勪綋鐨勬垚鍛� +2銆佸瓧鑺傚榻愶細 + +锛�1锛夈�佺粨鏋勪綋鍚勬垚鍛樼殑璧峰浣嶇疆鐩稿浜庣粨鏋勪綋鍙橀噺鐨勮捣濮嬩綅缃殑鍋忕Щ閲忓簲璇ユ槸杩欑绫诲瀷鐨勫�嶆暟銆� + +锛�2锛夈�佺粨鏋勪綋鍙橀噺鍗犳�诲瓧鑺傛暟搴旇鏄粨鏋勪綋鍚勬垚鍛樻渶澶х被鍨嬫墍鍗犲瓧鑺傛暟鐨勫�嶆暟銆� + +2銆佽鍏ユ垨杈撳嚭鏁版嵁鏃讹紝涓嶈兘鏁翠綋鐨勮鍏ユ垨鑰呮暣浣撹緭鍑猴紝鍙兘閫愪釜缁撴瀯浣撴垚鍛樿鍏ユ垨杈撳嚭銆� + +3銆佺浉鍚岀被鍨嬬殑缁撴瀯浣撳彉閲忚兘澶熺浉浜掕祴鍊笺�� + +c++涓被鍜岀粨鏋勪綋鐨勫尯鍒� + +榛樿璁块棶鏉冮檺涓嶅悓 + +1.绫伙細榛樿绉佹湁 + +2.缁撴瀯浣擄細榛樿鍏辨湁 + +### this鎸囬拡 + +**this鎸囬拡鐨勬湰璐ㄦ槸鎸囬拡甯搁噺锛宼his鎸囬拡鐨勬寚鍚戞槸涓嶅彲浠ヤ慨鏀圭殑锛屼絾鏄寚鍚戠殑鍐呭鐨勫�兼槸鍙互淇敼鐨�** + +**瀹為檯鏄細Person * const this;** + +绫诲唴鐨勯潪闈欐�佹垚鍛樺嚱鏁板彧浼氳癁鐢熶竴浠藉嚱鏁板疄渚嬶紝涔熷氨鏄澶氫釜鍚岀被鍨嬬被瀵硅薄鍏辩敤涓�浠戒唬鐮侊紝鎬庝箞鍖哄垎鍝簺鐢ㄦ埛璋冪敤鍛紝灏辨槸鐢╰his鎸囬拡 + +1.瑙e喅鍚嶇О鍐茬獊 + +鈥� 褰㈠弬鍜屾垚鍛樺彉閲忓悓鍚嶆椂锛岀敤this鍖哄垎 + +2.杩斿洖瀵硅薄鏈韩鐢�*this + +鈥� 浣跨敤閾惧紡璋冪敤杩斿洖鍊煎繀椤绘槸瀵硅薄鏈韩 + +鈥� cout灏卞睘浜庨摼寮忕紪绋嬶紝杩斿洖鐨勫璞″氨鏄痮stream锛屽彲浠ユ棤闄愯拷鍔犺皟鐢� + +鈥� 杩斿洖瀵硅薄绫诲瀷蹇呴』鏄被鐨勫紩鐢ㄧ被鍨嬶紝涓嶈兘杩斿洖绫荤被鍨嬶紝鍥犱负浣跨敤鍑芥暟杩斿洖绫荤殑璇濆疄闄呰繑鍥炵殑鏄竴涓复鏃跺壇鏈琾'锛岀劧鍚巔'閾惧紡璋冪敤杩斿洖p'' +=========================================== + 1銆� 鏌旀�ф暟缁勶細 + 濡傦細 + struct Test + { + int type; + int len; + char d[0]; // 鏌旀�ф暟缁勶紝闀垮害涓�0鐨勬暟缁勶紝鍙兘浣嶄簬缁撴瀯浣撴渶鍚庝竴涓垚鍛橈紝鎵�浠ユ瘡涓粨鏋勪綋鏈�澶氬彧鑳芥湁涓�涓紱鏌旀�ф暟缁勮兘琛ㄧず浠绘剰闀垮害鐨勫唴瀹癸紝涔熷彲浠ュ彨鍋氫笉瀹氶暱鏁扮粍锛屽惈鏈夋煍鎬ф暟缁勭殑缁撴瀯浣擄紝涔熷彲浠ュ彨鍋氫笉瀹氶暱缁撴瀯浣撱�� + }; + + 鐢变簬鏁扮粍闀垮害涓�0锛屾墍浠ヤ笉鍗犵粨鏋勪綋鍐呭瓨锛屽叾鍐呭瓨鍦ㄧ粨鏋勪綋鐨勬湯灏捐繛缁�� + + 鍥犱负鏌旀�ф暟缁勫湪缁撴瀯浣撴湯灏捐繛缁紝鎵�浠ヨ闂暟缁勬椂锛屽彲浠ヤ娇鐢ㄧ粨鏋勪綋瀵硅薄鐩存帴璁块棶锛屼笉闇�瑕佸仛鍏朵粬淇鎿嶄綔銆� + + 鍐呭瓨妯″瀷濡備笅锛� + -------------- + |int|int| ...[d鏁扮粍鍐呭锛屼笉鍗犵粨鏋勪綋鍐呭瓨] + -------------- + sizeof(Test) -> 8 + ------------------------------- + + 2銆佸彟涓�绉嶈〃绀虹粨鏋勪綋鍐呭闀垮害鍙彉鐨勬搷浣滐細 + 鎸囬拡锛屾垚鍛樺彉閲忎负鎸囬拡鐨勬柟寮� + + 濡傦細 + struct TestNext + { + int type; + int len; + char *a; + char *b; // 鑻ヤ娇鐢ㄦ寚閽堟潵鎸囧悜涓嶅畾闀跨殑鍐呭锛屽彲浠ユ湁澶氫釜鎸囬拡锛屼笖浣嶇疆鍙互鍦ㄧ粨鏋勪綋浠绘剰浣嶇疆锛涘敮涓�鐨勭己鐐规槸鐢变簬鎸囧悜鐨勬槸涓�鍧楀唴瀛樺湴鍧�锛屽湪涓嶅悓杩涚▼/绯荤粺閲岋紝鍐呭瓨鍦板潃浼氭湁鍙樺寲锛屽綋浼犺緭缁欏彟涓�绔箣鍚庯紝闇�瑕佸仛鍦板潃閲嶅畾鍚� + }; + + -------------TestNext鍐呭瓨妯″瀷濡備笅锛�32浣嶇郴缁熶笅 + |int|int|char*|char*|...a鍐呭瓨鍧�...|...b鍐呭瓨鍧�...| + 4 4 4 4 鍚庨潰璺熺潃2涓寚閽堝搴旂殑鍐呭瓨鍧� + ----------------- + TestNext * test = (TestNext*)buffer; + 閲嶅畾鍚戜慨姝o細 + 绗竴涓猚har* 鐨勬寚鍚戯細杩欎釜鍐呭瓨鍧楃殑棣栧湴鍧�+缁撴瀯浣撳ぇ灏忥紝鍙奱鐨勫湴鍧�涓� a = test+sizeof(TestNext); + + 绗簩涓寚鍚戞槸锛� b = a + strlen(a)+1; + + + ----------------------------------- + 鍐呭涓嶅畾闀跨粨鏋勪綋浣跨敤鍦烘櫙锛� + + 姣忔瑕佸線缁撴瀯浣撻噷闈㈠瓨鏀剧殑鍐呭闀垮害鏄彉鍖栫殑锛屽悓鏃跺張涓嶆兂娴垂棰濆鐨勫唴瀛樼┖闂存椂锛屽氨鍙娇鐢紱 + 姣斿锛氫竴浜涙煡璇㈢粨鏋滅殑瀛樺偍锛屼細鍥犱负鏌ヨ鏉′欢涓嶅悓锛岃�屼娇寰楃粨鏋滅殑鍐呭闀垮害涓嶅悓锛岃繖涓椂鍊欎娇鐢ㄤ笉瀹氶暱缁撴瀯浣撻潪甯稿悎閫傘�� + + 鑻ュ唴瀹规槸鏁翠綋鍙樺寲鐨勶紝閭e氨鍙互瑙嗕负涓�涓暣浣擄紝閫氳繃鑷畾涔夌粨鏋勪綋鏉ユ妸鏁翠綋琛ㄧず鍑烘潵锛屼娇鐢ㄧ粨鏋勪綋绫诲瀷鐨勬煍鎬ф暟缁勫嵆鍙〃绀恒�� + + 鑻ュ唴瀹规湁澶氫釜鍙樺寲锛屼笖涓嶈兘瑙嗕负涓�涓暣浣擄紝姣忎竴涓彉鍖栭兘鍙互浣跨敤鎸囬拡鏉ヨ〃绀猴紝杩欐牱鐨勮瘽浣跨敤澶氫釜鎸囬拡鏉ヨ〃绀轰笉瀹氶暱鍐呭鍗冲彲銆� + + -------------------------------- + 浠g爜楠岃瘉锛� + + 缁撴瀯浣撳0鏄庯細 + struct Test + { + int type; + int len; + char data[0]; // char 鏁扮粍锛屼篃鍙互鎹㈡垚鑷畾涔夌被鍨嬬殑鏁扮粍 + }; + + 浣跨敤鏃讹紝鎯虫妸杩欎釜瀛楃涓�"mayibase is very good"鏀惧埌缁撴瀯浣撲腑 + + char mayi[] = "mayibase is very good"; + int len = sizeof(Test)+sizeof(mayi); + Test *t = (Test*)malloc(len); + t->type = 100; + t->len = len; + strcpy(t->data,mayi); + + // 鎺ョ潃灏卞彲浠ユ妸杩欎釜缁撴瀯浣撳彂閫佺粰鍙︿竴绔簡 + + ------------------------------------- + + 鍙︿竴绉嶅甫澶氫釜鎸囬拡鐨勶細 + + struct TestNext + { + int type; + int len; + char *a; // 杩欎簺鎸囬拡锛屼篃鍙互缂撳瓨鑷畾涔夌被鍨嬬殑鎸囬拡 + char *b; + }; + // 瑕佹眰鎼哄甫\0 + char first[] = "mayibase is very good"; + char second[] = "0701class is very good"; + int total_len = sizeof(TestNext)+strlen(first)+1+strlen(second)+1; + TestNext *tn = (TestNext*)malloc(total_len); // 涓�寮�濮嬪紑杈熻冻澶熷ぇ灏忕殑鍐呭瓨 + tn->type = 100; + tn->len = total_len; + memcpy((char*)(tn)+sizeof(TestNext),first,sizeof(first)); + memcpy((char*)(tn)+sizeof(TestNext)+sizeof(first),second,sizeof(second)); + tn->a = first; // 鍙戦�佺缁欐寚閽堟剰涔変笉澶э紝鍦ㄥ彟涓�绔細澶辨晥 + tn->b = second; + +2銆�## 寮曠敤 + + +鏁扮粍鍚嶄笌鎸囬拡瀵瑰簲鏄ソ浜嬪悧?纭疄鏄竴浠跺ソ浜嬨�傚皢鏁扮粍鍦板潃浣滀负鍙傛暟鍙互鑺傜渷澶嶅埗鏁翠釜鏁扮粍鎵�闇�鐨勬椂闂村拰鍐呭瓨銆傚鏋滄暟缁勫緢澶э紝鍒欎娇鐢ㄦ嫹璐濈殑绯荤粺寮�閿�灏嗛潪甯稿ぇ;绋嬪簭涓嶄粎闇�瑕佹洿澶氱殑璁$畻鏈哄唴瀛橈紝杩橀渶瑕佽姳璐规椂闂存潵澶嶅埗澶у潡鐨勬暟鎹�傚彟涓�鏂归潰锛屼娇鐢ㄥ師濮嬫暟鎹鍔犱簡鐮村潖鏁版嵁鐨勯闄┿�� + + + +鈥� 鍦–++涓紝濡傛灉灏嗙被鐨勫璞′綔涓哄弬鏁颁紶閫掔粰鍑芥暟鏃讹紝閫氬父浼氫娇鐢ㄥ紩鐢紝杩欐牱鍙互閬垮厤瀵硅薄鐨勬嫹璐濆紑閿�锛岀壒鍒槸瀵逛簬澶у瀷瀵硅薄鑰岃█銆傚綋浣犲皢涓�涓被瀵硅薄閫氳繃寮曠敤浼犻�掔粰鍑芥暟鏃讹紝鍗充娇绫荤殑鎴愬憳鍙橀噺鏄鏈夌殑锛屽嚱鏁颁粛鐒跺彲浠ヨ闂拰鎿嶄綔杩欎簺绉佹湁鍙橀噺銆傝繖鏄洜涓虹鏈夊彉閲忕殑璁块棶鎺у埗鍙槸鍦ㄧ被澶栬捣浣滅敤锛岀被鍐呴儴鐨勬垚鍛樺嚱鏁帮紙鍖呮嫭鎴愬憳鍑芥暟浣滀负鍙傛暟鐨勫嚱鏁帮級鍙互鑷敱璁块棶绫荤殑绉佹湁鎴愬憳 + +### 寮曠敤鍜屾寚閽堝拰鍊煎彉閲忕殑鍖哄埆 + +1.蹇呴』鍦ㄥ0鏄庡紩鐢ㄦ椂灏嗗叾鍒濆鍖栵紝涓嶅儚鎸囬拡閭f牱鍏堝0鏄庡啀璧嬪�� + +2.寮曠敤鍒濆鍖栨椂鍙宠竟涓嶈兘鏄〃杈惧紡锛屽�煎彉閲忓彲浠� + +### 鍑芥暟褰㈠弬浣跨敤寮曠敤鏃跺垱寤轰复鏃跺彉閲忕殑鎯呭喌 + +1.鑰佺増鏈珻++姣斿瀹炲弬鍜屽舰鍙傚紩鐢ㄧ殑鍊肩被鍨嬩笉鍚屾椂锛屼細閫氳繃涓存椂鍙橀噺鎺ユ敹寮哄埗杞寲鍚庣殑鍊艰繘琛屼氦鎹� + +2.鎴戦亣鍒扮殑VS涓垯鏄洿鎺ラ�氳繃鍑芥暟閲嶈浇褰㈠弬绫诲瀷瀹炵幇浜嗙粨鏋� + +```cpp +void swap(int &a,int &b) { + int tmp; + tmp = a; + a = b; + b = tmp; +} +int main() +{ + long long a = 3;//褰㈠弬int 瀹炲弬long long锛屽嚱鏁版牴鎹疄鍙傝嚜鍔ㄩ噸杞戒簡 + long long b = 5; + swap(a, b); + cout << "a = " << a << endl; + cout << "size of a = " << sizeof(a) << endl; + return 0; +} +``` + +### 寮曠敤鐨勫疄璐� + +1. 鎵�浠ワ紝寮曠敤鍙橀噺鍦ㄥ姛鑳戒笂绛変簬涓�涓寚閽堝父閲忥紝鍗充竴鏃︽寚鍚戞煇涓�涓崟鍏冨氨涓嶈兘鍦ㄦ寚鍚戝埆澶勩�� + +2. 鍦ㄥ簳灞傦紝寮曠敤鍙橀噺鐢辨寚閽堟寜鐓ф寚閽堝父閲忕殑鏂瑰紡瀹炵幇銆� + +3. 鏃㈢劧寮曠敤鍗犲唴瀛橈紝涓轰粈涔堟垜鍗存棤娉曡幏寰楀紩鐢ㄧ殑鍦板潃鍟娿�� + + 1. 涔嬫墍浠ヤ笉鑳借幏鍙栧紩鐢ㄧ殑鍦板潃锛屾槸鍥犱负缂栬瘧鍣ㄨ繘琛屼簡鍐呴儴杞崲銆� + + ```c++ + int a = 99; + int &r = a; + r = 18; + cout<<&r<<endl; + ``` + + 缂栬瘧鏃朵細琚浆鎹㈡垚濡備笅鐨勫舰寮忥細 + + ```cpp + int a = 99; + int *r = &a; + *r = 18; + cout<<r<<endl; + ``` + + 浣跨敤&r鍙栧湴鍧�鏃讹紝缂栬瘧鍣ㄤ細瀵逛唬鐮佽繘琛岄殣寮忕殑杞崲锛屼娇寰椾唬鐮佽緭鍑虹殑鏄� r 鐨勫唴瀹癸紙a 鐨勫湴鍧�锛夛紝鑰屼笉鏄� r 鐨勫湴鍧�锛岃繖灏辨槸涓轰粈涔堣幏鍙栦笉鍒板紩鐢ㄥ彉閲忕殑鍦板潃鐨勫師鍥犮�備篃灏辨槸璇达紝涓嶆槸鍙橀噺 r 涓嶅崰鐢ㄥ唴瀛橈紝鑰屾槸缂栬瘧鍣ㄤ笉璁╄幏鍙栧畠鐨勫湴鍧�銆� + +int a = 10; + +int &ref = a; + +缂栬瘧鍣ㄧ湅鍒板紩鐢紝瀹為檯涓婁細杞崲鎴� int* const ref = &a; + +*ref = *a + +鍔燾onst淇グ鎸囬拡鍙樻垚鎸囬拡甯搁噺锛屾棦淇濊瘉浜嗗埆鍚嶄笉鑳藉啀淇敼鎸囧悜鍒 + + + +**const S &a1 = a** 甯搁噺寮曠敤锛岀瓑浠蜂簬 const S* const a1 = a const鍗充慨楗颁簡鎸囬拡浣垮紩鐢ㄤ笉鑳芥寚鍒殑锛屽張淇グS浣挎寚鍚戠殑鍊间篃涓嶈兘淇敼 + + + +void func(int& ref){ + +鈥� ref = 1000//ref鏄紩鐢紝杞寲涓�*ref = 1000 + +} + +**浣跨敤鏂瑰紡锛�** + +int a = 10 + +int &b = a; 浣跨敤&绗︼紝鍙橀噺绫诲瀷寰椾竴鑷� + +**娉ㄦ剰浜嬮」锛�** + +1.寮曠敤蹇呴』鍒濆鍖� + +int &b锛涢敊璇� + +2.寮曠敤鍦ㄥ垵濮嬪寲鍚庝笉鍙互鏇存敼 + +**寮曠敤鍋氬嚱鏁扮殑杩斿洖鍊兼椂锛�** + +1.涓嶈杩斿洖灞�閮ㄥ彉閲忕殑寮曠敤(浣嗘槸鍙互杩斿洖闈欐�佸眬閮ㄥ彉閲忕殑寮曠敤) + +2.鍑芥暟鐨勮皟鐢ㄥ彲浠ヤ綔涓哄乏鍊�(涓斿彧鏈夎繑鍥炵被鍨嬫椂寮曠敤绫诲瀷鐨勫嚱鏁板彲浠ヤ綔涓哄乏鍊�) + +```cpp +int& test02(){ + static int a = 20; + return a; +} + +int main(){ + int &ref = test02(); + test02() = 1000;//test02()杩斿洖鐨勫氨鏄痑锛宺ef灏辨槸a鐨勫埆鍚� +} +``` + +### 瀵瑰父閲忎娇鐢ㄥ紩鐢� + +int &ref = 10;//杩欎釜涓嶅彲浠ワ紝寮曠敤鏈韩闇�瑕佸悎娉曠殑鍐呭瓨绌洪棿锛岃��10鍦ㄥ父閲忔枃鏈尯锛屽姞鍏onst淇グ灏卞彲浠ヤ簡 + +const int &ref = 10;//杩欎釜鍙互锛岃繖琛屼唬鐮佹墽琛屾椂琚紪璇戝櫒淇敼涓轰簡int tmp = 10;const int &ref = tmp;铏界劧鏈�鍚巘mp鍙橀噺鍚嶄細娑堝け锛屼絾鏄埆鍚嶄竴鐩存寚鍦ㄥ紑杈熺殑閭d釜绌洪棿涓�� + +ref = 20;//閿欒銆傚洜涓哄姞鍏onst淇グ涔嬪悗锛岃鎸囬拡鍙樹负鍙锛屼笉鍙啀淇敼浜� +浼樼偣锛�1.閬垮厤瀵硅薄鎷疯礉锛屾彁楂樻�ц兘 2銆傝繑鍥炲紩鐢ㄦ敮鎸侀摼寮忚皟鐢� 3.浠g爜绠�娲� 4閫氳繃鍩虹被鐨勫紩鐢ㄨ皟鐢ㄦ淳鐢熺被鐨勮櫄鍑芥暟锛屽疄鐜拌繍琛屾椂鐨勫鎬併�� +缂虹偣锛�1.寮曠敤蹇呴』鍒濆鍖� 2.涓嶆敮鎸佺┖寮曠敤 3.璋冭瘯闅惧害澶э紝闅句互鐩磋鐪嬪嚭鍏宠仈瀵硅薄 4.鐩稿鍔熻兘鍙楅檺锛屽紩鐢ㄤ笉鏀寔澶氱骇寮曠敤銆� +宸﹀�煎紩鐢�&鍜屽彸鍊煎紩鐢�&&鐨勫尯鍒細 +1.宸﹀�硷紙lvalue锛夛細宸﹀�兼槸涓�涓〃绀哄璞¤韩浠界殑琛ㄨ揪寮忥紝瀹冮�氬父瀵瑰簲浜庡唴瀛樹腑鍏锋湁纭畾鍦板潃鐨勫璞°�傚乏鍊煎彲浠ュ嚭鐜板湪璧嬪�艰鍙ョ殑宸﹁竟鎴栧彸杈癸紝渚嬪鍙橀噺鍚嶃�佹暟缁勫厓绱犮�佸璞$殑鎴愬憳绛夈�� +鍙冲�硷紙rvalue锛夛細鍙冲�兼槸涓�涓笉琛ㄧず瀵硅薄韬唤鐨勮〃杈惧紡锛屽畠閫氬父鏄复鏃跺璞°�佸瓧闈㈤噺鎴栬〃杈惧紡鐨勬眰鍊肩粨鏋溿�傚彸鍊煎彧鑳藉嚭鐜板湪璧嬪�艰鍙ョ殑鍙宠竟锛屼笉鑳藉嚭鐜板湪宸﹁竟銆� +宸﹀�煎紩鐢紙&锛夛細宸﹀�煎紩鐢ㄦ槸瀵瑰乏鍊肩殑寮曠敤锛屽畠蹇呴』缁戝畾鍒颁竴涓乏鍊间笂銆� +鍙冲�煎紩鐢紙&&锛夛細鍙冲�煎紩鐢ㄦ槸瀵瑰彸鍊肩殑寮曠敤锛屽畠涓昏鐢ㄤ簬缁戝畾涓存椂瀵硅薄锛屽厑璁稿涓存椂瀵硅薄杩涜绉诲姩鎿嶄綔锛岄伩鍏嶄笉蹇呰鐨勬嫹璐濄�� +2.璇硶宸紓锛歩nt &&rref = 20; // 鍙冲�煎紩鐢紝缁戝畾鍒板彸鍊� 20 + int &lref = num; // 宸﹀�煎紩鐢紝缁戝畾鍒板乏鍊� num +3.缁戝畾瑙勫垯宸紓锛氬乏鍊煎紩鐢細閫氬父鍙兘缁戝畾鍒板乏鍊硷紝涓嶈兘鐩存帴缁戝畾鍒板彸鍊笺�備絾 const 宸﹀�煎紩鐢ㄦ槸涓緥澶栵紝瀹冨彲浠ョ粦瀹氬埌鍙冲�笺�俢onst int &clref = 20;鍙冲�煎紩鐢細鍙兘缁戝畾鍒板彸鍊硷紝涓嶈兘缁戝畾鍒板乏鍊笺�備絾鍙互閫氳繃 std::move 灏嗗乏鍊艰浆鎹负鍙冲�煎悗鍐嶇粦瀹氾紱int &&rref3 = std::move(num); +4.浣跨敤鍦烘櫙宸紓锛氬乏鍊煎紩鐢細鍑芥暟鍙傛暟浼犻�掞細閬垮厤瀵硅薄鐨勬嫹璐濓紝鎻愰珮鎬ц兘銆傚悓鏃跺彲浠ュ湪鍑芥暟鍐呴儴淇敼瀹炲弬鐨勫�笺�傚嚱鏁拌繑鍥炲�硷細杩斿洖瀵硅薄鐨勫紩鐢紝鍏佽鍦ㄥ嚱鏁拌皟鐢ㄥ鐩存帴瀵硅繑鍥炵殑瀵硅薄杩涜淇敼銆� 鍙冲�煎紩鐢細绉诲姩璇箟锛氶�氳繃鍙冲�煎紩鐢ㄥ疄鐜扮Щ鍔ㄦ瀯閫犲嚱鏁板拰绉诲姩璧嬪�艰繍绠楃锛岄伩鍏嶅涓存椂瀵硅薄杩涜涓嶅繀瑕佺殑鎷疯礉锛屾彁楂樻�ц兘銆� + +------------------------------------------------------------------------------------------------ +3銆乧onst + 浣滅敤锛� 淇濊瘉鏁版嵁鐨勫畨鍏ㄦ�у拰涓嶅彲淇敼鎬э紝鍚屾椂鎻愰珮浠g爜鐨勫彲璇绘�у拰鍙淮鎶ゆ�� + 鍦ㄤ笉鐢ㄤ綅缃殑浣滅敤锛� +1.浣跨敤聽const聽淇グ鍩烘湰鏁版嵁绫诲瀷 锛屽皢鍙橀噺瀹氫箟涓哄父閲� +2.const聽涔熷彲鐢ㄤ簬淇グ瀛楃涓诧紝浣垮叾鎴愪负鍙瀛楃涓层�� +3.const int* ptr = &num1;//鎸囬拡鎸囧悜鐨勫唴瀹逛笉鑳芥敼锛屽父閲忔寚閽� +4. int* const ptr = #//鎸囬拡甯搁噺锛屾寚閽堟湰韬殑鍊间笉鍙� +5. const int* const ptr = #//鎸囧悜甯搁噺鐨勫父閲忔寚閽�,閮戒笉鍙� +6.浣跨敤 const 淇グ寮曠敤鍙互鍒涘缓甯搁噺寮曠敤锛屽父閲忓紩鐢ㄤ笉鑳戒慨鏀规墍寮曠敤瀵硅薄鐨勫�硷紝浣嗗彲浠ュ紩鐢ㄥ父閲忔垨涓存椂瀵硅薄銆� +7.void printValue(const int& val)//鍑芥暟鍐呴儴涓嶈兘淇敼鍙傛暟鐨勫�� +8.printString("World");//const 寮曠敤浣滀负鍑芥暟鍙傛暟鍙互鎺ユ敹甯搁噺瀵硅薄鎴栦复鏃跺璞� +9. int getValue() const {}锛屽父鎴愬憳鍑芥暟锛屼笉鑳戒慨鏀瑰璞$殑闈為潤鎬佹垚鍛樺彉閲� +10.const int getValue() const {}//浣跨敤聽const聽淇グ鍑芥暟杩斿洖鍊煎彲浠ラ槻姝㈣皟鐢ㄨ�呬慨鏀硅繑鍥炵殑瀵硅薄鎴栧紩鐢ㄣ�� + + Const鍜宒efine鐨勫尯鍒細 +1.璇硶鍜岀被鍨嬶細 + const锛歝onst聽鏄� C++ 涓殑涓�涓叧閿瓧锛岀敤浜庡0鏄庡父閲忋�傚畠鍏锋湁鏄庣‘鐨勭被鍨嬶紝缂栬瘧鍣ㄤ細瀵瑰叾杩涜绫诲瀷妫�鏌ャ��#define锛�#define 鏄� C 鍜� C++ 涓殑棰勫鐞嗘寚浠わ紝鐢ㄤ簬杩涜鏂囨湰鏇挎崲銆傚畠娌℃湁绫诲瀷鐨勬蹇碉紝鍙槸绠�鍗曞湴灏嗗畯鍚嶆浛鎹负瀵瑰簲鐨勬枃鏈�� +2 浣滅敤鍩燂細 +const锛歝onst 甯搁噺鐨勪綔鐢ㄥ煙閬靛惊姝e父鐨勫彉閲忎綔鐢ㄥ煙瑙勫垯銆傚湪涓嶅悓鐨勪綔鐢ㄥ煙涓畾涔夌殑 const 甯搁噺鏄浉浜掔嫭绔嬬殑銆�#define锛�#define 瀹忕殑浣滅敤鍩熶粠瀹氫箟澶勫紑濮嬶紝鐩村埌鏂囦欢缁撴潫鎴栬�呴亣鍒� #undef 鎸囦护鍙栨秷瀹氫箟銆傚畯娌℃湁灞�閮ㄤ綔鐢ㄥ煙鐨勬蹇碉紝鍙兘浼氬鑷村懡鍚嶅啿绐併�� +3.鍐呭瓨鍒嗛厤锛歝onst甯搁噺浼氬垎閰嶏紝#define涓嶄細锛屽彧鏄繘琛屽畯鏇挎崲銆� +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +4.鎸囬拡锛� + 鏅鸿兘鎸囬拡锛堜竴绉嶇敤浜庣鐞嗗姩鎬佸垎閰嶅唴瀛樼殑宸ュ叿锛屽畠鍙互鑷姩澶勭悊鍐呭瓨鐨勫垎閰嶅拰閲婃斁锛岋級 + std::unique_ptr 鐙崰鎵�鏈夋潈锛屽悓涓�鏃堕棿鍙湁涓�涓璞★紝涓嶅厑璁告嫹璐濇瀯閫犲拰鎷疯礉璧嬪�硷紝閫氳繃move(杞鎵�鏈夋潈锛� + std::shared_ptr 鍏变韩鎵�鏈夋潈锛屽紩鐢ㄨ鏁� + weak_ptr 閰嶅悎shared_ptr浣跨敤 锛岀敤浜庤В鍐� std::shared_ptr 鍙兘鍑虹幇鐨勫惊鐜紩鐢ㄩ棶棰樸�俵ock() 鏂规硶鑾峰彇涓�涓� std::shared_ptr锛屼粠鑰岃闂璞°�� +寮曠敤鐨勫尯鍒細1.绫诲瀷&寮曠敤鍚�=鍙橀噺鍚�;瀹氫箟鏃跺繀椤诲垵濮嬪寲锛屼箣鍚庝笉鑳藉紩鐢ㄥ叾浠栫殑鍙橀噺锛屾寚閽堟槸涓�涓彉閲忥紝鍌ㄥ瓨鍙橀噺鐨勫唴瀛樺湴鍧�锛屽畾涔夋槸鍙互涓嶅垵濮嬪寲锛屼笉鍒濆鍖栵紝鎸囬拡鐨勫�兼槸涓嶇‘瀹氱殑鍊笺��2.鍐呭瓨鍗犵敤锛堝紩鐢ㄦ湰韬笉鍗犲唴瀛橈紝浣嗘槸鎸囬拡闇�瑕侊級 3.寮曠敤涓嶈兘涓虹┖4 寮曠敤鍦ㄤ娇鐢ㄦ椂涓嶉渶瑕佽繘琛岃В寮曠敤鎿嶄綔銆� +浼樼偣锛�1.鐩存帴璁块棶鍐呭瓨 2.瀹炵幇鏁版嵁缁撴瀯 3.閬垮厤鏁版嵁澶嶅埗锛屾彁楂樻�ц兘 4.鍜岀‖浠朵氦浜� +缂虹偣锛�1.鍐呭瓨绠$悊澶嶆潅 2.瀹规槗鍑洪敊锛堣秺鐣岀瓑锛� +瀹夊叏鎬э細1.绌烘寚閽堬紙鏄惁鏈夋晥锛� 2 鎮┖鎸囬拡闂 3.鎸囬拡瓒婄晫 +鏅鸿兘鎸囬拡锛氶伩鍏嶅唴瀛樻硠婕忓拰鎮┖鎸囬拡 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +5 鏁扮粍 +鍐呭瓨鐨勮繛缁�э細鍗犵敤鍐呭瓨涓竴娈佃繛缁殑鍦板潃 +鏁扮粍鐨勯亶鍘嗭細1.涓嬫爣璁块棶 2.鎸囬拡閬嶅巻 3.鑼冨洿for寰幆 +鍜屾寚閽堢殑鍖哄埆锛� 1. 鏁扮粍鏄暟鎹粨鏋勶紝鎸囬拡鏄彉閲忥紝淇濆瓨鐨勫湴鍧� +2. 鏁扮粍涓嬫爣璁块棶锛屾寚閽堢敤瑙e紩鐢� +3. 鍔ㄦ�佹暟缁勭殑澶у皬鍙互鍦ㄨ繍琛屾椂纭畾锛屼竴鑸湪鍫嗕笂鍒嗛厤 + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + +6.閾捐〃 +姒傚康锛氱嚎鎬ф暟鎹粨鏋勶紝鎸囬拡鍩熷拰鏁版嵁鍩熺粍鎴愶紝鍐呭瓨鏄槸涓嶈繛缁殑銆� +澧炲姞锛氬垱寤烘柊鑺傜偣锛屽缓绔嬭繛鎺� +struct ListNode { + int val; + ListNode* next; + ListNode(int x) : val(x), next(nullptr) {} +}; +ListNode* new_node = new ListNode(val); +new_node->next = head;//澶存彃 +鍒犻櫎锛氬垹闄ょ殑鑺傜偣鐢ㄤ复鏃跺彉閲忎繚瀛橈紝鍏堟柇寮�杩炴帴锛屽啀鍒犻櫎 + if (!head) { + return nullptr; + } + ListNode* temp = head; + head = head->next; + delete temp; +return head; +鍙屽悜閾捐〃锛氬墠鎸囬拡鍩熴�佸悗鎸囬拡鍩熴�佷互鍙婃暟鎹煙 + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +7.鍐呭瓨鍖哄煙锛� + 1锛屾爤鍖猴細瀛樻斁鍑芥暟鐨勫舰鍙傚拰灞�閮ㄥ彉閲忋�� + 2锛屽爢鍖猴細鐢╩alloc鍑芥暟鍒嗛厤鐨勭┖闂达紝鍒嗛厤鍒板爢鍖猴紝绋嬪簭鍛樺繀椤婚�氳繃free鍑芥暟鏉ラ噴鏀俱�� + 鍚﹀垯鍐呭瓨娉勬紡銆俶alloc鐨勫嚱鏁板師鍨嬶細 + void * malloc(int Size); + 浣滅敤锛氬湪鍫嗕笂鍒嗛厤Size瀛楄妭鐨勫唴瀛樼┖闂淬�� + 杩斿洖鍊硷細杩斿洖鍒嗛厤鐨勫唴瀛樼┖闂寸殑棣栧湴鍧�銆� + 3,甯搁噺鏂囨湰鍖猴細甯搁噺鏂囨湰鍖虹殑鍐呭涓嶈兘琚敼鍙橈紝鍚﹀垯宕╂簝銆� + 4,鍏ㄥ眬闈欐�佸尯锛氬嚱鏁板瀹氫箟鐨勫彉閲忥紝鍙叏灞�鍙橀噺锛屽垎閰嶅埌鍏ㄥ眬闈欐�佸尯銆� + 鍒濆鍖栫殑鍏ㄥ眬鍙橀噺鍒嗛厤鍒癲ata娈碉紝鏈垵濮嬪寲鐨勫叏灞�鍙橀噺鍒嗛厤鍒癰ss娈点�� +5.绋嬪簭浠g爜鍖猴細淇濆瓨绋嬪簭姣忔潯鎸囦护鐨勩�� +鍫嗘爤鐨勫尯鍒細1.鍐呭瓨鍒嗛厤鏂瑰紡锛屾爤鍐呭瓨绯荤粺鑷姩閲婃斁鍜屽垎閰嶏紝鍫嗘墜鍔ㄥ垎閰嶅拰閲婃斁 2.鏍堢殑鍐呭瓨鏈夐檺锛屽湪缂栬瘧鐨勬椂鍊欑‘瀹氾紝鍫嗙浉瀵硅緝澶с��3.鏁版嵁鍏变韩鎬э紝鏍堝畾涔夌殑鍙橀噺鍦ㄥ綋鍓嶇殑鍑芥暟绫讳娇鐢紝鍫嗗彲浠ュ湪涓嶅悓鐨勫嚱鏁颁箣闂村叡浜� + +Static鐨勪綔鐢細1.淇グ灞�閮ㄥ彉閲忔椂锛屽眬閮ㄥ彉閲忚鍒濆鍖栦竴娆�2.淇グ鍏ㄥ眬鍙橀噺鍜屽嚱鏁版椂锛岄檺鍒跺湪褰撳墠鏂囦欢鐨勮寖鍥村唴浣跨敤 3.淇グ绫荤殑鎴愬憳鍙橀噺锛岃〃绀哄睘浜庣被锛屾墍鏈夊璞″叡浜繖涓彉閲忥紝鍦ㄧ被澶栧垵濮嬪寲 4.淇グ绫荤殑鎴愬憳鍑芥暟鏃讹紝 璇ュ嚱鏁板睘浜庣被鏈韩锛屼笉渚濊禆浜庣被鐨勫璞°�傞潤鎬佹垚鍛樺嚱鏁板彧鑳借闂潤鎬佹垚鍛樺彉閲忓拰鍏朵粬闈欐�佹垚鍛樺嚱鏁帮紝涓嶈兘璁块棶闈為潤鎬佹垚鍛樸�� + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +8 malloc free new delete 鐨勫尯鍒細 +1.Malloc 銆乫ree閫氬父鍦╟璇█浣跨敤锛宯ew delete 鍦╟++浣跨敤 +2.Malloc 鍙槸绠�鍗曞垎閰嶄竴鍧楀唴瀛橈紝new鍜宒elete浼氳皟鐢ㄦ瀽鏋勫拰鏋勯�犲嚱鏁� +3.绫诲瀷瀹夊叏鎬э細malloc 杩斿洖 void* 绫诲瀷鐨勬寚閽堬紝闇�瑕佽繘琛屾樉寮忕殑绫诲瀷杞崲鎵嶈兘璧嬪�肩粰鍏朵粬绫诲瀷鐨勬寚閽堬紝new 杩愮畻绗︿細鏍规嵁鎵�鍒嗛厤瀵硅薄鐨勭被鍨嬭嚜鍔ㄨ繑鍥炵浉搴旂被鍨嬬殑鎸囬拡锛屾棤闇�杩涜鏄惧紡鐨勭被鍨嬭浆鎹€�� +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +9 绫� +榛樿鏋勯�狅細 榛樿鏃犲弬鍜屽甫榛樿褰㈠弬鍊肩殑鏋勯�犲嚱鏁般�� + MyClass(int x, int y = 2, int z = 3)//褰㈠弬鍏锋湁榛樿鍊硷紝闇�瑕佸湪鏈�鍙充晶 + +鎷疯礉鏋勯�犲嚱鏁帮細鎷疯礉鏋勯�犲嚱鏁扮殑涓昏浣滅敤鏄湪鍒涘缓瀵硅薄鏃讹紝灏嗕竴涓凡鏈夊璞$殑鏁版嵁鎴愬憳鐨勫�煎鍒跺埌鏂板璞′腑锛屼粠鑰屽疄鐜板璞$殑澶嶅埗銆侰lassName(const ClassName& other) { + // 鎷疯礉鎴愬憳鍙橀噺 +} + 璋冪敤鍦烘櫙锛�1. 鐢ㄤ竴涓璞″垵濮嬪寲鍙︿竴涓璞� 2. 瀵硅薄浣滀负鍑芥暟鍙傛暟鎸夊�间紶閫� 3. 鍑芥暟杩斿洖瀵硅薄 + 娴呮嫹璐濆拰娣辨嫹璐濓細榛樿鐨勬嫹璐濇瀯閫犲嚱鏁版槸娴呮嫹璐濓紝鍙細澶嶅埗鍊硷紝閬囧埌鎸囬拡鏃朵細鍑虹幇鎮┖鎸囬拡鐨勯棶棰樸�� 鑷畾涔夋嫹璐濇瀯閫犲嚱鏁帮紝鍒嗛厤鏂扮殑鍐呭瓨锛屽皢鍘熷璞℃寚閽堢殑鍐呭鎷疯礉鍒版柊鐨勫唴瀛樸�傞渶娉ㄦ剰鍚屾椂涔熻閲嶈浇璧嬪�艰繍绠楀嚱鏁� +铏氭瀽鏋勫嚱鏁帮細铏氭瀽鏋勫嚱鏁版槸灏嗘瀽鏋勫嚱鏁板0鏄庝负 virtual 鐨勬瀽鏋勫嚱鏁般�傚綋鍩虹被鐨勬瀽鏋勫嚱鏁拌澹版槑涓鸿櫄鏋愭瀯鍑芥暟鏃讹紝閫氳繃鍩虹被鎸囬拡鍒犻櫎娲剧敓绫诲璞℃椂锛屼細鍏堣皟鐢ㄦ淳鐢熺被鐨勬瀽鏋勫嚱鏁帮紝鍐嶈皟鐢ㄥ熀绫荤殑鏋愭瀯鍑芥暟銆� +瀹炰緥鍖栫殑涓夌鏂瑰紡锛�1.MyClass obj;//鏍堝疄渚嬪寲 2.Circle* circlePtr = new Circle(2.0);//鍫嗕笂瀹炰緥鍖栧璞� 3.Point p2(p1);//鎷疯礉瀹炰緥鍖� +涓夊ぇ鏉冮檺锛歱ublic (绫诲鍙皟鐢級 protected锛堝畠浠嬩簬 public 鍜� private 涔嬮棿锛屼富瑕佺敤浜庡湪缁ф壙浣撶郴涓娲剧敓绫昏兘澶熻闂熀绫荤殑鏌愪簺鎴愬憳锛屽悓鏃跺張瀵瑰閮ㄤ唬鐮侀殣钘忚繖浜涙垚鍛樸�傦級 private(鍙兘绫讳娇鐢紝娲剧敓绫绘棤娉曚娇鐢級 +闅愬紡杞崲锛�1.褰撶被鍏锋湁涓�涓崟鍙傛暟鐨勬瀯閫犲嚱鏁帮紙鎴栬�呴櫎浜嗙涓�涓弬鏁板鍏朵綑鍙傛暟閮芥湁榛樿鍊硷級鏃讹紝缂栬瘧鍣ㄥ彲浠ヤ娇鐢ㄨ繖涓瀯閫犲嚱鏁板皢璇ュ弬鏁扮被鍨嬬殑瀵硅薄闅愬紡杞崲涓虹被鐨勫璞°�� + + 2. 绫诲瀷杞崲杩愮畻绗﹀紩鍙戠殑闅愬紡杞崲鍙互閫氳繃瀹氫箟绫诲瀷杞崲杩愮畻绗︼紝浣跨被鐨勫璞¤兘澶熼殣寮忚浆鎹负鍏朵粬绫诲瀷銆� + +鏄剧ず璋冪敤锛氫娇鐢� explicit 绂佹闅愬紡杞崲 +闈欐�佸睘鎬э細闈欐�佸睘鎬у睘浜庣被鏈韩锛屾墍鏈夌被鐨勫璞″叡浜悓涓�涓潤鎬佸睘鎬с�� +闈欐�佸睘鎬т竴鑸湪绫荤殑澶栭儴杩涜鍒濆鍖栵紝鏍煎紡涓� DataType ClassName::staticVariable = initialValue;銆� +鏁存暟绫诲瀷鎴栨灇涓剧被鍨嬬殑甯搁噺闈欐�佸睘鎬у彲浠ュ湪绫荤殑鍐呴儴杩涜鍒濆鍖栥�� + +闈欐�佹柟娉曪細涓嶄緷璧栧璞★紝鍙兘璁块棶闈欐�佹垚鍛� + +This 鎸囬拡 銆乫inal銆乨elete锛� +This鎸囬拡锛氬湪 C++ 涓紝this 鎸囬拡鏄竴涓殣鍚簬姣忎竴涓潪闈欐�佹垚鍛樺嚱鏁颁腑鐨勭壒娈婃寚閽堛�傚畠鎸囧悜璋冪敤璇ユ垚鍛樺嚱鏁扮殑瀵硅薄锛岄�氳繃 this 鎸囬拡鍙互璁块棶璋冪敤瀵硅薄鐨勬垚鍛樺彉閲忓拰鎴愬憳鍑芥暟锛屼粠鑰屽尯鍒嗘垚鍛樺彉閲忓拰灞�閮ㄥ彉閲忋�� +Final: 涓�鏄敤浜庝慨楗拌櫄鍑芥暟锛岃〃绀鸿铏氬嚱鏁颁笉鑳藉湪娲剧敓绫讳腑琚噸鍐欙紱浜屾槸鐢ㄤ簬淇グ绫伙紝琛ㄧず璇ョ被涓嶈兘琚户鎵裤�� virtual void func() final { + std::cout << "Base::func()" << std::endl; +}//淇グ铏氬嚱鏁� +class Base final {...}//淇グ绫� +Delete: 涓�鏄敤浜庨噴鏀句娇鐢� new 杩愮畻绗﹀姩鎬佸垎閰嶇殑鍐呭瓨锛岄伩鍏嶅唴瀛樻硠婕忥紱浜屾槸鐢ㄤ簬绂佺敤鐗瑰畾鐨勫嚱鏁帮紝濡傞粯璁ゆ瀯閫犲嚱鏁般�佹嫹璐濇瀯閫犲嚱鏁扮瓑銆� + // 绂佺敤榛樿鏋勯�犲嚱鏁� +MyClass() = delete; +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +10 缁ф壙 + 缁ф壙鏂瑰紡鍙互鏄� public锛堝叕鏈夌户鎵匡級銆乸rivate锛堢鏈夌户鎵匡級鎴� protected锛堜繚鎶ょ户鎵匡級锛岄粯璁ょ殑缁ф壙鏂瑰紡鏄� private銆� + 鍏湁缁ф壙锛坧ublic锛夛細鐖剁被鐨劼爌ublic聽鎴愬憳鍦ㄥ瓙绫讳腑浠嶇劧鏄爌ublic聽鐨勶紝鐖剁被鐨劼爌rotected聽鎴愬憳鍦ㄥ瓙绫讳腑浠嶇劧鏄爌rotected聽鐨勶紝鐖剁被鐨劼爌rivate聽鎴愬憳鍦ㄥ瓙绫讳腑涓嶅彲鐩存帴璁块棶銆� +绉佹湁缁ф壙锛坧rivate锛夛細鐖剁被鐨勬墍鏈夋垚鍛樺湪瀛愮被涓兘鍙樻垚聽private聽鐨勶紝瀛愮被鐨勫瓙绫绘棤娉曞啀璁块棶杩欎簺鎴愬憳銆� +淇濇姢缁ф壙锛坧rotected锛夛細鐖剁被鐨劼爌ublic聽鍜屄爌rotected聽鎴愬憳鍦ㄥ瓙绫讳腑閮藉彉鎴惵爌rotected聽鐨勶紝鐖剁被鐨劼爌rivate聽鎴愬憳鍦ㄥ瓙绫讳腑涓嶅彲鐩存帴璁块棶銆� +瀹炰緥鍖栬繃绋嬶細 +鏋勯�犲嚱鏁帮細鍒涘缓瀛愮被瀵硅薄鏃讹紝浼氬厛璋冪敤鐖剁被鐨勬瀯閫犲嚱鏁帮紝鍐嶈皟鐢ㄥ瓙绫荤殑鏋勯�犲嚱鏁般�� +鏋愭瀯鍑芥暟锛氶攢姣佸瓙绫诲璞℃椂锛屼細鍏堣皟鐢ㄥ瓙绫荤殑鏋愭瀯鍑芥暟锛屽啀璋冪敤鐖剁被鐨勬瀽鏋勫嚱鏁� +澶氱户鎵匡細鍏堝0鏄庣殑鍏堢户鎵� +铏氬嚱鏁帮細铏氬嚱鏁扮殑涓昏浣滅敤鏄疄鐜拌繍琛屾椂澶氭�佹�с�傜敤virtual淇グ +铏氬嚱鏁拌〃锛氭瘡涓湁铏氬嚱鏁扮殑绫婚兘涓�涓櫄鍑芥暟琛紱鍦ㄥ垱寤哄寘鍚櫄鍑芥暟鐨勭被鐨勫璞℃椂锛屽璞$殑鍐呭瓨甯冨眬涓細鍖呭惈涓�涓櫄琛ㄦ寚閽堬紝璇ユ寚閽堜細鍦ㄥ璞℃瀯閫犳椂琚垵濮嬪寲涓烘寚鍚戣绫荤殑铏氬嚱鏁拌〃銆� +闈欐�佸鎬侊細鍑芥暟閲嶈浇 +瀹氫箟锛氱紪璇戞椂澶氭�佹槸鎸囧湪缂栬瘧闃舵灏辩‘瀹氫簡瑕佽皟鐢ㄧ殑鍑芥暟鎴栨搷浣滐紝涓昏閫氳繃鍑芥暟閲嶈浇鍜岃繍绠楃閲嶈浇鏉ュ疄鐜般�� +浼樼偣锛氱紪璇戞椂澶氭�佺殑鎵ц鏁堢巼楂橈紝鍥犱负鍑芥暟璋冪敤鍦ㄧ紪璇戦樁娈靛氨宸茬粡纭畾锛屾病鏈夐澶栫殑杩愯鏃跺紑閿�銆� +缂虹偣锛氱己涔忕伒娲绘�э紝涓�鏃︾紪璇戝畬鎴愶紝璋冪敤鐨勫嚱鏁板氨鍥哄畾浜嗐�� +鍔ㄦ�佸鎬侊細閲嶅啓 +瀹氫箟锛氳繍琛屾椂澶氭�佹槸鎸囧湪杩愯闃舵鎵嶇‘瀹氳璋冪敤鐨勫嚱鏁版垨鎿嶄綔锛屼富瑕侀�氳繃缁ф壙鍜岃櫄鍑芥暟锛堝湪 C++ 涓級銆佹娊璞$被鍜屾帴鍙o紙鍦� Java 涓級鏉ュ疄鐜般�� +浼樼偣锛氳繍琛屾椂澶氭�佹彁渚涗簡鏇撮珮鐨勭伒娲绘�э紝鍏佽绋嬪簭鍦ㄨ繍琛屾椂鏍规嵁瀵硅薄鐨勫疄闄呯被鍨嬫潵鍔ㄦ�佸湴閫夋嫨瑕佽皟鐢ㄧ殑鍑芥暟銆� +缂虹偣锛氱敱浜庨渶瑕佸湪杩愯鏃惰繘琛屽嚱鏁拌皟鐢ㄧ殑鍔ㄦ�佺粦瀹氾紝浼氬甫鏉ヤ竴瀹氱殑鎬ц兘寮�閿�銆� +绾櫄鍑芥暟锛歷irtual void pureVirtualFunction() = 0; + 鍩虹被涓嶅疄鐜帮細绾櫄鍑芥暟鍦ㄥ熀绫讳腑鍙湁澹版槑锛屾病鏈夊嚱鏁颁綋锛屽嵆鍩虹被涓嶄細涓虹函铏氬嚱鏁版彁渚涘叿浣撶殑浠g爜瀹炵幇銆� + 娲剧敓绫诲疄鐜帮細鍖呭惈绾櫄鍑芥暟鐨勭被鏄娊璞$被锛屼笉鑳藉疄渚嬪寲瀵硅薄銆傛淳鐢熺被蹇呴』瀹炵幇鍩虹被涓殑鎵�鏈夌函铏氬嚱鏁帮紝鍚﹀垯娲剧敓绫讳篃浼氭垚涓烘娊璞$被锛屽悓鏍蜂笉鑳藉疄渚嬪寲銆� +鎶借薄绫伙紙鍖呮嫭绾櫄鍑芥暟锛夌殑涓ょ鏂瑰紡锛� +1.浣跨敤绾櫄鍑芥暟 + 2.浣跨敤鍖呭惈鏈疄鐜版帴鍙g殑绫伙紝鎺ュ彛绫讳腑鍙寘鍚函铏氬嚱鏁帮紝娲剧敓绫婚渶瑕佸疄鐜拌繖浜涙帴鍙c�� + +铏氱户鎵匡細瑙e喅鑿卞舰缁ф壙甯︽潵鐨勫啑浣欏拰浜屼箟鎬ч棶棰� + class 娲剧敓绫诲悕 : virtual 缁ф壙鏂瑰紡 鍩虹被鍚� { + // 娲剧敓绫荤殑鎴愬憳 +}; +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +11.妯℃澘 + 11.1 鍑芥暟妯℃澘 +瀹氫箟锛� +template <class 绫诲瀷鍙傛暟1,...,class 绫诲瀷鍙傛暟2> +绫诲瀷 鍑芥暟鍚嶏紙褰㈠弬鍒楄〃锛� +{ + 鍑芥暟浣� +} +class鍙互typename鍏抽敭瀛椾唬鏇匡紝浣滅敤鐩稿悓锛屾棤鍖哄埆锛� +<>鎷彿涓殑鍙傛暟绉颁负妯℃澘褰㈠弬锛� +灏嗗嚱鏁版ā鏉夸腑鐨勬ā鏉垮舰鍙傚疄渚嬪寲鐨勫弬鏁扮О涓烘ā鏉垮疄鍙� 锛� +鐢ㄦā鏉垮疄鍙傚疄渚嬪寲鐨勫嚱鏁扮О涓烘ā鏉垮嚱鏁帮紱 +妯℃澘褰㈠弬闇�瑕佽皟鐢ㄨ妯℃澘鍑芥暟鏃舵彁渚涚殑妯℃澘瀹炲弬鏉ュ垵濮嬪寲妯℃澘褰㈠弬锛屼竴鏃︾紪璇戝櫒纭畾浜嗗疄闄呯殑妯℃澘瀹炲弬绫诲瀷灏辩О浠栧疄渚嬪寲浜嗗嚱鏁版ā鏉跨殑涓�涓疄渚嬨�� +涓嶈兘鐪佺暐绫诲瀷鍙傛暟鐨勫満鏅細template <class T> T add(T a,Tb) +1.浠庢ā鏉垮嚱鏁板疄鍙傝幏鍙栫殑淇℃伅鏈夌煕鐩�//add<double>(2.3,3) +2.闇�瑕佽幏寰楃壒瀹氱被鍨嬬殑杩斿洖鍊硷紝涓嶇鍙傛暟鐨勭被鍨�// add<int>(1.3,7.8) +3.铏氭嫙绫诲瀷鍙傛暟娌℃湁鍑虹幇鍦ㄦā鏉垮嚱鏁扮殑褰㈠弬涓�// + + 4.鍑芥暟妯℃澘鍚湁甯歌褰㈠弬 + + +11.2绫绘ā鏉� +瀹氫箟锛� +template <class 绫诲瀷鍙傛暟1,鈥�,绫诲瀷鍙傛暟n> +class 绫诲悕 +{ + 绫讳綋 +}; +妯℃澘绫� +鍦ㄥ畾涔変簡绫绘ā鏉垮悗锛屽彲浠ユ牴鎹渶瑕佺敓鎴愮浉搴旂殑妯℃澘绫汇�� +鍒╃敤妯℃澘绫诲垱寤哄璞$殑鏍煎紡濡備笅锛� +Array<double> array; +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +12銆� +## STL + +### STL鐨勮癁鐢� + +- 闀夸箙浠ユ潵锛岃蒋浠剁晫涓�鐩村笇鏈涘缓绔嬩竴绉嶅彲閲嶅鍒╃敤鐨勪笢瑗� +- C++鐨勯潰鍚戝璞″拰娉涘瀷缂栫▼鎬濇兂锛岀洰鐨勫氨鏄鐢ㄦ�х殑鎻愬崌銆� +- 澶у鎯呭喌涓嬶紝鏁版嵁缁撴瀯鍜岀畻娉曢兘鏈兘鏈変竴濂楁爣鍑�,瀵艰嚧琚揩浠庝簨澶ч噺閲嶅宸ヤ綔 +- 涓轰簡寤虹珛鏁版嵁缁撴瀯鍜岀畻娉曠殑涓�濂楁爣鍑�,璇炵敓浜哠TL + +### STL鍩烘湰姒傚康 + +- STL(Standard Template Library,**鏍囧噯妯℃澘搴�**) +- STL浠庡箍涔変笂鍒嗕负:**瀹瑰櫒(container) 绠楁硶(algorithm)杩唬鍣�(iterator)** +- **瀹瑰櫒**鍜�**绠楁硶**涔嬮棿閫氳繃**杩唬鍣�**杩涜鏃犵紳杩炴帴銆� +- STL鍑犱箮鎵�鏈夌殑浠g爜閮介噰鐢ㄤ簡**妯℃澘绫绘垨鑰呮ā鏉垮嚱鏁�** + +### STL鍏ぇ缁勪欢 + +STL澶т綋鍒嗕负鍏ぇ缁勪欢锛屽垎鍒槸:**瀹瑰櫒銆佺畻娉曘�佽凯浠e櫒銆佷豢鍑芥暟銆侀�傞厤鍣�(閰嶆帴鍣�)銆佺┖闂撮厤缃櫒** + +**瀹瑰櫒:**鍚勭鏁版嵁缁撴瀯锛屽vector銆乴ist銆乨eque銆乻et銆乵ap绛�,鐢ㄦ潵瀛樻斁鏁版嵁 + +**绠楁硶:**鍚勭甯哥敤鐨勭畻娉曪紝濡俿ort銆乫ind銆乧opy銆乫or_each绛� + +**杩唬鍣�:**鎵紨浜嗗鍣ㄤ笌绠楁硶涔嬮棿鐨勮兌鍚堝墏銆� + +**浠垮嚱鏁�:**琛屼负绫讳技鍑芥暟锛屽彲浣滀负绠楁硶鐨勬煇绉嶇瓥鐣ャ�� + +**閫傞厤鍣�:**涓�绉嶇敤鏉ヤ慨楗板鍣ㄦ垨鑰呬豢鐨勬暟鎴栭�変唬鍣ㄦ帴鍙g殑涓滆タ + +**绌洪棿閰嶇疆鍣�:**璐熻矗绌洪棿鐨勯厤缃笌绠$悊 + +### STL涓鍣ㄣ�佺畻娉曘�佽凯浠e櫒 + +**瀹瑰櫒:**缃墿涔嬫墍涔� +STL瀹瑰櫒灏辨槸灏嗚繍鐢ㄦ渶骞挎硾鐨勪竴浜涙暟鎹粨鏋勫疄鐜板嚭鏉� + +甯哥敤鐨勬暟鎹粨鏋�:鏁扮粍,閾捐〃,鏍�,鏍�,闃熷垪,闆嗗悎, 鏄犲皠琛� 绛� + +杩欎簺瀹瑰櫒鍒嗕负**搴忓垪寮忓鍣ㄥ拰鍏宠仈寮忓鍣�**涓ょ: + +**搴忓垪寮忓鍣�:**寮鸿皟鍊肩殑鎺掑簭锛屽簭鍒楀紡瀹瑰櫒涓殑姣忎釜鍏冪礌鍧囨湁鍥哄畾鐨勪綅缃� + +**鍏宠仈寮忓鍣�:**浜屽弶鏍戠粨鏋勶紝鍚勫厓绱犱箣闂存病鏈変弗鏍肩殑鐗╃悊涓婄殑椤哄簭鍏崇郴 + +**绠楁硶:**闂涔嬭В娉曚篃 +鏈夐檺鐨勬楠わ紝瑙e喅閫昏緫鎴栨暟瀛︿笂鐨勯棶棰橈紝杩欎竴闂ㄥ绉戞垜浠彨鍋氱畻娉�(Algorithms) + +1銆侀潪鍙彉搴忓垪绠楁硶锛氭寚涓嶇洿鎺ヤ慨鏀瑰叾鎵�鎿嶄綔鐨勫鍣ㄧ殑绠楁硶銆� + +2銆佸彲鍙樺簭鍒楃畻娉曪細鎸囧彲浠ヤ慨鏀瑰叾鎵�鎿嶄綔鐨勫鍣ㄧ殑绠楁硶銆� + +3銆佹帓搴忕畻娉曪細鍖呮嫭瀵瑰簭鍒楄繘琛屾帓搴忓拰鍚堝苟鐨勭畻娉曪紝鎼滅储绠楁硶浠ュ強鏈夊簭搴忓垪涓婄殑闆嗗悎鎿嶄綔銆� + +4銆佹暟鍊肩畻娉曪細瀵瑰鍣ㄥ唴瀹硅繘琛屾暟鍊艰绠� + + + +**杩唬鍣�:**瀹瑰櫒鍜岀畻娉曚箣闂寸矘鍚堝墏 +鎻愪緵涓�绉嶆柟娉曪紝浣夸箣鑳藉渚濆簭瀵昏鏌愪釜瀹规櫠鎵�鍚殑鍚勪釜鍏冪礌锛岃�屽張鏃犻渶鏆撮湶璇ュ鍣ㄧ殑鍐呴儴琛ㄧず鏂瑰紡 + +姣忎釜瀹瑰櫒閮芥湁鑷繁涓撳睘鐨勯�変唬鍣� + +杩唬鍣ㄤ娇鐢ㄩ潪甯�**绫讳技浜庢寚閽�**锛屽垵瀛﹂樁娈垫垜浠彲浠ュ厛鐞嗚В閫変唬鍣ㄤ负鎸囬拡 + +1銆佹鍚戣凯浠e櫒锛氬鍣ㄧ被鍚�::iterator 杩唬鍣ㄥ悕; + +2銆佸父閲忔鍚戣凯浠e櫒锛氬鍣ㄧ被鍚�::const_iterator 杩唬鍣ㄥ悕; + +3銆佸弽鍚戣凯浠e櫒锛氬鍣ㄧ被鍚�::reverse_iterator 杩唬鍣ㄥ悕; + +4銆佸父閲忓弽鍚戣凯浠e櫒锛氬鍣ㄧ被鍚�::const_reverse_iterator 杩唬鍣ㄥ悕;12. STL +12.1 string瀹瑰櫒 + 閬嶅巻鐨勪笁绉嶆柟寮忥細for寰幆銆佽寖鍥撮亶鍘嗐�佽凯浠e櫒閬嶅巻:for(string:: reverse_itreator........) + +杩唬鍣▄姝e悜{甯搁噺锛歝begin(),cend() 闈炲父閲忥細begin锛堬級 end() + 鍙嶅悜{甯搁噺锛歝rbegin(),crend() 闈炲父閲忥細rbegin锛堬級 rend() + s1.erase(it,it+3); 鍒犻櫎涓変釜鍏冪礌 +S1.erase(1,1)//浠庝笅鏍囦负1寮�濮嬪垹锛屽垹闄涓紝榛樿鍒犲畬 +绫诲瀷杞崲锛� + Stoi(鈥�18鈥�) + Stoi(鈥�18.3鈥�) + To_string(2) + To_string(23.3) +12.2 list + 浣跨敤erase鏃讹紝娉ㄦ剰杩唬鍣ㄥけ鏁� + For( auto it=l.begin();it!=l.end();) +{ +If(*it==val){ +It=l.erase(it);} +Else{ +It++;}} + +12.3 map瀹瑰櫒 + +澧炲姞鐨勬柟寮忥細 map[100]=鈥漻uac锛宑232鈥� //娌℃湁灏变細鏂板缓 + Map.insert(makpair(鈥渪uac鈥�,鈥漜dah鈥�);//瀛樺湪浼氬け璐� + + +12.4 vector銆乻tack銆乹ueue銆乨eque銆乻et + +12.5 绠楁硶锛氬啋娉� + 鎺掑簭锛氬揩鎺掋�佺孩榛戞爲 + 鏌ユ壘锛氫簩鍒嗘煡鎵� +12.6 杩唬鍣ㄧ殑绉嶇被 +12.6.1杈撳叆杩唬鍣� + 杈撳叆杩唬鍣ㄦ槸鏈�鍩烘湰鐨勮凯浠e櫒绫诲瀷锛屽畠鍙兘鍗曟柟鍚戝悜鍓嶇Щ鍔紝骞朵笖鍙兘璇诲彇鎵�鎸囧悜鐨勫厓绱犱竴娆°�備篃灏辨槸璇达紝瀵瑰悓涓�涓厓绱犱笉鑳借繘琛屽娆¤鍙栨搷浣溿�� +鏀寔鐨勬搷浣滃寘鎷細瑙e紩鐢紙*锛夈�佸墠缃拰鍚庣疆鑷锛�++锛夈�佺浉绛夊拰涓嶇浉绛夋瘮杈冿紙==銆�!=锛夈�� +//std::find 鍑芥暟灏卞彲浠ヤ娇鐢ㄨ緭鍏ヨ凯浠e櫒銆� +//auto it = std::find(vec.begin(), vec.end(), 3); // vec.begin() 杩斿洖鐨勬槸杈撳叆杩唬鍣� +12.6.2 杈撳嚭杩唬鍣� + 鍑鸿凯浠e櫒涔熸槸鍗曟柟鍚戝悜鍓嶇Щ鍔紝浣嗗畠鐨勪富瑕佷綔鐢ㄦ槸鍚戞墍鎸囧悜鐨勪綅缃啓鍏ュ厓绱狅紝骞朵笖鍚屾牱鍙兘瀵规瘡涓綅缃繘琛屼竴娆″啓鍏ユ搷浣溿�� +鏀寔鐨勬搷浣滄湁锛氳В寮曠敤璧嬪�硷紙*it = value锛夈�佸墠缃拰鍚庣疆鑷锛�++锛夈�� +甯哥敤浜庡崟閬嶅啓鍏ョ畻娉曪紝渚嬪 std::copy 鍑芥暟鍦ㄥ皢鍏冪礌澶嶅埗鍒扮洰鏍囧鍣ㄦ椂灏卞彲浠ヤ娇鐢ㄨ緭鍑鸿凯浠e櫒銆� + + + 12.6.3 鍓嶅悜杩唬鍣� + 鍓嶅悜杩唬鍣ㄧ户鎵夸簡杈撳叆杩唬鍣ㄥ拰杈撳嚭杩唬鍣ㄧ殑鍔熻兘锛屽畠鍙互鍗曟柟鍚戝悜鍓嶇Щ鍔紝骞朵笖鍙互澶氭璁块棶鍚屼竴涓厓绱犮�� +鏀寔杈撳叆杩唬鍣ㄥ拰杈撳嚭杩唬鍣ㄧ殑鎵�鏈夋搷浣滐紝鍚屾椂鍏佽瀵瑰悓涓�涓厓绱犺繘琛屽娆¤鍐欍�� + //閫傜敤浜庨渶瑕佸娆¢亶鍘嗗鍣ㄤ腑鍏冪礌鐨勭畻娉曪紝渚嬪鏌愪簺閾捐〃鎿嶄綔銆� + + 12.6.4 鍙屽悜杩唬鍣� +鍙屽悜杩唬鍣ㄥ湪鍚戝墠杩唬鍣ㄧ殑鍩虹涓婂鍔犱簡鍚戝悗绉诲姩鐨勮兘鍔涳紝瀹冨彲浠ュ湪瀹瑰櫒涓弻鍚戠Щ鍔ㄣ�� +闄や簡鏀寔鍓嶅悜杩唬鍣ㄧ殑鎵�鏈夋搷浣滃锛岃繕鏀寔鍓嶇疆鍜屽悗缃嚜鍑忥紙--锛夋搷浣溿�� +//閫傚悎闇�瑕佸弻鍚戦亶鍘嗗鍣ㄧ殑绠楁硶锛屼緥濡偮爏td::reverse聽鍑芥暟灏遍渶瑕佸弻鍚戣凯浠e櫒銆� + + 12.6.5 闅忔満璁块棶杩唬鍣� + 闅忔満璁块棶杩唬鍣ㄦ槸鍔熻兘鏈�寮哄ぇ鐨勮凯浠e櫒绫诲瀷锛屽畠缁ф壙浜嗗弻鍚戣凯浠e櫒鐨勬墍鏈夊姛鑳斤紝骞朵笖鏀寔闅忔満璁块棶鍏冪礌銆� +鏀寔鐨勬搷浣滃寘鎷細绠楁湳杩愮畻锛�+銆�-锛夈�佸鍚堣祴鍊硷紙+=銆�-=锛夈�佷笅鏍囪闂紙[]锛変互鍙婃瘮杈冨ぇ灏忥紙<銆�>銆�<=銆�>=锛夈�� +//閫傜敤浜庨渶瑕佸揩閫熼殢鏈鸿闂鍣ㄥ厓绱犵殑绠楁硶锛屼緥濡� std::sort 鍑芥暟閫氬父瑕佹眰浣跨敤闅忔満璁块棶杩唬鍣ㄣ�� + +鑷甫find鍑芥暟鐨勫鍣細 + 1.std::set 鍜� std::multiset +鐗圭偣锛氳繖涓や釜瀹瑰櫒鍩轰簬绾㈤粦鏍戝疄鐜帮紝瀛樺偍鐨勫厓绱犱細鑷姩鎺掑簭銆俿td::set 涓厓绱犲敮涓�锛宻td::multiset 鍏佽鍏冪礌閲嶅銆傚畠浠殑 find 鍑芥暟鍙互鍦╫(logn) 鐨勬椂闂村鏉傚害鍐呮煡鎵炬寚瀹氬厓绱犮�� + 2. std::map 鍜� std::multimap +鐗圭偣锛氬悓鏍峰熀浜庣孩榛戞爲瀹炵幇锛屽瓨鍌ㄩ敭鍊煎銆俿td::map 涓敭鏄敮涓�鐨勶紝std::multimap 鍏佽閿噸澶嶃�傚畠浠殑 find 鍑芥暟鏍规嵁閿潵鏌ユ壘鍏冪礌锛屾椂闂村鏉傚害涔熸槸 o(logn)銆� +3.聽std::unordered_set聽鍜屄爏td::unordered_multiset +鐗圭偣锛氳繖涓や釜瀹瑰櫒鍩轰簬鍝堝笇琛ㄥ疄鐜帮紝涓嶄繚璇佸厓绱犵殑椤哄簭銆俿td::unordered_set聽涓厓绱犲敮涓�锛宻td::unordered_multiset聽鍏佽鍏冪礌閲嶅銆傚畠浠殑聽find聽鍑芥暟骞冲潎鏃堕棿澶嶆潅搴︿负o(1)聽锛屾渶鍧忔儏鍐典笅涓郝爋(n)銆� +4. std::unordered_map 鍜� std::unordered_multimap +鐗圭偣锛氬熀浜庡搱甯岃〃瀛樺偍閿�煎锛屼笉淇濊瘉鍏冪礌椤哄簭銆俿td::unordered_map聽涓敭鍞竴锛宻td::unordered_multimap聽鍏佽閿噸澶嶃�俧ind聽鍑芥暟鏍规嵁閿煡鎵惧厓绱狅紝骞冲潎鏃堕棿澶嶆潅搴︿负聽o(1)锛屾渶鍧忎负o(n)聽銆� + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +13.鏅鸿兘鎸囬拡 +1.鍙互浣滀负瀹瑰櫒鐨勫厓绱狅紝浣嗘槸shared_ptr褰撳鍣ㄧ殑鍏冪礌鏃讹紝闇�瑕佷娇鐢ㄧЩ鍔ㄨ涔� +2.璁捐涓�涓櫤鑳芥寚閽� + +## 鏅鸿兘鎸囬拡 + +``` +鏅鸿兘鎸囬拡鏄竴涓被锛屽畠灏佽浜嗕竴涓師濮嬬殑C++鎸囬拡锛屼互绠$悊鎵�鎸囧璞$殑鐢熷懡鏈熴�傝В鍐冲姩鎬佸唴瀛樿嚜鍔ㄩ噴鏀鹃棶棰樸�� + +澶存枃浠讹細#include <memory> +``` + + + +### unique_ptr瀹炵幇鏂瑰紡 + +``` +#include <iostream> +#include <memory> +#include <string> +using namespace std; +class Test { +public: + Test() { + cout << "Test()" << endl; + } + ~Test() { + cout << "~Test()" << endl; + } + void Output() const { + cout << "Output()" << endl; + } +}; +template <class T> //绫绘ā鏉� +class AutoPtr //鏅鸿兘鎸囬拡绫� +{ +public: + AutoPtr(T* ptr) { //鏈夊弬鏋勯�� + this->ptr = ptr; + } + ~AutoPtr() { //鏋愭瀯 + if (ptr != nullptr) delete ptr; + } + T& operator *() { //閲嶈浇鎸囬拡杩愮畻绗︼紝浣挎櫤鑳芥寚閽堜笌鏅�氭寚閽堜綔鐢ㄤ竴鏍� + return *ptr; + } + T* get() { //鑾峰彇ptr鎸囬拡,鍗冲師濮嬫寚閽� + return ptr; + } + T* operator->() { //閲嶈浇鎸囧悜杩愮畻绗︼紝浣挎櫤鑳芥寚閽堝彲浠ヨ闂绠″璞$殑鎴愬憳鍑芥暟鍜屾垚鍛樺彉閲� + return ptr; + } +private: + AutoPtr(const AutoPtr&) = delete; //鍒犻櫎鎷疯礉鏋勯�� + AutoPtr& operator=(const AutoPtr&) = delete; //鍒犻櫎璧嬪�艰繍绠楃閲嶈浇 +private: + T* ptr; //鏅鸿兘鎸囬拡瀵硅薄锛宲tr涓鸿绠″璞� +}; +int main() +{ //p1鏅鸿兘鎸囬拡瀵硅薄new涓�涓猅est绫诲璞★紝Test绫诲璞′负琚瀵硅薄 + AutoPtr<Test> p1(new Test); //鏅鸿兘鎸囬拡瀵硅薄璁块棶鎴愬憳鍑芥暟鐢� . ,琚瀵硅薄璁块棶鎴愬憳鍑芥暟鐢� -> + p1.get()->Output(); + p1->Output(); + return 0; +} +``` + +### unique_ptr(鐙崰锛屼竴涓櫤鑳芥寚閽堟寚鍚戜竴涓绠″璞�) + +``` +#include <iostream> +#include <memory> +#include <string> +using namespace std; +int main() +{ +聽聽聽聽unique_ptr<int> p1(new int); +聽聽聽聽*p1 = 10; +聽聽聽聽cout << *p1 << endl; +聽聽聽聽unique_ptr<string> s1(new string); +聽聽聽聽*s1 = "hello world!"; +聽聽聽聽cout << *s1 << endl; +聽聽聽聽cout << s1->size() << endl; +聽聽聽聽return 0; +} +``` + +### shared_ptr(鍏变韩锛屽涓櫤鑳芥寚閽堟寚鍚戝悓涓�涓绠″璞�) + +``` +shared_ptr鍏佽澶氫釜shared_ptr瀵硅薄鎸囧悜鍚屼竴涓绠$悊瀵硅薄锛� shared_ptr鏄�氳繃寮曠敤璁℃暟鏉ョ鐞嗗璞$殑锛屾嫹璐濅竴涓猻hared_ptr锛岃鏁板櫒閮戒細閫掑锛岀寮�浣滅敤鍩熸椂锛岃鏁板櫒浼氶�掑噺锛屽鏋滆鏁板櫒鍙樹负0锛屽畠灏变細鑷姩閲婃斁鑷繁鎵�绠$悊鐨勫璞°�� + +#include <iostream> +#include <string> +#include <memory> +using namespace std; +int main() +{ +shared_ptr<int> p1(new int); +shared_ptr<int> p2(p1); +*p1 = 10; +cout << *p1 << endl; +cout << *p2 << endl; +cout << p1.use_count() << endl; +return 0; +} +------------------------------------ +class Test { +public: + Test() { + cout << "Test()" << endl; + } + ~Test() { + cout << "~Test()" << endl; + } + void Output() const { + cout << "Output()" << endl; + } +}; +int main() { + shared_ptr<Test> p1(new Test); + shared_ptr<Test> p2 = p1; + shared_ptr<Test> p3; + p3 = p1; + cout << p1.use_count() << endl; + return 0; +} +``` + +### weak_ptr + +``` +weak_ptr涓嶈兘鐙珛浣跨敤锛屽繀閰嶅悎shared_ptr浣跨敤锛� weak_ptr鏄负浜嗚В鍐硈hared_ptr鐨勫紩鐢ㄦ垚鐜棶棰樸�� +weak_ptr鍙繘琛屾祬鎷疯礉锛屽紩鐢ㄨ鏁颁笉浼氬彂鐢熸敼鍙樸�� + +#include <iostream> +#include <memory> +using namespace std; +class B; +class A +{ +public: +A() { cout << "A::A() called" << endl; } +~A() { cout << "A::~A() called" << endl; } +shared_ptr<B> p; //瑙e喅寮曠敤鎴愮幆闂锛屽皢shared_ptr鎹㈡垚weak_ptr +}; +-------------------------------------- +class B +{ +public: +B() { cout << "B::B() called" << endl; } +~B() { cout << "B::~B() called" << endl; } +shared_ptr<A> p; //瑙e喅寮曠敤鎴愮幆闂锛屽皢shared_ptr鎹㈡垚weak_ptr +}; +-------------------------------------------- +int main() +{ +shared_ptr<A> pA(new A); +shared_ptr<B> pB(new B); +//涓嬮潰涓ゅ彞瀵艰嚧浜咥涓嶣鐨勫惊鐜紩鐢紝缁撴灉灏辨槸A鍜孊瀵硅薄閮戒笉浼氭瀽鏋� +pA->p = pB; +pB->p = pA; +cout << "pA use_count: " << pA.use_count() << endl; +cout << "pB use_count: " << pB.use_count() << endl; +return 0; +} +``` + +``` +瑙e喅鏂规硶锛� +#include <iostream> +#include <memory> +using namespace std; +class B; +class A +{ +public: +聽聽聽聽A() { cout << "A::A() called" << endl; } +聽聽聽聽~A() { cout << "A::~A() called" << endl; } +聽聽聽聽weak_ptr<B> p; +}; +------------------------------ +class B +{ +public: +聽聽聽聽B() { cout << "B::B() called" << endl; } +聽聽聽聽~B() { cout << "B::~B() called" << endl; } +聽聽聽聽weak_ptr<A> p; //! +}; +------------------------------ +int main() +{ +聽聽聽聽shared_ptr<A> pA(new A); +聽聽聽聽shared_ptr<B> pB(new B); 聽聽聽聽pA->p = pB; +聽聽聽聽pB->p = pA; +聽聽聽聽cout << "pA use_count: " << pA.use_count() << endl; +聽聽聽聽cout << "pB use_count: " << pB.use_count() << endl; +聽聽聽聽return 0; +} +``` + +``` +甯歌浣跨敤锛� +#include <iostream> +#include <memory> +using namespace std; +int main() +{ +聽聽聽聽shared_ptr<int> p1(new int); +聽聽聽聽weak_ptr<int> w1(p1); +聽聽聽聽*p1 = 10; +聽聽聽聽shared_ptr<int> p2 = w1.lock(); +聽聽聽聽if (p2) { +聽聽聽聽聽聽聽聽cout << *p2 << endl; +聽聽聽聽} +聽聽聽聽return 0; +} + +``` + +### 瀹炵幇涓�涓櫤鑳芥寚閽� + +``` +#include <iostream> +#include <string> +using namespace std; +class Test{ +public: +Test() { + cout << "Test()" << endl; +} +~Test() { +cout << "~Test()" << endl; +} +void Output() const { +cout << "Output()" << endl; +} +}; +----------------------------------- +template <class T> +class AutoPtr +{ +public: +AutoPtr(T* ptr) { + this->ptr = ptr; +} +~AutoPtr() { + if (ptr != nullptr) delete ptr; +} +T& operator *() { + return *ptr; +} +T* get() { + return ptr; +} +T* operator->() { + return ptr; +} +------------------------------ +private: +AutoPtr(const AutoPtr&) = delete; +AutoPtr& operator=(const AutoPtr&) = delete; +private: +T* ptr; +}; +------------------------------------------- +int main() +{ +AutoPtr<Test> p1(new Test); +p1->Output(); +return 0; +} +``` + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +14銆� +### 1. `try...catch`璇彞 +`try...catch` 鏄疌++涓敤浜庢崟鑾峰拰澶勭悊寮傚父鐨勫熀鏈満鍒躲�傜▼搴忎腑鍙兘鎶涘嚭寮傚父鐨勪唬鐮佸潡鏀惧湪 `try` 鍧椾腑锛岃�岀敤浜庡鐞嗚繖浜涘紓甯哥殑浠g爜鍒欐斁鍦ㄥ搴旂殑 `catch` 鍧椾腑銆� + +#### 璇硶缁撴瀯 +```cpp +try { + // 鍙兘鎶涘嚭寮傚父鐨勪唬鐮� + // ... + throw exception_object; // 鎶涘嚭寮傚父瀵硅薄 +} +catch (ExceptionType1 e1) { + // 澶勭悊 ExceptionType1 绫诲瀷鐨勫紓甯� +} +catch (ExceptionType2 e2) { + // 澶勭悊 ExceptionType2 绫诲瀷鐨勫紓甯� +} +// 鍙互鏈夋洿澶氱殑 catch 鍧� +catch (...) { + // 澶勭悊鍏朵粬鏈槑纭崟鑾风殑寮傚父 +} +``` + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> + +double divide(double a, double b) { + if (b == 0) { + throw std::runtime_error("闄ゆ暟涓嶈兘涓洪浂"); + } + return a / b; +} + +int main() { + double num1 = 10.0, num2 = 0.0; + try { + double result = divide(num1, num2); + std::cout << "缁撴灉: " << result << std::endl; + } + catch (const std::runtime_error& e) { + std::cerr << "寮傚父: " << e.what() << std::endl; + } + return 0; +} +``` +鍦ㄤ笂杩颁唬鐮佷腑锛宍divide` 鍑芥暟鍦ㄩ櫎鏁颁负闆舵椂鎶涘嚭 `std::runtime_error` 寮傚父锛宍main` 鍑芥暟涓殑 `try` 鍧楄皟鐢� `divide` 鍑芥暟锛宍catch` 鍧楁崟鑾峰苟澶勭悊璇ュ紓甯搞�� + +### 2. 寮傚父妫�娴嬪伐鍏� +#### Valgrind +- **鍔熻兘**锛歏algrind鏄竴涓己澶х殑鍐呭瓨璋冭瘯鍜屾�ц兘鍒嗘瀽宸ュ叿濂椾欢锛屽叾涓殑 `Memcheck` 宸ュ叿鍙互妫�娴嬬▼搴忎腑鐨勫唴瀛橀敊璇紝鍖呮嫭鍐呭瓨娉勬紡銆佷娇鐢ㄦ湭鍒濆鍖栫殑鍐呭瓨銆佽秺鐣岃闂瓑銆傚悓鏃讹紝瀹冧篃鑳藉府鍔╁彂鐜颁竴浜涘彲鑳藉鑷村紓甯哥殑鍐呭瓨闂銆� +- **浣跨敤绀轰緥**锛氬亣璁剧紪璇戠敓鎴愮殑鍙墽琛屾枃浠跺悕涓� `my_program`锛屽湪缁堢涓繍琛屼互涓嬪懡浠わ細 +```bash +valgrind --leak-check=full ./my_program +``` +杩欎細璁� Valgrind 瀵� `my_program` 杩涜鍏ㄩ潰鐨勫唴瀛樻鏌ワ紝骞惰緭鍑鸿缁嗙殑鍐呭瓨閿欒鍜屾硠婕忎俊鎭�� + +#### AddressSanitizer锛圓San锛� +- **鍔熻兘**锛欰ddressSanitizer 鏄竴涓揩閫熺殑鍐呭瓨閿欒妫�娴嬪伐鍏凤紝闆嗘垚鍦� GCC 鍜� Clang 缂栬瘧鍣ㄤ腑銆傚畠鍙互妫�娴嬪爢銆佹爤鍜屽叏灞�鍐呭瓨鐨勮秺鐣岃闂�佷娇鐢ㄥ凡閲婃斁鐨勫唴瀛樼瓑闂锛岃兘鏈夋晥甯姪鍙戠幇鍙兘寮曞彂寮傚父鐨勫唴瀛橀敊璇�� +- **浣跨敤绀轰緥**锛氱紪璇戞椂娣诲姞鐩稿簲鐨勭紪璇戦�夐」锛屼互 GCC 涓轰緥锛� +```bash +g++ -fsanitize=address -g your_program.cpp -o your_program +``` +鐒跺悗杩愯鐢熸垚鐨勫彲鎵ц鏂囦欢锛岃嫢瀛樺湪鍐呭瓨閿欒锛孉San 浼氳緭鍑鸿缁嗙殑閿欒淇℃伅銆� + +### 3. 鍐呭瓨娉勬紡妫�娴嬪伐鍏� +#### Valgrind锛圡emcheck锛� +- **鍘熺悊**锛歁emcheck 浼氳窡韪▼搴忎腑鎵�鏈夌殑鍐呭瓨鍒嗛厤鍜岄噴鏀炬搷浣滐紝鍦ㄧ▼搴忕粨鏉熸椂妫�鏌ユ槸鍚﹀瓨鍦ㄥ凡鍒嗛厤浣嗘湭閲婃斁鐨勫唴瀛樺潡銆� +- **绀轰緥杈撳嚭鍒嗘瀽**锛氬綋杩愯 `valgrind --leak-check=full ./my_program` 鍚庯紝濡傛灉瀛樺湪鍐呭瓨娉勬紡锛孷algrind 浼氳緭鍑虹被浼煎涓嬩俊鎭細 +```plaintext +==1234== LEAK SUMMARY: +==1234== definitely lost: 4 bytes in 1 blocks +==1234== indirectly lost: 0 bytes in 0 blocks +==1234== possibly lost: 0 bytes in 0 blocks +==1234== still reachable: 0 bytes in 0 blocks +==1234== suppressed: 0 bytes in 0 blocks +``` +杩欒〃鏄庣▼搴忎腑瀛樺湪 4 瀛楄妭鐨勭‘瀹氬唴瀛樻硠婕忋�� + +#### LeakSanitizer锛圠San锛� +- **鍔熻兘**锛歀eakSanitizer 鏄竴涓唴瀛樻硠婕忔娴嬪伐鍏凤紝鍚屾牱闆嗘垚鍦� GCC 鍜� Clang 缂栬瘧鍣ㄤ腑銆傚畠鑳藉湪绋嬪簭缁撴潫鏃惰嚜鍔ㄦ娴嬪苟鎶ュ憡鍐呭瓨娉勬紡鎯呭喌銆� +- **浣跨敤绀轰緥**锛氱紪璇戞椂娣诲姞鐩稿簲鐨勭紪璇戦�夐」锛屼互 Clang 涓轰緥锛� +```bash +clang++ -fsanitize=leak -g your_program.cpp -o your_program +``` +杩愯绋嬪簭鍚庯紝鑻ュ瓨鍦ㄥ唴瀛樻硠婕忥紝LSan 浼氳緭鍑鸿缁嗙殑娉勬紡淇℃伅銆� + +### 4. 瀹夊叏鍑芥暟 +#### `strcpy_s` 鍜� `strncpy_s` +- **浣滅敤**锛氬湪C++涓紝浼犵粺鐨� `strcpy` 鍜� `strncpy` 鍑芥暟瀛樺湪缂撳啿鍖烘孩鍑虹殑椋庨櫓锛岃�� `strcpy_s` 鍜� `strncpy_s` 鏄洿瀹夊叏鐨勬浛浠e嚱鏁般�俙strcpy_s` 鐢ㄤ簬灏嗕竴涓瓧绗︿覆澶嶅埗鍒板彟涓�涓瓧绗︿覆缂撳啿鍖猴紝鍚屾椂浼氭鏌ョ洰鏍囩紦鍐插尯鐨勫ぇ灏忥紝閬垮厤婧㈠嚭锛沗strncpy_s` 鍒欏湪澶嶅埗鎸囧畾闀垮害鐨勫瓧绗︽椂涔熶細杩涜绫讳技鐨勬鏌ャ�� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> +#include <cstring> + +int main() { + char dest[10]; + const char* src = "Hello"; + errno_t result = strcpy_s(dest, sizeof(dest), src); + if (result == 0) { + std::cout << "澶嶅埗鎴愬姛: " << dest << std::endl; + } else { + std::cerr << "澶嶅埗澶辫触" << std::endl; + } + return 0; +} +``` + +#### `sprintf_s` +- **浣滅敤**锛歚sprintf` 鍑芥暟鍦ㄦ牸寮忓寲瀛楃涓插苟杈撳嚭鍒扮紦鍐插尯鏃跺彲鑳戒細瀵艰嚧缂撳啿鍖烘孩鍑猴紝`sprintf_s` 鍒欐槸鍏跺畨鍏ㄧ増鏈�傚畠浼氭鏌ョ洰鏍囩紦鍐插尯鐨勫ぇ灏忥紝纭繚涓嶄細鍙戠敓婧㈠嚭銆� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> +#include <cstdio> + +int main() { + char buffer[20]; + int num = 123; + errno_t result = sprintf_s(buffer, sizeof(buffer), "鏁板瓧鏄�: %d", num); + if (result > 0) { + std::cout << "鏍煎紡鍖栨垚鍔�: " << buffer << std::endl; + } else { + std::cerr << "鏍煎紡鍖栧け璐�" << std::endl; + } + return 0; +} +``` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +15銆� +### 鍗曚緥妯″紡 +鍗曚緥妯″紡纭繚涓�涓被鍙湁涓�涓疄渚嬶紝骞舵彁渚涗竴涓叏灞�璁块棶鐐规潵鑾峰彇杩欎釜瀹炰緥銆� + +#### 楗挎眽寮忓崟渚嬫ā寮� +- **鐗圭偣**锛氬湪绋嬪簭鍚姩鏃跺氨鍒涘缓鍗曚緥瀹炰緥锛岀嚎绋嬪畨鍏紝鏃犻渶鑰冭檻澶氱嚎绋嬪苟鍙戦棶棰橈紝浣嗗彲鑳戒細瀵艰嚧璧勬簮娴垂锛屽洜涓烘棤璁烘槸鍚︿娇鐢ㄨ瀹炰緥锛屽畠閮戒細琚垱寤恒�� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> + +class SingletonHungry { +private: + // 鏋勯�犲嚱鏁扮鏈夊寲锛岄槻姝㈠閮ㄥ垱寤哄璞� + SingletonHungry() {} + // 闈欐�佹垚鍛樺彉閲忥紝鍦ㄧ被鍔犺浇鏃跺氨鍒涘缓瀹炰緥 + static SingletonHungry instance; + +public: + // 鎻愪緵鍏ㄥ眬璁块棶鐐� + static SingletonHungry& getInstance() { + return instance; + } + + void doSomething() { + std::cout << "楗挎眽寮忓崟渚嬫ā寮忔墽琛屾搷浣�" << std::endl; + } +}; + +// 鍒濆鍖栭潤鎬佹垚鍛樺彉閲� +SingletonHungry SingletonHungry::instance; + +int main() { + SingletonHungry& singleton = SingletonHungry::getInstance(); + singleton.doSomething(); + return 0; +} +``` + +#### 鎳掓眽寮忓崟渚嬫ā寮� +- **鐗圭偣**锛氬湪绗竴娆′娇鐢ㄦ椂鎵嶅垱寤哄崟渚嬪疄渚嬶紝閬垮厤浜嗚祫婧愭氮璐癸紝浣嗗湪澶氱嚎绋嬬幆澧冧笅闇�瑕佽�冭檻绾跨▼瀹夊叏闂銆� +- **绀轰緥浠g爜锛堥潪绾跨▼瀹夊叏锛�**锛� +```cpp +#include <iostream> + +class SingletonLazy { +private: + // 鏋勯�犲嚱鏁扮鏈夊寲 + SingletonLazy() {} + // 闈欐�佹垚鍛樻寚閽堬紝鍒濆鍖栦负 nullptr + static SingletonLazy* instance; + +public: + // 鎻愪緵鍏ㄥ眬璁块棶鐐� + static SingletonLazy* getInstance() { + if (instance == nullptr) { + instance = new SingletonLazy(); + } + return instance; + } + + void doSomething() { + std::cout << "鎳掓眽寮忓崟渚嬫ā寮忔墽琛屾搷浣�" << std::endl; + } +}; + +// 鍒濆鍖栭潤鎬佹垚鍛樻寚閽� +SingletonLazy* SingletonLazy::instance = nullptr; + +int main() { + SingletonLazy* singleton = SingletonLazy::getInstance(); + singleton->doSomething(); + return 0; +} +``` +- **绀轰緥浠g爜锛堢嚎绋嬪畨鍏紝浣跨敤鍙岄噸妫�鏌ラ攣瀹氾級**锛� +```cpp +#include <iostream> +#include <mutex> + +class SingletonLazyThreadSafe { +private: + // 鏋勯�犲嚱鏁扮鏈夊寲 + SingletonLazyThreadSafe() {} + // 闈欐�佹垚鍛樻寚閽堬紝鍒濆鍖栦负 nullptr + static SingletonLazyThreadSafe* instance; + // 浜掓枼閿侊紝鐢ㄤ簬绾跨▼鍚屾 + static std::mutex mtx; + +public: + // 鎻愪緵鍏ㄥ眬璁块棶鐐� + static SingletonLazyThreadSafe* getInstance() { + if (instance == nullptr) { + std::lock_guard<std::mutex> lock(mtx); + if (instance == nullptr) { + instance = new SingletonLazyThreadSafe(); + } + } + return instance; + } + + void doSomething() { + std::cout << "绾跨▼瀹夊叏鐨勬噿姹夊紡鍗曚緥妯″紡鎵ц鎿嶄綔" << std::endl; + } +}; + +// 鍒濆鍖栭潤鎬佹垚鍛樻寚閽堝拰浜掓枼閿� +SingletonLazyThreadSafe* SingletonLazyThreadSafe::instance = nullptr; +std::mutex SingletonLazyThreadSafe::mtx; + +int main() { + SingletonLazyThreadSafe* singleton = SingletonLazyThreadSafe::getInstance(); + singleton->doSomething(); + return 0; +} +``` + +### 宸ュ巶妯″紡 + +#### 绠�鍗曞伐鍘傛ā寮� +- **鐗圭偣**锛氬畾涔変竴涓伐鍘傜被锛屾牴鎹紶鍏ョ殑鍙傛暟鍐冲畾鍒涘缓鍝鍏蜂綋浜у搧绫荤殑瀹炰緥銆傚畠灏嗗璞$殑鍒涘缓鍜屼娇鐢ㄥ垎绂伙紝浣嗕笉绗﹀悎寮�闂師鍒欙紙瀵规墿灞曞紑鏀撅紝瀵逛慨鏀瑰叧闂級锛屽洜涓烘坊鍔犳柊鐨勪骇鍝佺被鏃堕渶瑕佷慨鏀瑰伐鍘傜被鐨勪唬鐮併�� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> + +// 鎶借薄浜у搧绫� +class Product { +public: + virtual void use() = 0; + virtual ~Product() {} +}; + +// 鍏蜂綋浜у搧绫� A +class ConcreteProductA : public Product { +public: + void use() override { + std::cout << "浣跨敤浜у搧 A" << std::endl; + } +}; + +// 鍏蜂綋浜у搧绫� B +class ConcreteProductB : public Product { +public: + void use() override { + std::cout << "浣跨敤浜у搧 B" << std::endl; + } +}; + +// 绠�鍗曞伐鍘傜被 +class SimpleFactory { +public: + static Product* createProduct(const std::string& type) { + if (type == "A") { + return new ConcreteProductA(); + } else if (type == "B") { + return new ConcreteProductB(); + } + return nullptr; + } +}; + +int main() { + Product* productA = SimpleFactory::createProduct("A"); + if (productA) { + productA->use(); + delete productA; + } + + Product* productB = SimpleFactory::createProduct("B"); + if (productB) { + productB->use(); + delete productB; + } + + return 0; +} +``` + +#### 宸ュ巶鏂规硶妯″紡 +- **鐗圭偣**锛氬畾涔変竴涓垱寤哄璞$殑鎶借薄鏂规硶锛岃瀛愮被鍐冲畾瀹炰緥鍖栧摢涓叿浣撲骇鍝佺被銆傚畠绗﹀悎寮�闂師鍒欙紝娣诲姞鏂扮殑浜у搧绫绘椂鍙渶鍒涘缓瀵瑰簲鐨勫叿浣撳伐鍘傚瓙绫伙紝鑰屾棤闇�淇敼鐜版湁浠g爜銆� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> + +// 鎶借薄浜у搧绫� +class Product { +public: + virtual void use() = 0; + virtual ~Product() {} +}; + +// 鍏蜂綋浜у搧绫� A +class ConcreteProductA : public Product { +public: + void use() override { + std::cout << "浣跨敤浜у搧 A" << std::endl; + } +}; + +// 鍏蜂綋浜у搧绫� B +class ConcreteProductB : public Product { +public: + void use() override { + std::cout << "浣跨敤浜у搧 B" << std::endl; + } +}; + +// 鎶借薄宸ュ巶绫� +class Factory { +public: + virtual Product* createProduct() = 0; + virtual ~Factory() {} +}; + +// 鍏蜂綋宸ュ巶绫� A +class ConcreteFactoryA : public Factory { +public: + Product* createProduct() override { + return new ConcreteProductA(); + } +}; + +// 鍏蜂綋宸ュ巶绫� B +class ConcreteFactoryB : public Factory { +public: + Product* createProduct() override { + return new ConcreteProductB(); + } +}; + +int main() { + Factory* factoryA = new ConcreteFactoryA(); + Product* productA = factoryA->createProduct(); + if (productA) { + productA->use(); + delete productA; + } + delete factoryA; + + Factory* factoryB = new ConcreteFactoryB(); + Product* productB = factoryB->createProduct(); + if (productB) { + productB->use(); + delete productB; + } + delete factoryB; + + return 0; +} +``` + +#### 鎶借薄宸ュ巶妯″紡 +- **鐗圭偣**锛氭彁渚涗竴涓垱寤轰竴绯诲垪鐩稿叧鎴栫浉浜掍緷璧栧璞$殑鎺ュ彛锛岃�屾棤闇�鎸囧畾瀹冧滑鍏蜂綋鐨勭被銆傚畠鍙互鍒涘缓澶氫釜涓嶅悓绫诲瀷鐨勪骇鍝侊紝閫傜敤浜庡垱寤轰骇鍝佹棌鐨勫満鏅�� +- **绀轰緥浠g爜**锛� +```cpp +#include <iostream> + +// 鎶借薄浜у搧绫� A +class AbstractProductA { +public: + virtual void useA() = 0; + virtual ~AbstractProductA() {} +}; + +// 鍏蜂綋浜у搧绫� A1 +class ConcreteProductA1 : public AbstractProductA { +public: + void useA() override { + std::cout << "浣跨敤浜у搧 A1" << std::endl; + } +}; + +// 鍏蜂綋浜у搧绫� A2 +class ConcreteProductA2 : public AbstractProductA { +public: + void useA() override { + std::cout << "浣跨敤浜у搧 A2" << std::endl; + } +}; + +// 鎶借薄浜у搧绫� B +class AbstractProductB { +public: + virtual void useB() = 0; + virtual ~AbstractProductB() {} +}; + +// 鍏蜂綋浜у搧绫� B1 +class ConcreteProductB1 : public AbstractProductB { +public: + void useB() override { + std::cout << "浣跨敤浜у搧 B1" << std::endl; + } +}; + +// 鍏蜂綋浜у搧绫� B2 +class ConcreteProductB2 : public AbstractProductB { +public: + void useB() override { + std::cout << "浣跨敤浜у搧 B2" << std::endl; + } +}; + +// 鎶借薄宸ュ巶绫� +class AbstractFactory { +public: + virtual AbstractProductA* createProductA() = 0; + virtual AbstractProductB* createProductB() = 0; + virtual ~AbstractFactory() {} +}; + +// 鍏蜂綋宸ュ巶绫� 1 +class ConcreteFactory1 : public AbstractFactory { +public: + AbstractProductA* createProductA() override { + return new ConcreteProductA1(); + } + AbstractProductB* createProductB() override { + return new ConcreteProductB1(); + } +}; + +// 鍏蜂綋宸ュ巶绫� 2 +class ConcreteFactory2 : public AbstractFactory { +public: + AbstractProductA* createProductA() override { + return new ConcreteProductA2(); + } + AbstractProductB* createProductB() override { + return new ConcreteProductB2(); + } +}; + +int main() { + AbstractFactory* factory1 = new ConcreteFactory1(); + AbstractProductA* productA1 = factory1->createProductA(); + AbstractProductB* productB1 = factory1->createProductB(); + if (productA1) { + productA1->useA(); + delete productA1; + } + if (productB1) { + productB1->useB(); + delete productB1; + } + delete factory1; + + AbstractFactory* factory2 = new ConcreteFactory2(); + AbstractProductA* productA2 = factory2->createProductA(); + AbstractProductB* productB2 = factory2->createProductB(); + if (productA2) { + productA2->useA(); + delete productA2; + } + if (productB2) { + productB2->useB(); + delete productB2; + } + delete factory2; + + return 0; +} +``` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +16銆� +### Boost澶氱嚎绋嬬壒鎬� + +#### 姒傝堪 +Boost.Thread搴撲负C++鎻愪緵浜嗚法骞冲彴鐨勫绾跨▼鏀寔锛屽畠灏佽浜嗗簳灞傛搷浣滅郴缁熺殑绾跨▼鏈哄埗锛屼娇寰楀湪涓嶅悓鎿嶄綔绯荤粺涓婄紪鍐欏绾跨▼绋嬪簭鍙樺緱鏇村姞绠�鍗曞拰缁熶竴銆� + +#### 绀轰緥浠g爜 +浠ヤ笅绀轰緥灞曠ず浜嗗浣曚娇鐢˙oost.Thread鍒涘缓鍜岀鐞嗙嚎绋嬶細 +```cpp +#include <iostream> +#include <boost/thread.hpp> + +// 绾跨▼鍑芥暟 +void threadFunction() { + for (int i = 0; i < 5; ++i) { + std::cout << "瀛愮嚎绋�: " << i << std::endl; + boost::this_thread::sleep(boost::posix_time::seconds(1)); + } +} + +int main() { + // 鍒涘缓绾跨▼瀵硅薄 + boost::thread t(threadFunction); + + // 涓荤嚎绋嬫墽琛岀殑浠g爜 + for (int i = 0; i < 3; ++i) { + std::cout << "涓荤嚎绋�: " << i << std::endl; + boost::this_thread::sleep(boost::posix_time::seconds(1)); + } + + // 绛夊緟瀛愮嚎绋嬬粨鏉� + t.join(); + + std::cout << "涓荤嚎绋嬬粨鏉�" << std::endl; + return 0; +} +``` + +#### 浠g爜瑙i噴 +1. **绾跨▼鍑芥暟**锛歚threadFunction` 鏄竴涓櫘閫氱殑鍑芥暟锛屽畠灏嗗湪鏂扮嚎绋嬩腑鎵ц銆傚湪杩欎釜鍑芥暟涓紝鎴戜滑浣跨敤 `boost::this_thread::sleep` 鍑芥暟璁╃嚎绋嬩紤鐪�1绉掋�� +2. **鍒涘缓绾跨▼**锛氶�氳繃 `boost::thread t(threadFunction);` 鍒涘缓涓�涓柊绾跨▼锛屽苟灏� `threadFunction` 浣滀负绾跨▼鐨勫叆鍙g偣銆� +3. **涓荤嚎绋嬫墽琛�**锛氫富绾跨▼缁х画鎵ц鑷繁鐨勪唬鐮侊紝鍚屾牱浣跨敤 `boost::this_thread::sleep` 鍑芥暟璁╃嚎绋嬩紤鐪�1绉掋�� +4. **绛夊緟绾跨▼缁撴潫**锛氫娇鐢� `t.join()` 鍑芥暟绛夊緟瀛愮嚎绋嬫墽琛屽畬姣曪紝纭繚涓荤嚎绋嬪湪瀛愮嚎绋嬬粨鏉熷悗鎵嶉��鍑恒�� + +### Boost Socket鐗规�� + +#### 姒傝堪 +Boost.Asio搴撴槸Boost涓敤浜庣綉缁滅紪绋嬬殑搴擄紝鎻愪緵浜嗗紓姝/O鎿嶄綔鐨勬敮鎸侊紝鍖呮嫭Socket缂栫▼銆傚畠鍙互鐢ㄤ簬鍒涘缓TCP銆乁DP绛夊悇绉嶇被鍨嬬殑缃戠粶搴旂敤绋嬪簭銆� + +#### TCP鏈嶅姟鍣ㄧず渚嬩唬鐮� +```cpp +#include <iostream> +#include <boost/asio.hpp> + +using boost::asio::ip::tcp; + +// 澶勭悊瀹㈡埛绔繛鎺ョ殑鍑芥暟 +void handleConnection(tcp::socket socket) { + try { + boost::asio::streambuf buffer; + boost::asio::read_until(socket, buffer, '\n'); + + std::istream is(&buffer); + std::string line; + std::getline(is, line); + + std::cout << "鎺ユ敹鍒板鎴风娑堟伅: " << line << std::endl; + + std::string response = "鏈嶅姟鍣ㄥ凡鏀跺埌娑堟伅: " + line + "\n"; + boost::asio::write(socket, boost::asio::buffer(response)); + } + catch (std::exception& e) { + std::cerr << "寮傚父: " << e.what() << std::endl; + } +} + +int main() { + try { + boost::asio::io_context io_context; + tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 12345)); + + while (true) { + tcp::socket socket(io_context); + acceptor.accept(socket); + handleConnection(std::move(socket)); + } + } + catch (std::exception& e) { + std::cerr << "寮傚父: " << e.what() << std::endl; + } + + return 0; +} +``` + +#### TCP瀹㈡埛绔ず渚嬩唬鐮� +```cpp +#include <iostream> +#include <boost/asio.hpp> + +using boost::asio::ip::tcp; + +int main() { + try { + boost::asio::io_context io_context; + tcp::socket socket(io_context); + tcp::resolver resolver(io_context); + boost::asio::connect(socket, resolver.resolve("127.0.0.1", "12345")); + + std::string message = "Hello, Server!\n"; + boost::asio::write(socket, boost::asio::buffer(message)); + + boost::asio::streambuf buffer; + boost::asio::read_until(socket, buffer, '\n'); + + std::istream is(&buffer); + std::string line; + std::getline(is, line); + + std::cout << "鏀跺埌鏈嶅姟鍣ㄥ搷搴�: " << line << std::endl; + } + catch (std::exception& e) { + std::cerr << "寮傚父: " << e.what() << std::endl; + } + + return 0; +} +``` + +#### 浠g爜瑙i噴 + +##### 鏈嶅姟鍣ㄧ +1. **鍒涘缓 `io_context`**锛歚boost::asio::io_context` 鏄疊oost.Asio搴撶殑鏍稿績瀵硅薄锛岀敤浜庣鐞嗘墍鏈夌殑寮傛鎿嶄綔銆� +2. **鍒涘缓 `acceptor`**锛歚tcp::acceptor` 鐢ㄤ簬鐩戝惉鎸囧畾绔彛鐨勮繛鎺ヨ姹傘�� +3. **鎺ュ彈杩炴帴**锛氫娇鐢� `acceptor.accept(socket)` 鎺ュ彈瀹㈡埛绔殑杩炴帴璇锋眰锛屽苟灏嗚繛鎺ョ殑濂楁帴瀛椾紶閫掔粰 `handleConnection` 鍑芥暟澶勭悊銆� +4. **澶勭悊杩炴帴**锛歚handleConnection` 鍑芥暟璐熻矗璇诲彇瀹㈡埛绔彂閫佺殑娑堟伅锛屽苟鍚戝鎴风鍙戦�佸搷搴斻�� + +##### 瀹㈡埛绔� +1. **鍒涘缓 `io_context` 鍜� `socket`**锛氬悓鏍烽渶瑕佸垱寤� `io_context` 鍜� `tcp::socket` 瀵硅薄銆� +2. **瑙f瀽鏈嶅姟鍣ㄥ湴鍧�**锛氫娇鐢� `tcp::resolver` 瑙f瀽鏈嶅姟鍣ㄧ殑鍦板潃鍜岀鍙c�� +3. **杩炴帴鏈嶅姟鍣�**锛氫娇鐢� `boost::asio::connect` 鍑芥暟杩炴帴鍒版湇鍔″櫒銆� +4. **鍙戦�佸拰鎺ユ敹娑堟伅**锛氫娇鐢� `boost::asio::write` 鍑芥暟鍚戞湇鍔″櫒鍙戦�佹秷鎭紝浣跨敤 `boost::asio::read_until` 鍑芥暟璇诲彇鏈嶅姟鍣ㄧ殑鍝嶅簲銆� + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +17銆� + 绾跨▼闂寸殑閫氫俊 + 1銆佸叏灞�鍙橀噺 + 2銆佷俊鍙锋Ы + 3銆佹秷鎭槦鍒� + 4銆佺閬揫鍖垮悕绠¢亾銆佸懡鍚嶇閬揮 + + 杩涚▼闂寸殑閫氫俊 + 鍓嶆彁鏉′欢锛� + 杩涚▼闂寸殑鍐呭瓨鏄浉浜掔嫭绔嬬殑锛屾瘡涓繘绋嬮兘鏄嫭绔嬬殑鍐呭瓨绌洪棿 + 閫氫俊鏂瑰紡锛� + 1銆佸叡浜唴瀛�--璁板緱涓婇攣鎺掗槦澶勭悊--鏈�蹇� + 2銆佹秷鎭槦鍒� + 3銆佺閬� + 4銆乻ocket--tcp銆乽dp鍗忚--璺ㄥ钩鍙般�佽法鐢佃剳 + 5銆佸壀鍒囨澘 + 6銆丏-BUS锛氭槸涓�绉嶄俊鍙锋Ы鐨勬墿灞� + + Qt: + 绫伙細<QProcess> + API锛歴tart("鍚嶅瓧鎴栧畬鏁磋矾寰�")锛岃繕鍙互甯﹀惎鍔ㄥ弬鏁版潵鍚姩 + + + 姝婚攣闂 + 澶氱嚎绋�--璁块棶鍚屼竴涓祫婧怺涓寸晫璧勬簮]--浜夊ず璧勬簮銆佽剰鏁版嵁--涓婇攣:浜掓枼閿併�佷俊鍙烽噺銆佹潯浠跺彉閲忕瓑--浜掓枼鐨勬儏鍐典笅--鍙兘浜х敓姝婚攣 + + 姝婚攣鐜拌薄锛� + 1銆佷竴鎶婁簰鏂ラ攣锛岃繛缁�2娆ock鎴栬�呭紓甯哥粨鏉燂紝閮戒細瀵艰嚧姝婚攣 + 2銆佷袱鎶婁簰鏂ラ攣锛屼袱鏉$嚎绋嬶紝鍚勮嚜閿佷笂涔嬪悗锛岃繕鎯虫嬁澶氭柟鐨勯攣锛屽氨浼氬鑷寸浉浜掔瓑寰呯殑姝婚攣锛� + + + 姝婚攣鏉′欢锛�4涓繀瑕佹潯浠� + 1銆佷簰鏂ユ潯浠� + 2銆佽姹備繚鎸� + 3銆佷笉鍙墺澶� + 4銆佸惊鐜瓑寰� + 蹇呴』瑕佹弧瓒�4涓潯浠舵墠浼氬鑷存閿併�� + + 姝婚攣瑙e喅鏂规锛� + 鐮村潖褰㈡垚姝婚攣鐨勪换鎰忔潯浠跺嵆鍙紝濡傦細鎾ら攢绾跨▼銆佸墺澶鸿祫婧愩�佽秴鏃剁瓑寰呯瓑 + + 棰勯槻姝婚攣锛� + 1銆侀摱琛屽绠楁硶--鍋氳祫婧愮殑鍚堢悊鍒嗛厤 + 2銆佸紓甯告閿佺殑棰勯槻锛氫娇鐢ㄥ畧鍗攣鎴栬�呭敮涓�閿侊紝鏉ヨ嚜鍔ㄤ笂閿併�佽В閿併�� + + + 浠诲姟锛� + 1銆佽繘绋嬮棿鐨勯�氫俊鏂瑰紡锛氬叡浜唴瀛樼殑绀轰緥锛屾妸绀轰緥浠g爜瀹屽杽骞舵祴璇曢�氳繃 + 鎻愮ず锛氶渶瑕佸紑2涓繘绋嬫潵娴嬭瘯 + + 2銆佽璁℃ā寮忕殑鎺屾彙锛氬崟渚嬫ā寮忋�佸伐鍘傛ā寮忋�佽瀵熻�呮ā寮忕殑鍘熺悊鍙婂疄鐜颁唬鐮侊紱 + + + + +========================================================================================================================================================================================================================= +18銆� 蹇冭烦妫�娴嬶細 + 浣滅敤锛氫负浜嗗闀胯繛鎺ヨ繘琛屼繚娲伙紝骞朵笖鑳藉幓闄ゆ棤鐢ㄨ繛鎺� + 杩樿兘鍋氬埌鏂嚎閲嶈繛--閽堝瀹㈡埛绔� + + tcp鏈韩鏄湁涓�涓猭eep-alive淇濇椿鐘舵�侊紝榛樿鏄�2涓皬鏃� + 鐢变簬榛樿鐨勬椂闂村お涔咃紝婊¤冻涓嶄簡鎴戜滑鐨勪笟鍔¢渶姹傦紝鎵�浠ヨ閲嶈涓�涓績璺虫娴嬨�� + + -------------------------- + 瑕佸疄鐜板績璺虫娴嬶紝闇�瑕佸湪鏈嶅姟绔拰瀹㈡埛绔繘琛岀浉搴旂殑澶勭悊锛� + 瑕佸湪30绉掑唴杩涜淇濇椿妫�娴嬶紱 + 鏈嶅姟绔細 + 瀹瑰櫒锛歮ap<濂楁帴瀛�,闃堝��> map<SOCKET,int> // 闃堝�� -- 涓寸晫鍊� + 鐒跺悗浣跨敤绾跨▼瀹氭椂杞瀹瑰櫒杩涜鐩稿簲鐨勫鐞嗭紱 + 瀵瑰鍣ㄨ繘琛屽鍒犳敼鏌ョ殑鎿嶄綔锛� + 澧烇細accept 鎴愬姛涔嬪悗 + 鍒狅細闃堝�间负0鏃讹紝鍏堝叧闂鎺ュ瓧锛屽啀鍒犻櫎閿�煎 + 鏀癸細閬嶅巻鏃剁殑閫掑噺锛涙敹鍒版甯稿寘鏃堕噸缃槇鍊� + 鏌ワ細瀹氭椂閬嶅巻锛岄渶瑕佸崟鐙捣涓�鏉$嚎绋嬫潵閬嶅巻map + + + + 瀹㈡埛绔細 + 璧蜂竴鏉$嚎绋嬫潵瀹氭椂鍙戝績璺冲寘锛� + 璁惧畾涓�涓槇鍊兼潵鍒ゆ柇鏈嶅姟鍣ㄦ槸鍚﹀洖鍝嶅簲锛岃嫢鍙戠幇鏈嶅姟鍣ㄤ竴鐩翠笉鍝嶅簲锛岄渶瑕佹柇绾块噸杩烇紱 + ============================================================================================================================ + dyc------------------------------------- + -------------------------------------------- + en + 鏃剁殑 + -------------- + 閫氱煡鎵�鏈夊湪绾跨殑瀹㈡埛绔� + 鍓嶆彁鏄鎴风鍦ㄧ嚎 + -------------------- + PC鏈哄櫒涓� + ------------------鏃剁殑 杩炵殑鏃堕暱杩炴帴 + 銆愭弿杩扮晫闈㈡晥鏋溿�� + 鑷繁鍋氱殑 + ------------------- + 涓�鐩村湪缁存姢鏇存柊 鏈夊晢鐢ㄧ殑 + ---------------------- + 銆愬垰鍒氬惉閿欎簡銆� + ----------------------- + 銆愭寜鍓ф湰鏉ャ�� + ----------------------- + 娌″暐闂 + ----------------- + 銆愬惞璧锋潵銆� + qt 淇″彿妲� + mvd + socket + ------------------ + qt 澶氱嚎绋� + 鑷姩 榛樿 浼氳嚜鍔ㄥ垏鎹㈣繛鎺ワ紝鍗曠嚎 -- 鐩存帴锛屽绾跨▼--闃熷垪 + 鐩存帴 鍗曠嚎绋� + 闃熷垪 澶氱嚎绋� 寮傛 + 闃诲闃熷垪 澶氱嚎绋� 闃诲 + 鍞竴 闃叉閲嶅杩炴帴 + 灏辨槸闃叉澶氭杩炴帴鐨勬椂鍊欙紝鍙敓鏁堜竴涓繛鎺� + 濡傛灉浣跨敤鍏朵粬鐨勬柟寮忥紝杩炴帴鍑犳灏变細鐢熸晥鍑犳 + --------------------- + 浜嬩欢寰幆 + + 涓�鑸厛鍒扮埗閮ㄤ欢鐨勪簨浠惰繃婊ゅ櫒 + 鍐嶅埌瀛愰儴浠剁殑 event 鍑芥暟 + 鍐嶅埌瀛愰儴浠剁殑 鍏蜂綋鐨勪簨浠跺鐞嗗嚱鏁� + 濡傛灉瀵逛簨浠惰繘琛屽拷鐣ワ紝鍐嶈繑鍥炲埌鐖堕儴浠剁殑鍏蜂綋浜嬩欢澶勭悊 + -------------------- + mvd 妯″瀷瑙嗗浘 + + 涓�鑸暟鎹噺澶х殑鏃跺�� 浣跨敤 + 鐗瑰埆鏄娇鐢ㄤ簩缁磋〃鏍兼潵灞曠ず鏁版嵁鐨勬椂鍊欎娇鐢� + 璇村叿浣撳瓧姣� + M 妯″瀷 瀛樺偍鏁版嵁 + V 瑙嗗浘 鏄剧ず鏁版嵁 + D 浠g悊 鎻愪緵缂栬緫鍔熻兘 + mv鍏宠仈浣跨敤 setModel()鍑芥暟 + 璁剧疆涓�浜涢」鐨勫�� setItem() + ---------------------------------- + tcp鍗忚 + 绫伙細QTcpSocket 瀹㈡埛绔被 + APi锛� connectToHost 杩炴帴鏈嶅姟鍣� + 鍒ゆ柇杩炴帴鏄惁鎴愬姛 + 鍙戦�� write 鍑芥暟 + 鏀� read 鎴栬�� readAll + 闇�瑕佹湁涓帴鍙椾俊鍙� readyRead + 杩欎釜淇″彿鍜岃嚜瀹氫箟妲藉叧鑱旓紝妲介噷闈㈡敹鍖� + --------------------- + 銆愯�佸ぇ 娣卞懠鍚� 鎱㈡參鎺у埗浣犵殑鑴戝瓙 浣犵幇鍦ㄨ剳瀛愮┖鐧戒簡銆� + ----------------------------- + 鍙鏄紑鍙戠浉鍏崇殑 閮借 + C++ Qt 閮借 + -------------------- + 鎴戞搮闀� C++ qt + ---------------------------- + 缃戠粶 鐣岄潰 閮借 + 鍡� 鎿呴暱 QWidget + QML鐢ㄥ緱灏戜竴浜� 銆愬ソ濂藉康瀛楁瘝 鍒潃鎬ャ�� + -------------------- + 鍟ラ棶棰� + Git 鍛戒护琛� + --------------------------璇村晩 + 浠g爜涓轰富 鏈夋椂鍊欎篃鐢╭t 璁捐甯堟潵杈呭姪 + + 鏈夋椂鍊欎竴浜涘簳灞傚ぇ鐨勫簳鏉� 鐣岄潰鐩稿绠�鍗曠殑 + 浣跨敤璁捐甯堝伐鍏锋潵澶勭悊 + 澶嶆潅鐨勪娇鐢ㄧ函浠g爜鏉ュ疄鐜� + ------------------------------ + 灏辨槸鎴戞潵璐熻矗鐨�---銆愯璁″笀宸ュ叿 灏辨槸Qt Desinger銆� + ------------------- +---------------------------------------------------------------------------------------------------------------------------------------------------------- +19銆� +### 鏂囦欢娴佹搷浣� +C++ 鎻愪緵浜� `fstream` 搴撴潵杩涜鏂囦欢鐨勮鍐欐搷浣滐紝瀹冨寘鍚簡涓変釜涓昏鐨勭被锛歚ifstream`锛堢敤浜庤鍙栨枃浠讹級銆乣ofstream`锛堢敤浜庡啓鍏ユ枃浠讹級鍜� `fstream`锛堝彲鍚屾椂杩涜璇诲啓鎿嶄綔锛夈�� + +#### 绀轰緥浠g爜锛氭枃浠惰鍐� +```cpp +#include <iostream> +#include <fstream> +#include <string> + +int main() { + // 鍐欏叆鏂囦欢 + std::ofstream outFile("example.txt"); + if (outFile.is_open()) { + outFile << "Hello, File!" << std::endl; + outFile << "This is a test." << std::endl; + outFile.close(); + } else { + std::cerr << "鏃犳硶鎵撳紑鏂囦欢杩涜鍐欏叆銆�" << std::endl; + return 1; + } + + // 璇诲彇鏂囦欢 + std::ifstream inFile("example.txt"); + if (inFile.is_open()) { + std::string line; + while (std::getline(inFile, line)) { + std::cout << line << std::endl; + } + inFile.close(); + } else { + std::cerr << "鏃犳硶鎵撳紑鏂囦欢杩涜璇诲彇銆�" << std::endl; + return 1; + } + + return 0; +} +``` + +#### 浠g爜瑙i噴 +- `std::ofstream outFile("example.txt");`锛氬垱寤轰竴涓緭鍑烘枃浠舵祦瀵硅薄 `outFile`锛屽苟鎵撳紑 `example.txt` 鏂囦欢鐢ㄤ簬鍐欏叆銆� +- `outFile << "Hello, File!" << std::endl;`锛氬悜鏂囦欢涓啓鍏ユ暟鎹�� +- `std::ifstream inFile("example.txt");`锛氬垱寤轰竴涓緭鍏ユ枃浠舵祦瀵硅薄 `inFile`锛屽苟鎵撳紑 `example.txt` 鏂囦欢鐢ㄤ簬璇诲彇銆� +- `std::getline(inFile, line)`锛氶�愯璇诲彇鏂囦欢鍐呭銆� + +### 鏃ュ織鎿嶄綔 +鏃ュ織鎿嶄綔鏄褰曠▼搴忚繍琛岃繃绋嬩腑閲嶈淇℃伅鐨勪竴绉嶆柟寮忥紝鏈夊姪浜庤皟璇曞拰鐩戞帶绋嬪簭銆傚彲浠ラ�氳繃鑷畾涔夌被鏉ュ疄鐜扮畝鍗曠殑鏃ュ織鍔熻兘銆� + +#### 绀轰緥浠g爜锛氱畝鍗曟棩蹇楃被 +```cpp +#include <iostream> +#include <fstream> +#include <ctime> +#include <string> + +class Logger { +public: + Logger(const std::string& filename) : logFile(filename, std::ios::app) { + if (!logFile.is_open()) { + std::cerr << "鏃犳硶鎵撳紑鏃ュ織鏂囦欢銆�" << std::endl; + } + } + + ~Logger() { + if (logFile.is_open()) { + logFile.close(); + } + } + + void log(const std::string& message) { + if (logFile.is_open()) { + std::time_t now = std::time(nullptr); + char* dt = std::ctime(&now); + logFile << "[" << dt << "] " << message << std::endl; + } + } + +private: + std::ofstream logFile; +}; + +int main() { + Logger logger("app.log"); + logger.log("绋嬪簭鍚姩"); + logger.log("鎵ц鏌愪釜鎿嶄綔"); + logger.log("绋嬪簭缁撴潫"); + return 0; +} +``` + +#### 浠g爜瑙i噴 +- `Logger(const std::string& filename)`锛氭瀯閫犲嚱鏁帮紝鎵撳紑鎸囧畾鐨勬棩蹇楁枃浠跺苟浠ヨ拷鍔犳ā寮忓啓鍏ャ�� +- `void log(const std::string& message)`锛氳褰曟棩蹇椾俊鎭紝鍚屾椂娣诲姞褰撳墠鏃堕棿鎴炽�� +- `~Logger()`锛氭瀽鏋勫嚱鏁帮紝鍏抽棴鏃ュ織鏂囦欢銆� + +### XML 鏂囦欢鎿嶄綔 +鍙互浣跨敤绗笁鏂瑰簱濡� `pugixml` 鏉ヨ繘琛� XML 鏂囦欢鐨勮鍐欐搷浣溿�� + +#### 绀轰緥浠g爜锛氫娇鐢� `pugixml` 璇诲啓 XML 鏂囦欢 +```cpp +#include <iostream> +#include "pugixml.hpp" + +int main() { + // 鍒涘缓 XML 鏂囨。 + pugi::xml_document doc; + pugi::xml_node root = doc.append_child("root"); + pugi::xml_node child = root.append_child("child"); + child.append_attribute("name") = "example"; + child.text() = "Hello, XML!"; + + // 淇濆瓨 XML 鏂囨。鍒版枃浠� + if (doc.save_file("example.xml")) { + std::cout << "XML 鏂囦欢淇濆瓨鎴愬姛銆�" << std::endl; + } else { + std::cerr << "XML 鏂囦欢淇濆瓨澶辫触銆�" << std::endl; + return 1; + } + + // 璇诲彇 XML 鏂囦欢 + pugi::xml_document readDoc; + if (readDoc.load_file("example.xml")) { + pugi::xml_node readRoot = readDoc.child("root"); + pugi::xml_node readChild = readRoot.child("child"); + std::cout << "灞炴�у��: " << readChild.attribute("name").value() << std::endl; + std::cout << "鏂囨湰鍐呭: " << readChild.text().get() << std::endl; + } else { + std::cerr << "XML 鏂囦欢璇诲彇澶辫触銆�" << std::endl; + return 1; + } + + return 0; +} +``` + +#### 浠g爜瑙i噴 +- `pugi::xml_document doc;`锛氬垱寤轰竴涓� XML 鏂囨。瀵硅薄銆� +- `pugi::xml_node root = doc.append_child("root");`锛氭坊鍔犳牴鑺傜偣銆� +- `doc.save_file("example.xml");`锛氬皢 XML 鏂囨。淇濆瓨鍒版枃浠躲�� +- `readDoc.load_file("example.xml");`锛氫粠鏂囦欢涓姞杞� XML 鏂囨。銆� + +### JSON 鏁版嵁澶勭悊 +鍙互浣跨敤绗笁鏂瑰簱濡� `nlohmann/json` 鏉ヨ繘琛� JSON 鏁版嵁鐨勫鐞嗐�� + +#### 绀轰緥浠g爜锛氫娇鐢� `nlohmann/json` 澶勭悊 JSON 鏁版嵁 +```cpp +#include <iostream> +#include <fstream> +#include "json.hpp" + +using json = nlohmann::json; + +int main() { + // 鍒涘缓 JSON 瀵硅薄 + json j; + j["name"] = "John"; + j["age"] = 30; + j["hobbies"] = {"reading", "swimming", "running"}; + + // 灏� JSON 瀵硅薄鍐欏叆鏂囦欢 + std::ofstream outJsonFile("example.json"); + if (outJsonFile.is_open()) { + outJsonFile << j.dump(4); + outJsonFile.close(); + } else { + std::cerr << "鏃犳硶鎵撳紑鏂囦欢杩涜 JSON 鍐欏叆銆�" << std::endl; + return 1; + } + + // 浠庢枃浠朵腑璇诲彇 JSON 鏁版嵁 + std::ifstream inJsonFile("example.json"); + if (inJsonFile.is_open()) { + json readJ; + inJsonFile >> readJ; + std::cout << "濮撳悕: " << readJ["name"] << std::endl; + std::cout << "骞撮緞: " << readJ["age"] << std::endl; + std::cout << "鐖卞ソ: "; + for (const auto& hobby : readJ["hobbies"]) { + std::cout << hobby << " "; + } + std::cout << std::endl; + inJsonFile.close(); + } else { + std::cerr << "鏃犳硶鎵撳紑鏂囦欢杩涜 JSON 璇诲彇銆�" << std::endl; + return 1; + } + + return 0; +} +``` + +#### 浠g爜瑙i噴 +- `json j;`锛氬垱寤轰竴涓� JSON 瀵硅薄銆� +- `j["name"] = "John";`锛氬悜 JSON 瀵硅薄涓坊鍔犻敭鍊煎銆� +- `outJsonFile << j.dump(4);`锛氬皢 JSON 瀵硅薄浠ョ缉杩� 4 涓┖鏍肩殑鏍煎紡鍐欏叆鏂囦欢銆� +- `inJsonFile >> readJ;`锛氫粠鏂囦欢涓鍙� JSON 鏁版嵁鍒� `readJ` 瀵硅薄涓�� +---------------------------------------------------------------------------------------------------------------------------------------------------------- +20銆� +### 瀛︾敓绫荤殑鍗曞厓娴嬭瘯 + +```cpp +#include <iostream> +#include <string> +#include "gtest/gtest.h" + +// 瀛︾敓绫诲畾涔� +class Student { +public: + Student(const std::string& name, char gender, int age) + : name(name), gender(gender), age(age) {} + + std::string getName() const { + return name; + } + + char getGender() const { + return gender; + } + + int getAge() const { + return age; + } + +private: + std::string name; + char gender; + int age; +}; + +// 娴嬭瘯鐢ㄤ緥锛氭祴璇� Student 绫荤殑鏋勯�犲嚱鏁板拰鎴愬憳璁块棶鍑芥暟 +TEST(StudentTest, ConstructorAndGetters) { + Student student("Alice", 'F', 18); + EXPECT_EQ(student.getName(), "Alice"); + EXPECT_EQ(student.getGender(), 'F'); + EXPECT_EQ(student.getAge(), 18); +} +``` + +### 鑱旂郴浜虹被鐨勫崟鍏冩祴璇� + +```cpp +#include <iostream> +#include <string> +#include "gtest/gtest.h" + +// 鑱旂郴浜虹被瀹氫箟 +class Contact { +public: + Contact(const std::string& name, char gender, const std::string& phoneNumber) + : name(name), gender(gender), phoneNumber(phoneNumber) {} + + std::string getName() const { + return name; + } + + char getGender() const { + return gender; + } + + std::string getPhoneNumber() const { + return phoneNumber; + } + +private: + std::string name; + char gender; + std::string phoneNumber; +}; + +// 娴嬭瘯鐢ㄤ緥锛氭祴璇� Contact 绫荤殑鏋勯�犲嚱鏁板拰鎴愬憳璁块棶鍑芥暟 +TEST(ContactTest, ConstructorAndGetters) { + Contact contact("Bob", 'M', "1234567890"); + EXPECT_EQ(contact.getName(), "Bob"); + EXPECT_EQ(contact.getGender(), 'M'); + EXPECT_EQ(contact.getPhoneNumber(), "1234567890"); +} + +// 涓诲嚱鏁帮紝杩愯鎵�鏈夋祴璇� +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +``` + +### 浠g爜瑙i噴 +1. **鍖呭惈澶存枃浠�**锛氬紩鍏ユ墍闇�鐨勫ご鏂囦欢锛屽叾涓� `gtest/gtest.h` 鏄� Google Test 鐨勪富瑕佸ご鏂囦欢銆� +2. **瀹氫箟绫�**锛氳繖閲岄噸鏂板畾涔変簡瑕佹祴璇曠殑 `Student` 绫诲拰 `Contact` 绫伙紝瀹為檯椤圭洰涓紝杩欎簺绫诲彲鑳藉湪鍏朵粬澶存枃浠朵腑瀹氫箟銆� +3. **缂栧啓娴嬭瘯鐢ㄤ緥**锛� + - `TEST(StudentTest, ConstructorAndGetters)`锛氬畾涔変簡 `Student` 绫荤殑涓�涓祴璇曠敤渚嬶紝娴嬭瘯鏋勯�犲嚱鏁板拰鎴愬憳璁块棶鍑芥暟銆� + - `TEST(ContactTest, ConstructorAndGetters)`锛氫负 `Contact` 绫荤紪鍐欎簡绫讳技鐨勬祴璇曠敤渚嬨�� +4. **娴嬭瘯妗嗘灦鍒濆鍖栧拰杩愯**锛氬湪 `main` 鍑芥暟涓紝璋冪敤 `::testing::InitGoogleTest` 鍒濆鍖� Google Test 妗嗘灦锛岀劧鍚庨�氳繃 `RUN_ALL_TESTS` 杩愯鎵�鏈夋祴璇曠敤渚嬨�� +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +21銆� +## QT 鐜瀹夎 + +Qt5.9.4 + +Qt锛氬熀浜嶤++鍙法骞冲彴鐨凙pp鍜孶I寮�鍙戞鏋躲�� + +App锛欰pplication锛屽簲鐢ㄧ▼搴忋�� + +UI锛歎ser Interface 鐢ㄦ埛鐣岄潰銆� + +GUI锛欸raphics User interface 鍥惧舰鐢ㄦ埛鐣岄潰銆� + +骞冲彴锛歐indows銆乁buntu銆丆entOS銆丄ndroid銆両OS銆侀缚钂欍�乁OS锛堢粺淇★級銆丏eepin銆佸鐝� + +璺ㄥ钩鍙帮細鍙湪涓嶅悓骞冲彴涓婄洿鎺ヨ繍琛岀殑鏂瑰紡銆� + +涓ょ璺ㄥ钩鍙版柟寮忥細 + +1銆佺▼搴忕骇锛氱紪璇戝ソ鐨勭▼搴忓彲鐩存帴鍦ㄤ笉鍚岀殑骞冲彴涓婅繍琛岋紝闇�瀹夎瑙i噴鍣ㄦ潵鏀寔銆傚锛欽ava銆丳ython銆丣S绛夈�� + +2銆佹簮鐮佺骇锛氫竴浠戒唬鐮侊紝鏃犻渶淇敼锛屽彲鐩存帴鍦ㄤ笉鍚屽钩鍙颁笂缂栬瘧銆佽繍琛岋紝闇�缂栬瘧鐜鎴栦氦鍙夌紪璇戞潵鏀寔銆傚锛欳銆丆++绛夈�� + +閫熷害姣旇緝锛氭簮鐮佺骇蹇�佺▼搴忕骇鎱€�� +IDE锛堥泦鎴愬紑鍙戠幆澧冿級锛歈t Creator 4.5.0 + +VS 2015鍔╂墜锛歈t VST + +宸ュ叿-->鎵╁睍涓庢洿鏂�-->鑱旀満-->鎼滅储"Qt"-->涓嬭浇Qt VST-->瀹夎Qt VST-->瀹屾垚鍚庨噸鍚疺S2015-->閰嶇疆Qt鐗堟湰(msvc2015_64) + +瀹夎鍖呬笅杞藉湴鍧�锛� https://download.qt.io/official_releases/qt/ + +宸ョ▼鐩綍锛歈tProject + +**鍒涘缓宸ョ▼涓嶈兘甯︿腑鏂囪矾寰勩��** + +绫诲悕鏍煎紡锛歍estMainWindow + +娣诲姞鎺т欢锛歶i鏂囦欢-->鎷栨嫿锛屽弻鍑籾i鏂囦欢杩涘叆璁捐甯堢晫闈� + +瑙e喅鎸夐挳鏂囧瓧鏄剧ず涓嶅叏 + +- 鏂规硶1銆佷娇鐢ㄥ竷灞�鑷�傚簲澶у皬 +- 鏂规硶2銆佸湪涓诲嚱鏁拌缃瓺PI灞炴�� + - **QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);** + +鑷�傚簲澶у皬锛氭爡鏍煎竷灞�+闂撮殧銆� + +### 椹煎嘲鍛藉悕娉� + +澶ч┘宄帮細绫诲悕銆佺粨鏋勪綋锛屼緥濡侻yClass + +灏忛┘宄帮細鍙橀噺鍚嶃�佸嚱鏁板悕锛屼緥濡俶yClass + +鍑归┘宄帮細鏂囦欢銆佸伐绋嬶紝渚嬪my_class + +### 甯哥敤鑻辨枃 + +GUI 鍗冲浘褰㈢敤鎴风晫闈紙Graphical User Interface锛� + +## QT鍩烘湰姒傚康 + +### Qt鏄粈涔堬紵 + +Qt鏄竴涓熀浜嶤++锛屽彲璺ㄥ钩鍙扮殑APP鍜孶I寮�鍙戞鏋� + +骞冲彴锛氬悇绫荤郴缁� + +璺ㄥ钩鍙帮細鍙湪涓嶅悓骞冲彴涓婄洿鎺ヨ繍琛岀殑鏂瑰紡鏈変袱绉嶈法鐨勬柟寮� + +1. **绋嬪簭绾э細**缂栬瘧濂界殑绋嬪簭鍙洿鎺ュ湪涓嶅悓骞冲彴涓婅繍琛岋紝闇�瀹夎瑙i噴鍣紙铏氭嫙鏈猴級鏉ユ敮鎸� +2. **婧愮爜绾э細**涓�浠戒唬鐮侊紝鏃犻渶淇敼锛屽彲鐩存帴鍦ㄤ笉鍚屽钩鍙颁笂缂栬瘧杩愯锛岄渶缂栬瘧鐜鎴栦氦鍙夌紪璇戞潵鏀寔 + +### Qt鐗堟湰浠嬬粛 + +Qt瀹夎鍖咃細 +qt-opensource-windows-x86-mingw492-5.6.1-1.exe + +- opensource琛ㄧず寮�婧愮増鏈� +- windows-x86琛ㄧずWindows 32浣嶅钩鍙� +- mingw琛ㄧず浣跨敤MinGW缂栬瘧鍣� +- 5.6.1-1鏄綋鍓嶇増鏈彿 + +**MinGW**鍗�**Minimalist GNU For Windows**锛屾槸灏咷NU寮�鍙戝伐鍏风Щ妞嶅埌Win32骞冲彴涓嬬殑浜х墿锛屾槸涓�濂梂indows涓婄殑GNU宸ュ叿闆嗐�傜敤鍏跺紑鍙戠殑绋嬪簭涓嶉渶瑕侀澶栫殑绗笁鏂笵LL鏀寔灏卞彲浠ョ洿鎺ュ湪Windows涓嬭繍琛屻�� + + + +### Qt鍒嗚鲸鐜囪嚜閫傚簲 + +鏂规硶1锛氳缃湰鍦扮數鑴戝垎杈ㄧ巼 + +鏂规硶2锛歎I妯″潡涓嚜閫傚簲 + +鏂规硶3锛� + +```c++ +QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +``` + +### C++鍜孮t鐨勫尯鍒� + +杈撳嚭锛� + +C++锛氬ご鏂囦欢\<iostream> 鍜宑out<< + +Qt锛氬ご鏂囦欢\<QDebug> 鍜宷Debug()<< + +**Qt涓娇鐢╟out浼氬湪绋嬪簭鎵ц鍚庢墠杈撳嚭锛屼笉鍙嬪ソ** + +**qDebug()浼氳嚜鍔ㄦ崲琛岋紝澶氭鏁版嵁涓�璧疯緭鍏ヤ笉闇�瑕佽緭鍏モ�� 鈥濈┖鏍奸殧寮�锛屼細鑷姩鍒嗛殧** + + + +### Qt涓诲嚱鏁板弬鏁� + +涓诲嚱鏁板弬鏁板湪椤圭洰--->Command line arguments涓坊鍔狅紝**鍙傛暟浠ョ┖鏍煎垎闅�** + +```cpp +#include "testmainwindow.h" +#include <QApplication> +#include <QDebug> + +int main(int argc, char *argv[]) +{ + qDebug()<<argc; + for(int i=0;i<argc;i++) + { + qDebug()<<argv[i]; + } + + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication a(argc, argv); + TestMainWindow w; + w.show(); + + return a.exec(); +} +``` + + + +### Qt宸ュ叿 + +**1.Qt鍔╂墜:**鏂囨。闃呰銆佸彂甯�,涓�鑸兂缁欓」鐩敓鎴愬府鍔╂枃妗�:鍏堝婧愮爜鍔犳敞瑙� + +**2.Qt璇█瀹�:**鐢ㄤ簬鍥介檯鍖栫殑缈昏瘧鈥︹�﹀璇█鏂囧瓧鐨勫垏鎹� + +**3.Qt璁捐甯�:**鐢ㄤ簬鎷栨嫿寮忕殑鍙鍖栫晫闈㈣璁� + +[Qt鍒嗙骇:鍏ラ棬绾�(鎷栨嫿)->楂樼骇(绾唬鐮�)->澶у笀绾�(鑷畾涔夋帶浠�)] + +## QT甯哥敤鎺т欢 + +explicit鍏抽敭瀛楋細鏄惧紡鐨勶紝闃叉闅愬紡杞崲銆� + +``` +class A +{ + int a; +public: + explicit A(int x){ + a = x; + } +}; +int main(){ + A a1(5); //鏄惧紡璋冪敤鏈夊弬鏋勯�� + A a2 = A(5); //鏄惧紡璋冪敤鏋勯�� A(int x) + A a3 = 5; //闅愬紡杞崲锛屼竴鏃﹀姞浜唀xplicit 鍏抽敭瀛椾慨楗版湁鍙傛瀯閫狅紝闅愬紡杞崲鍒欏け璐� +} +``` + +**鎺т欢绫诲瀷** + +Layouts锛氬竷灞� + +- vertical Layout锛氬瀭鐩村竷灞� +- Horizontal layout锛氭按骞冲竷灞� +- Grid Layout锛氱綉缁滃竷灞� +- Form Layout锛氳〃鍗曞竷灞� + +Spacers锛氶棿闅斿櫒 + +- Horizontal Spacer锛氭按骞抽棿闅斿櫒 +- Vertical Spacer锛氬瀭鐩撮棿闅斿櫒 + +Buttons锛氭寜閽� + +- Push Button锛氭寜閿� +- Tool Button锛氬伐鍏锋寜閽� +- Radio Button锛氭敹闊虫満鎸夐挳 +- Check Box锛氬閫夋 +- Command Link Button锛氬懡浠ら摼鎺ユ寜閽� +- Dialog Button Box锛氬璇濇寜閽 + +Item Views (Model-Based)锛氶」鐩鍥撅紙鍩轰簬妯″瀷锛� + +- List View锛氬垪琛ㄨ鍥� +- Tree View锛氭爲瑙嗗浘 +- Table View锛氳〃鏍艰鍥� +- Column View锛氬垪瑙嗗浘 + +Item Widgets (Item-Based)锛氶」鐩甒idget锛堝熀浜庨」鐩級 + +- List Widget锛氬垪琛ㄥ皬閮ㄤ欢 +- Tree Widget锛氭爲鐘舵彃浠� +- Table Widget锛氳〃鏍糤idget + +Containers锛氬鍣�/闆嗚绠� + +- Group Box锛氱兢缁勬 +- Scroll Area锛氭粴鍔ㄥ尯鍩� +- Tool Box锛氬伐鍏风 +- Tab Widget锛氭爣绛剧粍浠� +- Stacked Widget锛氬爢鍙犻儴浠� +- Frame锛氭鏋� +- Widget锛氶儴浠� +- MDI Area锛歁DI鍖哄煙 +- Dock Widget锛氬仠闈犲皬閮ㄤ欢 +- QAxWidget锛� + +Input Widgets锛氳緭鍏ュ皬閮ㄤ欢 + +- Combo Box锛氱粍鍚堟 +- Font Combo Box锛氬瓧浣撶粍鍚堟 +- Line Edit锛氳缂栬緫妗� +- Text Edit锛氭枃鏈紪杈戞 +- Plain Text Edit锛氱函鏂囨湰缂栬緫 +- Spin Box锛氭棆杞洅 +- Double Spin Box锛氬弻鏃嬭浆鐩� +- Time Edit锛氭椂闂寸紪杈� +- Date Edit锛氭棩鏈熺紪杈� +- Date/Time Edit锛氭棩鏈�/鏃堕棿缂栬緫 +- Dial锛氭嫧鍙� +- Horizontal Scroll Bar锛氭按骞虫粴鍔ㄦ潯 +- Vertical Scroll Bar锛氬瀭鐩存粴鍔ㄦ潯 +- Horizontal Slider锛� +- Vertical Slider锛� +- Key Sequence Edit锛氬瘑閽ュ簭鍒楃紪杈� + +Display Widgets锛氭樉绀哄皬閮ㄤ欢 + +- Label锛氭爣绛� + - 璁剧疆鏂囨湰锛氬璞�.setText("鏂囨湰"); + - 鍙栨枃鏈細瀵硅薄.text() --> 杩斿洖QString绫诲瀷鐨勬枃鏈�; +- Text Browser锛氭枃鏈祻瑙堝櫒 + - 鍙敤杩藉姞鐨勬柟寮忔坊鍔犳枃鏈細瀵硅薄.append(""); +- Graphics View锛氬浘褰㈣鍥� +- Calender Widget锛氭棩鍘� +- LCD Number锛氭恫鏅舵樉绀哄櫒缂栧彿 +- Progress Bar锛氳繘搴︽潯 +- Horizontal Line锛氭按骞崇嚎 +- Vertical Line锛氬瀭鐩寸嚎 +- OpenGL Widget +- QQuikWidget + +**鎺т欢灞炴��** + +鍏堟妸绌洪棿鏀惧埌ui鐣岄潰涓婏紝鍦ㄦ瀯閫犱腑锛� + +- 璇伙細ui->鎺т欢瀵硅薄->text 鐩存帴灏辨槸灞炴�у悕鎴栧嚱鏁板悕锛屾垨鍦╰ext鍓嶏紙鍔犱竴浜涘墠缂�閰嶅悎浠�涔堟牱鐨勫睘鎬ц鍓嶇紑锛� +- 鍐欙細ui->鎺т欢瀵硅薄->set灞炴�у悕(鍙傛暟鍒楄〃) 淇敼灞炴�у唴瀹� + +**澶嶉�夋锛�** + +- ui->鎺т欢瀵硅薄->is灞炴�у悕 杩斿洖鍊间负bool +- ui->鎺т欢瀵硅薄->has灞炴�у悕 杩斿洖鍊间负bool +- ui->鎺т欢瀵硅薄->灞炴�у悕 杩斿洖鍊间负bool + +**琛岀紪杈戞锛�** + +- ui->鎺т欢瀵硅薄->text() 璇� +- ui->鎺т欢瀵硅薄->setText(瀛楃涓�) 鍐� + +**鎺т欢鍏蜂綋灞炴��** + +**閫氱敤灞炴��** + +QObject锛氬璞★紱 + +- objectName锛氬璞″悕绉帮紱 + +QWidget锛氶儴浠讹紱 + +- enabled锛氬惎鐢紱 +- geometry锛氬嚑浣曞舰鐘讹紱 +- sizePolicy锛氬昂瀵哥瓥鐣ワ紱 +- minimumSize锛氭渶灏忓昂瀵革紱 +- maximumSize锛氭渶澶у昂瀵革紱 +- sizelncrement锛氬昂瀵稿閲忥紱 +- baseSize锛氬熀鏈昂瀵革紱 +- palette锛氳皟鑹叉澘锛� +- font锛氬瓧浣擄紱 +- cursor锛氬厜鏍囷紱 +- mouseTracking锛氶紶鏍囪窡韪紱 +- tabletTracking锛氬钩鏉胯窡韪紱 +- focusPolicy锛氱劍鐐圭瓥鐣ワ紱 +- contextMenuPolicy锛氫笂涓嬫枃鑿滃崟绛栫暐锛� +- acceptDrops锛氭帴鍙楁嫋鏀撅紱 +- toolTip锛氬伐鍏锋彁绀猴紱 +- toolTipDuration锛氬伐鍏锋彁绀烘寔缁椂闂达紱 +- statusTip锛氱姸鎬佹彁绀猴紱 +- whatsThis锛氳繖鏄粈涔堬紱 +- accessibleName锛氬彲璁块棶鍚嶇О锛� +- accessibleDescription锛氬彲璁块棶鎻忚堪锛� +- layoutDirection锛氬竷灞�鏂瑰悜锛� +- autoFillBackground锛氳嚜鍔ㄥ~鍏呰儗鏅紱 +- styleSheet锛氭牱寮忚〃锛� +- locale锛氬尯鍩熻缃紱 +- inputMethodHints锛氳緭鍏ユ硶鎻愮ず + +**鐙湁灞炴��** + +PushButton + +- QAbstractButton锛氭娊璞℃寜閽紱 + - text锛氭枃鏈紱 + - icon锛氬浘鏍囷紱 + - iconSize锛氬浘鏍囧ぇ灏忥紱 + - shortcut锛氬揩鎹烽敭锛� + - checkable锛氬彲澶嶉�夛紱 + - checked锛氬凡閫変腑锛� + - autoRepeat锛氳嚜鍔ㄩ噸澶嶏紱 + - autoExclusive锛氳嚜鍔ㄦ帓浠栵紱 + - autoRepeatDelay锛氳嚜鍔ㄩ噸澶嶅欢杩燂紱 + - autoRepeatInterval锛氳嚜鍔ㄩ噸澶嶉棿闅旓紱 +- QPushButton锛氭寜閽紱 + - autoDefault锛氳嚜鍔ㄩ粯璁わ紱 + - default锛氶粯璁わ紱 + - flat锛氭墎骞炽�� + +Label + +- QFrame锛氭鏋讹紱 + - frameShape锛氭鏋跺舰鐘讹紱 + - frameShadow锛氭鏋堕槾褰憋紱 + - lineWidth锛氱嚎瀹斤紱 + - midLineWidth锛氫腑绾垮锛� +- QLabel锛氭爣绛撅紱 + - text锛氭枃鏈紱 + - textFormat锛氭枃鏈牸寮忥紱 + - pixmap锛氬儚绱犲浘锛� + - scaledContents锛氱缉鏀惧唴瀹癸紱 + - alignment锛氬榻愭柟寮忥紱 + - wordWrap锛氳嚜鍔ㄦ崲琛岋紱 + - margin锛氳竟璺濓紱 + - indent锛氱缉杩涳紱 + - openExternallinks锛氭墦寮�澶栭儴閾炬帴锛� + - textlnteractionFlags锛氭枃鏈氦浜掓爣蹇楋紱 + - buddy锛氫紮浼淬�� +- API + - 璇� + - text()锛氳幏鍙栨枃鏈唴瀹� + - textFormat(): 鐢ㄤ簬鑾峰彇鏂囨湰鐨勬牸寮忕被鍨嬶紙濡傜函鏂囨湰銆佸瘜鏂囨湰锛夈�� + - textInteractionFlags(): 鐢ㄤ簬鑾峰彇鏂囨湰鐨勪氦浜掓爣蹇楋紙濡傛槸鍚﹀厑璁哥偣鍑婚摼鎺ワ級銆� + - 鍐� + - + - setTextFormat(鍙傛暟); + - Qt::AutoText锛氳嚜鍔ㄧ‘瀹氭枃鏈牸寮忥紙閫氬父涓虹函鏂囨湰锛夈�� + - Qt::PlainText锛氱函鏂囨湰鏍煎紡锛屼笉鏀寔 HTML 鏍煎紡銆� + - Qt::RichText锛氬瘜鏂囨湰鏍煎紡锛屾敮鎸� HTML 鍜屾牱寮忋�� + - Qt::MarkdownText锛歁arkdown 鏍煎紡锛堜粠 Qt 5.14 寮�濮嬫敮鎸侊級銆� + +LineEdit + +- QLineEdit锛氳缂栬緫妗嗭紱 + - inputMask锛氳緭鍏ユ帺鐮侊紱 + - text锛氭枃鏈唴瀹癸紱 + - maxLength锛氭渶澶ч暱搴︼紱 + - frame锛氳竟妗嗭紱 + - echoMode锛氬洖鏄炬ā寮忥紱 + - cursorPosition锛氬厜鏍囦綅缃紱 + - alignment锛氬榻愭柟寮忥紱 + - dragEnabled锛氬惎鐢ㄦ嫋鍔紱 + - readOnly锛氬彧璇伙紱 + - placeholderText锛氬崰浣嶇鏂囨湰锛� + - cursorMoveStyle锛氬厜鏍囩Щ鍔ㄩ鏍硷紱 + - clearButtonEnabled锛氬惎鐢ㄦ竻闄ゆ寜閽�� + +https://blog.csdn.net/GG_Bruse/article/details/136634146 + +``` +https://blog.csdn.net/Miwll/article/details/141201383?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-141201383-blog-137563865.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.1&utm_relevant_index=1 +``` + +https://blog.csdn.net/GG_Bruse/article/details/136634146 + +### PushButton + +绫荤户鎵垮叧绯伙細QObject->QWidget->QAbstractButton->QPushbutton + +**geometry锛�**鍑犱綍褰㈢姸 + +**sizePolicy锛�**灏哄绛栫暐 + +鍦≦t涓紝sizePolicy鏄瘡涓猀t widgets锛堝寘鎷琎PushButton锛夌殑涓�涓睘鎬э紝瀹冨喅瀹氫簡褰撶獥鍙eぇ灏忔敼鍙樻垨鑰呯埗瀹瑰櫒澶у皬鏀瑰彉鏃讹紝鎺т欢锛堝QPushButton锛夊簲璇ュ浣曡皟鏁磋嚜韬殑澶у皬銆傚浜巗izePolicy鐨勬按骞崇瓥鐣ワ紙Horizontal Policy锛夛紝鍏蜂綋鏉ヨ锛屽畠鍙互褰卞搷鎸夐挳鍦ㄦ按骞虫柟鍚戜笂鐨勫昂瀵哥鐞嗚涓猴紝涓昏鍖呮嫭浠ヤ笅鍑犱釜鏂归潰锛� + +- **Fixed**锛氳〃绀烘寜閽簲璇ヤ繚鎸佸浐瀹氱殑瀹藉害锛屾棤璁虹獥鍙eぇ灏忓浣曞彉鍖栵紝鎸夐挳閮戒笉浼氶殢涔嬫媺浼告垨鏀剁缉銆� +- **Minimum**锛氭帶浠惰嚦灏戦渶瑕佷繚鎸佹寚瀹氱殑鏈�灏忓搴︼紝浣嗗厑璁稿湪绌洪棿鍏呰冻鐨勬儏鍐典笅鎵╁睍鍒板ぇ浜庤繖涓渶灏忓�笺�� +- **Maximum**锛氭帶浠剁殑鏈�澶у搴︿笉浼氳秴杩囨寚瀹氬�硷紝浣嗗湪绌洪棿涓嶈冻鏃朵粛鐒跺彲浠ョ缉灏忓埌鏇村皬銆� +- **Preferred**锛堜篃绉颁负MinimumExpanding锛夛細鎺т欢鏈変竴涓悊鎯崇殑棣栭�夊搴︼紝閫氬父鏄敱鎺т欢鍐呭鍐冲畾鐨勩�傚湪甯冨眬涓紝濡傛灉绌洪棿瓒冲锛屾帶浠跺皢灏濊瘯鎵╁睍鍒拌繖涓搴︼紝浣嗗鏋滃叾浠栨帶浠朵篃闇�瑕佺┖闂达紝瀹冨彲鑳戒細姣旈閫夊搴﹀皬銆傚悓鏃讹紝瀹冧篃浼氫繚鎸佷竴涓渶灏忓搴︺�� +- **Expanding**锛堜篃绉颁负Ignored锛夛細鎺т欢鍦ㄥ竷灞�涓敖鍙兘鍗犳嵁鎵�鏈夊彲鐢ㄧ殑绌洪棿銆傚鏋滃竷灞�鐨勬墍鏈夋帶浠堕兘璁剧疆浜嗘按骞虫墿寮犵瓥鐣ワ紝瀹冧滑灏嗕細骞崇瓑鍦板垎閰嶉澶栫殑绌洪棿銆� + +**palette锛�**璋冭壊鏉� + +**font锛�**瀛椾綋 + +**cursor锛�**鍏夋爣锛屾父鏍� + +**mouseTracking锛�**榧犳爣杩借釜 + +``` +mouseTracking灞炴�х敤浜庝繚瀛樻槸鍚﹀惎鐢ㄩ紶鏍囪窡韪紝缂虹渷鎯呭喌鏄笉鍚敤鐨勩�傛病鍚敤鐨勬儏鍐典笅锛屽搴旈儴浠跺彧鎺ユ敹鍦ㄩ紶鏍囩Щ鍔ㄥ悓鏃惰嚦灏戜竴涓紶鏍囨寜閿寜涓嬫椂鐨勯紶鏍囩Щ鍔ㄤ簨浠讹紝鍚敤榧犳爣璺熻釜鐨勬儏鍐典笅锛屼换浣曢紶鏍囩Щ鍔ㄤ簨浠堕儴浠堕兘浼氭帴鏀躲�� + +閮ㄤ欢鏂规硶hasMouseTracking锛堬級鐢ㄤ簬杩斿洖褰撳墠鏄惁鍚敤榧犳爣璺熻釜锛宻etMouseTracking(bool enable)鐢ㄤ簬璁剧疆鏄惁鍚敤榧犳爣璺熻釜銆� + +涓庨紶鏍囪窡韪浉鍏崇殑鍑芥暟涓昏鏄痬ouseMoveEvent()銆� +``` + +**tabletTracking锛�**骞虫澘瑙︽帶鏉�/绗旇拷韪� + +``` +tabletTracking灞炴�т繚瀛樻槸鍚﹀惎鐢ㄩ儴浠剁殑骞虫澘璺熻釜锛岀己鐪佹槸涓嶈捣鐢ㄧ殑銆傛病鏈夊惎鐢ㄥ钩鏉胯窡韪殑鎯呭喌涓嬶紝閮ㄤ欢浠呮帴鏀惰Е鎺х瑪涓庡钩鏉挎帴瑙︽垨鑷冲皯鏈変釜瑙︽帶绗旀寜閿寜涓嬫椂鐨勮Е鎺х瑪绉诲姩浜嬩欢銆� +濡傛灉閮ㄤ欢鍚敤浜嗗钩鏉胯窡韪姛鑳斤紝閮ㄤ欢鑳芥帴鏀惰Е鎺х瑪闈犺繎浣嗘湭鐪熸鎺ヨЕ骞虫澘鏃剁殑瑙︽帶绗旂Щ鍔ㄤ簨浠讹紝杩欏彲浠ョ敤浜庣洃瑙嗘搷浣滀綅缃互鍙婇儴浠剁殑杈呭姪鎿嶄綔鍔熻兘锛堝鏃嬭浆鍜屽�炬枩锛夛紝骞朵负鍥惧舰鐣岄潰鎻愪緵杩欎簺鎿嶄綔鐨勪俊鎭帴鍙c�� + +閮ㄤ欢鏂规硶hasTabletTracking锛堬級鐢ㄤ簬杩斿洖褰撳墠鏄惁鍚敤骞虫澘璺熻釜锛宻etTabletTracking(bool enable)鐢ㄤ簬璁剧疆鏄惁鍚敤骞虫澘璺熻釜銆� +``` + +**focus policy锛�**鐒︾偣绛栫暐 + +- **NoFocus锛�**涓嶆帴鍙楅敭鐩樼劍鐐广�傝繖涓睘鎬ч�氬父鐢ㄤ簬閭d簺涓嶉渶瑕佷笌鐢ㄦ埛浜や簰鐨勬帶浠躲�� +- **TabFocus锛�**閫氳繃 Tab 閿幏寰楃劍鐐广�傝繖涓睘鎬х敤浜庨渶瑕侀�氳繃 Tab 閿繘琛屽鑸殑鎺т欢銆� +- **ClickFocus锛�** 閫氳繃榧犳爣鐐瑰嚮鑾峰緱鐒︾偣銆� +- **StrongFocus锛�**閫氳繃 Tab 閿拰榧犳爣鐐瑰嚮閮藉彲浠ヨ幏寰楃劍鐐广�� +- **WheelFocus:** 閫氳繃榧犳爣婊氳疆涔熷彲浠ヨ幏寰楃劍鐐广�� + +鈥� 灞炴�� 搴旂敤鍦烘櫙 閫傜敤鎺т欢绀轰緥 +Qt::NoFocus 涓嶉渶瑕佺敤鎴蜂氦浜掔殑鎺т欢 QLabel, QFrame +Qt::TabFocus 琛ㄥ崟濉啓銆佽缃�夐」 QLineEdit, QSpinBox +Qt::ClickFocus 鍥惧儚缂栬緫銆佹嫋鎷芥搷浣� QGraphicsView +Qt::StrongFocus 缁煎悎搴旂敤锛屽鏂囨湰缂栬緫鍣� QTextEdit +Qt::WheelFocus 闇�瑕侀�氳繃婊氳疆杩涜绮剧粏璋冩暣鐨勬帶浠� QSlider + + + +**ContextMenuPolicy锛�**涓婁笅鏂囪彍鍗曠瓥鐣� + +ContextMenuPolicy 鏄� [Qt](https://so.csdn.net/so/search?q=Qt&spm=1001.2101.3001.7020) 妗嗘灦涓� QWidget 绫荤殑涓�涓灇涓剧被鍨嬶紝瀹冨畾涔変簡濡備綍鍝嶅簲鍜屽鐞嗛紶鏍囧彸閿偣鍑讳簨浠讹紝鍗充笂涓嬫枃鑿滃崟鐨勭瓥鐣ャ�備笂涓嬫枃鑿滃崟鏄竴绉嶄复鏃跺嚭鐜扮殑鑿滃崟锛岄�氬父鍑虹幇鍦ㄧ敤鎴锋墽琛岀壒瀹氭搷浣滐紙濡傚彸閿偣鍑伙級鏃讹紝鎻愪緵涓庡綋鍓嶄笂涓嬫枃鐩稿叧鐨勬搷浣滈�夐」銆� + +- NoContextMenu锛氳繖涓瓥鐣ヨ〃绀虹鐢ㄤ笂涓嬫枃鑿滃崟銆傚綋璁剧疆涓鸿繖涓�兼椂锛屽嵆浣跨敤鎴峰彸閿偣鍑绘帶浠讹紝涔熶笉浼氬脊鍑鸿彍鍗曘�傝繖鍙互鐢ㄤ簬閭d簺涓嶉渶瑕侀澶栬彍鍗曢�夐」鐨勬帶浠躲�倃idget->setContextMenuPolicy(Qt::NoContextMenu); + + + +- DefaultContextMenu锛氳繖涓瓥鐣ヨ〃绀轰娇鐢ㄩ粯璁ょ殑涓婁笅鏂囪彍鍗曡涓恒�傚綋鐢ㄦ埛鍙抽敭鐐瑰嚮鎺т欢鏃讹紝Qt 浼氳嚜鍔ㄥ脊鍑轰竴涓寘鍚� actions() 杩斿洖鐨勬墍鏈夊姩浣滐紙QAction 瀵硅薄锛夌殑鑿滃崟銆傝繖鏄ぇ澶氭暟鎺т欢鐨勯粯璁よ涓恒�倃idget->setContextMenuPolicy(Qt::DefaultContextMenu); + + + +- CustomContextMenu锛氬綋浣犳兂瑕佽嚜瀹氫箟涓婁笅鏂囪彍鍗曟椂锛屽簲璇ヤ娇鐢ㄨ繖涓瓥鐣ャ�傝缃负 Qt::CustomContextMenu 鍚庯紝浣犻渶瑕侀噸鍐欐帶浠剁殑 contextMenuEvent(QContextMenuEvent *event) 浜嬩欢澶勭悊鍑芥暟鏉ュ垱寤哄拰鏄剧ず鑷繁鐨勮彍鍗曘�� + + ```cpp + widget->setContextMenuPolicy(Qt::CustomContextMenu); + + // 鍦ㄦ帶浠剁殑绫讳腑閲嶅啓 contextMenuEvent 鍑芥暟 + void MyClass::contextMenuEvent(QContextMenuEvent *event) + { + QMenu menu(this); + // 娣诲姞鑷畾涔夌殑鍔ㄤ綔鍒拌彍鍗� + QAction *action1 = menu.addAction("Custom Action 1"); + QAction *action2 = menu.addAction("Custom Action 2"); + // 鏄剧ず鑿滃崟 + menu.exec(); + } + ``` + + + +- **ActionsContextMenu锛�**杩欎釜绛栫暐鏄� Qt::DefaultContextMenu 鐨勪竴涓壒渚嬶紝瀹冨彧鏄剧ず涓庡綋鍓嶆帶浠剁浉鍏宠仈鐨� QAction 瀵硅薄銆傝繖鎰忓懗鐫�锛屽彧鏈夐偅浜涢�氳繃 addAction 鏂规硶娣诲姞鍒版帶浠朵腑鐨勫姩浣滄墠浼氬嚭鐜板湪涓婁笅鏂囪彍鍗曚腑銆傝繖閫氬父鐢ㄤ簬閭d簺鍏锋湁鍐呯疆鍔ㄤ綔鐨勬帶浠讹紝渚嬪鎸夐挳鎴栧伐鍏锋爮銆� + + widget->setContextMenuPolicy(Qt::ActionsContextMenu); + + 浣跨敤杩欎釜绛栫暐鏃讹紝浣犱笉闇�瑕侀噸鍐� contextMenuEvent 鍑芥暟锛屽洜涓� Qt 浼氳嚜鍔ㄤ负浣犲垱寤轰竴涓寘鍚墍鏈夌浉鍏冲姩浣滅殑鑿滃崟銆� + + + +- **PreventContextMenu锛�**杩欎釜绛栫暐鐢ㄤ簬瀹屽叏闃绘涓婁笅鏂囪彍鍗曠殑鏄剧ず銆傚嵆浣跨敤鎴锋墽琛屼簡閫氬父浼氬紩鍙戜笂涓嬫枃鑿滃崟鐨勬搷浣滐紙濡傚彸閿偣鍑伙級锛屼篃涓嶄細鏈変换浣曡彍鍗曞脊鍑恒�傝繖涓�夐」鍙互鐢ㄦ潵纭繚鏌愪簺鎺т欢涓嶆帴鍙椾换浣曚笂涓嬫枃鑿滃崟浜や簰銆� + + widget->setContextMenuPolicy(Qt::PreventContextMenu); + + 杩欎釜閫夐」瀵逛簬閭d簺涓嶅簲璇ユ湁浠讳綍涓婁笅鏂囪彍鍗曠殑鎺т欢闈炲父鏈夌敤锛屼緥濡傦紝涓�涓畝鍗曠殑鏍囩鎴栭潤鎬佹枃鏈帶浠躲�� + + + + + + 鍦ㄨ璁$敤鎴风晫闈㈡椂锛岄�夋嫨鍚堥�傜殑 ContextMenuPolicy 瀵逛簬鎻愪緵鑹ソ鐨勭敤鎴蜂綋楠岃嚦鍏抽噸瑕併�備綘闇�瑕佹牴鎹帶浠剁殑鍔熻兘鍜岄鏈熺殑鐢ㄦ埛浜や簰鏉ュ喅瀹氫娇鐢ㄥ摢绉嶇瓥鐣ャ�備緥濡傦紝瀵逛簬鍖呭惈澶氫釜鎿嶄綔鐨勫鏉傛帶浠讹紝Qt::DefaultContextMenu 鎴� Qt::ActionsContextMenu 鍙兘鏄悎閫傜殑閫夋嫨銆傚浜庨偅浜涗笉闇�瑕佷换浣曚笂涓嬫枃鑿滃崟鐨勬帶浠讹紝Qt::NoContextMenu 鎴� Qt::PreventContextMenu 鍙互纭繚鐢ㄦ埛涓嶄細鏈熸湜杩涜涓嶇浉鍏崇殑鎿嶄綔銆傚浜庨渶瑕佸畬鍏ㄨ嚜瀹氫箟涓婁笅鏂囪彍鍗曠殑鎺т欢锛孮t::CustomContextMenu 鎻愪緵浜嗘渶澶х殑鐏垫椿鎬с�� + + + +**acceptDrops锛�**鎺ユ敹鎷栨斁 + +**ToolTip锛�**宸ュ叿鎻愮ず + +toolTip灞炴�ц缃儴浠剁殑toolTip鎻愮ず淇℃伅锛宼oolTip鎻愮ず淇℃伅鍦ㄩ紶鏍囨斁鍒版帶浠朵笂浼氭诞鍔ㄥ嚭涓�涓皬妗嗘樉绀烘彁绀轰俊鎭�傞粯璁ゆ儏鍐典笅锛屼粎鏄剧ず娲诲姩绐楀彛瀛愰儴浠剁殑toolTip锛屽彲浠ラ�氳繃鍦ㄧ獥鍙e璞¤缃甉t.WA_AlwaysShowToolTips灞炴�ф潵鏀瑰彉锛屼絾涓嶈兘鏄渶瑕佹樉绀簍ooTip鐨勯儴浠跺璞′腑璁剧疆銆� + +濡傛灉瑕佹帶鍒秚ooTip鏄剧ず鐨勮涓猴紙濡傛帶鍒舵樉绀轰綅缃級锛屽彲浠ラ噸鍐欓儴浠剁殑event锛堬級鏂规硶鎹曡幏浜嬩欢绫诲瀷涓篞Event.ToolTip鐨勪簨浠躲�� + +缂虹渷鍊间负绌猴紝鍙互閫氳繃toolTip锛堬級鍜宻etToolTip( str)鏉ヨ鍙栧拰璁剧疆toolTip銆� + +**ToolTipDuring锛�**宸ュ叿鎻愮ず + +toolTipDuration 灞炴�ф帶鍒秚oolTip鏄剧ず鐨勬椂闀匡紝鍗曚綅鏄绉掞紝濡傛灉璁剧疆涓�-1锛屽垯鏄剧ず鏃堕暱鏍规嵁toolTip鍐呭鐨勯暱搴︽潵璁$畻銆� +toolTipDuration 缂虹渷鍊间负-1锛屽彲浠ラ�氳繃toolTipDuration 锛堬級鍜宻ettoolTipDuration ( int msec)鏉ヨ鍙栧拰璁剧疆toolTipDuration 銆� + +**statusTip锛�**鐘舵�佹彁绀� + +statusTip灞炴�т繚瀛榮tatusTip鎻愮ず淇℃伅锛宻tatusTip鎻愮ず淇℃伅鍦ㄩ紶鏍囨斁鍒版帶浠朵笂鏃跺湪绐楀彛鐨勭姸鎬佹爮鏄剧ず鎻愮ず淇℃伅锛屽鏋滅獥鍙f棤鐘舵�佹爮鍒欎笉鏄剧ず銆� + +statusTip灞炴�� 缂虹渷鍊间负绌哄瓧绗︿覆锛屽彲浠ラ�氳繃statusTip锛堬級鍜宻etstatusTip ( str)鏉ヨ鍙栧拰璁剧疆statusTip銆� + +**whatsThis锛�**whatsThis灞炴�т繚瀛橀儴浠剁殑甯姪淇℃伅銆倃hatsThis鐨勫府鍔╀俊鎭竴鑸湪閮ㄤ欢鑾峰緱鐒︾偣鍚庢寜Shift+F1寮瑰嚭鏄剧ず锛屽鏋滆繖涓揩鎹烽敭琚埆鐨勫姛鑳藉崰鐢紝鍒檞hatsThis鐨勫府鍔╀俊鎭彲鑳芥棤娉曞睍绀恒�傛湁浜涘璇濈獥鎻愪緵涓�涓甫闂彿鐨勬寜閽彲浠ョ偣鍑绘樉绀簑hatsThis鐨勫府鍔╀俊鎭�� + +whatsThis灞炴�� 缂虹渷鍊间负绌哄瓧绗︿覆锛屽彲浠ラ�氳繃whatsThis锛堬級鍜宻etwhatsThis ( str)鏉ヨ鍙栧拰璁剧疆whatsThis銆� + +**accessibleName锛�**杈呭姪闃呰涓樉绀虹殑閮ㄤ欢鐨勫悕绉般�傚浜庡ぇ澶氭暟鎺т欢锛屼笉闇�瑕佽缃灞炴�с�傚綋鎺т欢涓嶆彁渚涗换浣曟枃鏈椂锛岃缃灞炴�ч潪甯搁噸瑕併�傞粯璁や负涓�涓┖瀛楃涓层�� + +**accessibleDescription锛�**鎺т欢鐨勬弿杩般�傛弿杩板簲璇ユ彁渚涚浉瀵硅缁嗙殑鎺т欢淇℃伅銆傞粯璁や负涓�涓┖瀛楃涓层�� + +**autoFillBackground :** 鏄惁鑷姩濉厖鎺т欢鑳屾櫙銆傞粯璁や负false銆� + + + +**QAbstractButton** + +**shortcut锛�**蹇嵎閿� + +### Layout甯冨眬瀵硅薄 + +```cpp +#include<QApplication> +#include<QLabel> +#include<QLineEdit> +#include<QPushButton> +#include<QHBoxLayout>//姘村钩甯冨眬 +#include<QVBoxLayout>//鍨傜洿甯冨眬 +#include<QWidget>//绐楀彛,QApplication鏄▼搴� + +int main(int argc,char *argv[]){ + +QApplication app(argc,argv);//绋嬪簭瀵硅薄 + +QLabel *openLabel = new QLabel; +QLable *infoLabel = new QLabel; + +QLineEdit *cmdLineEdit = new QLineEdit; +QPushButton *commitButton = new PushButton; +QPushButton *cancelButton = new PushButton; +QPushButton *browseButton = new PushButton; + +infoLabel->setText("inputsmd:"); +openLabel->setText("open"); +commitButton->setText("commit"); +cancelButton->setText("cancel"); +browseButton->setText("browse"); + +QHBoxLayout *cmdLayout =new QHBoxLayout;//姘村钩甯冨眬瀵硅薄 +cmdLayout->addWidget(openLabel); +cmdLayout->addWidget(cmdLineEdit); + +QHBoxLayout *buttonLayout = new QHBoxLayout; +buttonLayout->addWidget(commitButton); +butfonLayout->addWidget(cancelButton); +buttonLayout->addWidget(browseButton); + +QVBoxLayout *mainLayout =new QVBoxLayout//鍨傜洿甯冨眬瀵硅薄 +mainLayout->addwidget(infoLabel);//甯冨眬瀵硅薄涓坊鍔犳帶浠跺璞′娇鐢ㄧ殑addwidget +mainLayout->addLayout(cmdLayout);//甯冨眬瀵硅薄涓坊鍔犲竷灞�瀵硅薄浣跨敤鐨刟ddLayout +mainLayout->addLayout(buttonLayout); + +QWidget w;//鍒涘缓绌虹櫧绐楀彛瀵硅薄锛屾敞鎰忚繖閲屼笉鏄寚閽堬紝瑕佺敤.璋冪敤鎴愬憳鍑芥暟 +w.setLayout(mainLayout);//绐楀彛瀵硅薄涓坊鍔犲竷灞�瀵硅薄 +w.show(); + +return app.exec();//杩斿洖绋嬪簭鎵ц锛屾寰幆锛岃绋嬪簭涓�鐩村浜庢墦寮�鐘舵�� +} +``` + +1.鎵撳紑QT MinGW 绐楀彛 + +cd鍒� cpp鏂囦欢鐩綍 + +d: //鍏堣繘鍏ユ墍鍦ㄧ鐩橈紝鍐峜d鍒扮洰褰� + +2.淇敼鐜鍙橀噺 + +path涓姞鍏ワ細D:\Qt\Qt5.9.4\5.9.4\mingw53_32\bin + +3.qmake(cpp鏂囦欢鍚�) -project + +鐢熸垚qmake.pro宸ョ▼鏂囦欢锛屽湪鍏朵腑娣诲姞 + +QT += widgets gui + + + + + +## 宸ョ▼缁撴瀯 + +**.xml鏂囦欢** + +- 鍙墿灞曟爣璁拌瑷�锛岀敤鐢ㄥ皷鎷彿鍖呬綇鐨勫悕涓烘爣绛惧悕锛屼互鏍戝舰缁撶偣鐨勬柟寮忓瓨鍦紝骞跺湪灏栨嫭鍙峰唴鍔犱笂閿�煎锛堝睘鎬э級鏉ヤ娇鏍囩鑺傜偣鐨勫睘鎬ф洿涓板瘜銆� +- C++鐢ㄤ笁鏂瑰簱锛歵inyxml2寮�婧愬簱瑙f瀽xml銆� + +### 宸ョ▼鏂囦欢 + +xx.pro: 宸ョ▼椤圭洰閰嶇疆鏂囦欢锛屼篃鏄惎鍔ㄦ枃浠� + +xx.pro.user锛氬伐绋嬪湪褰撳墠绯荤粺鐢ㄦ埛涓嬬殑璁板綍鏂囦欢锛屼細鑷姩鐢熸垚 + +鈥� 涓昏璁板綍宸ョ▼鐨勭敓鎴愮洰褰曪紝缂栬瘧鍣ㄤ俊鎭瓑锛岃嫢灏嗘簮鐮佹墦鍖呭叾浠栦汉锛岃鍒犳帀璇ユ枃浠� + +xx.ui锛氬伐绋嬪彲瑙嗗寲鐣岄潰璁捐鐨勬枃浠讹紝璁板綍鎷栨嫿鐢熸垚鐨勭晫闈㈡晥鏋� + +鈥� 鏄敱Qt Designer銆怮T璁捐甯堝伐鍏枫�戜骇鐢熺殑 + +鈥� 缂栬瘧鏃朵細鑷姩鐨勭敓鎴愮洰褰曚腑浜х敓涓�涓浉搴旂殑鐨刢++澶存枃浠讹細ui.xx.h + +鈥� build-宸ョ▼鍚�-缂栬瘧鍣�-鐗堟湰 + +鈥� 銆恱ml鏂囦欢銆戝彲鎵╁睍鏍囪瘑璇█ + +鈥� 鐢ㄥ皷鎷彿鍖呬綇鐨勬爣绛惧悕锛屼互鏍戝舰鑺傜偣鐨勬柟寮忓瓨鍦� + +鈥� 骞跺湪灏栨嫭鍙峰唴鍔犱笂閿�硷紙灞炴�э級瀵规潵浣垮緱鏍囩鑺傜偣鐨勫睘鎬ф洿涓板瘜 + +``` + <a>鍐呭</a> + <a><b>xx</b></a>[鍙祵濂梋 +c++鐢ㄤ笁鏂瑰簱 +tinyxmlz寮�婧愬簱瑙f瀽xml +``` + +### 鐢熸垚鐩爣鐨勭洰褰昜鐢熸垚鐩綍] + +涓�鑸拰婧愮爜鐩綍鍚岀骇 + +鐐瑰嚮鎸夐挳鎵ц浜嬩欢娴佺▼锛� + +- 1銆侀紶鏍囷紙纭欢锛夌偣鍑绘寜閽� +- 2銆佹秷鎭惊鐜崟鎹夌偣鍑讳簨浠讹紙绯荤粺涓級 +- 3銆侀�氳繃娑堟伅鍧愭爣閬嶅巻灞忓箷涓婄殑椤跺眰绐楀彛锛屽彂閫佹秷鎭粰绐楀彛鍙ユ焺锛屽緱鍒扮▼搴忚繘绋嬶紙绐楀彛鍙ユ焺锛氱郴缁熺粰姣忎釜绐楀彛鍒嗛厤鐨勫敮涓�ID锛� +- 4銆丵t绋嬪簭涓繘琛屼簨浠跺惊鐜細a.exec()锛屾崟鎹夊埌瀵瑰簲浜嬩欢鍚庡垎鍙戠粰瀵瑰簲閮ㄤ欢 +- 5銆侀紶鏍囩偣鍑讳簨浠跺彂閫佷俊鍙凤紝鎵ц涓庝箣鍏宠仈鐨勬Ы + +**build-宸ョ▼鍚�-缂栬瘧鍣�-鐗堟湰** + +build-helloworld-Desktop_Qt_5_6_1_MinGW_32bit-Debug + +Qt Creator灏嗛」鐩簮鏂囦欢鍜岀紪璇戠敓鎴愮殑鏂囦欢杩涜浜嗗垎绫诲瓨鏀俱�� + +helloworld鏂囦欢澶逛腑鏄」鐩簮鏂囦欢锛岃�岀幇鍦ㄨ繖涓枃浠跺す瀛樻斁鐨勬槸缂栬瘧鍚庣敓鎴愮殑鏂囦欢銆傝繘鍏ヨ鏂囦欢澶瑰彲浠ョ湅鍒拌繖閲屾湁3涓狹akefile鏂囦欢鍜屼竴涓猽i_hellodialog.h鏂囦欢锛岃繕鏈変袱涓洰褰昫ebug鍜宺elease銆� + +鐜板湪release鏂囦欢澶规槸绌虹殑锛岃繘鍏ebug鏂囦欢澶癸紝杩欓噷鏈�3涓�.o鏂囦欢鍜屼竴涓�.cpp鏂囦欢锛屽畠浠槸缂栬瘧鏃剁敓鎴愮殑涓棿鏂囦欢锛屽彲浠ヤ笉蹇呯瀹冿紝鑰屽墿涓嬬殑涓�涓猦elloworld.exe鏂囦欢渚挎槸鐢熸垚鐨勫彲鎵ц鏂囦欢銆� + + testmainwindow.h 澶存枃浠� + +``` +#ifndef TESTMAINWINDOW_H +#define TESTMAINWINDOW_H +#include <QMainWindow +namespace Ui { +class TestMainWindow; +} +//涓嬮潰鍚屽悕绫昏礋璐I鍔熻兘鐨勫疄鐜� +class TestMainWindow : public QMainWindow +{ + Q_OBJECT +public: + explicit TestMainWindow(QWidget *parent = 0); //explicit锛氭樉寮忕殑锛岄槻姝㈤殣寮忚浆鎹� + ~TestMainWindow(); +private slots: + void on_pushButton_clicked(); //鎸夐挳鐨勫姛鑳芥Ы鍑芥暟锛岀偣鍑讳細瑙﹀彂妲藉嚱鏁� +private: + Ui::TestMainWindow *ui; //ui鎸囬拡浠h〃璁捐鐣岄潰鐨勫璞� + int cnt; +}; +#endif // TESTMAINWINDOW_H +``` + +main.cpp婧愭枃浠� + +``` +#include "testmainwindow.h" +#include <QApplication> +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication a(argc, argv); + TestMainWindow w; + w.show(); + return a.exec(); //鍚姩浜嬩欢寰幆锛屾崟鎹夊苟澶勭悊浜嬩欢锛屽皢鍏跺垎鍙戠粰瀵瑰簲閮ㄤ欢 +} +``` + +testmainwindow.cpp婧愭枃浠� + +``` +#include "testmainwindow.h" +#include "ui_testmainwindow.h" +#include <QDebug> +TestMainWindow::TestMainWindow(QWidget *parent) : + QMainWindow(parent), //濮旀墭鏋勯�� + ui(new Ui::TestMainWindow) +{ + ui->setupUi(this); //ui鎸囬拡閲岄潰鐨勬帶浠跺垵濮嬪寲锛堢晫闈笂鐨勬帶浠跺垵濮嬪寲锛� +} +TestMainWindow::~TestMainWindow() +{ + delete ui; +} +void TestMainWindow::on_pushButton_clicked() //鎸夐挳鐐瑰嚮浜嬩欢 +{ + cnt++; //璁板綍鐐瑰嚮娆℃暟 + ui->label->setText(QString::number(cnt)); //璁剧疆鏂囨湰锛屽嵆鏇存敼鏂囨湰鍐呭 QString::number()锛氭暟瀛楄浆涓篞String绫诲瀷瀛楃涓� + qDebug()<<ui->label->text(); //鍙栨枃鏈唴瀹� +} +``` + +**娣诲姞骞朵娇鐢ㄨ祫婧�** + +娣诲姞璧勬簮锛氬彸鍑诲伐绋嬪悕-->娣诲姞鏂版枃浠�-->Qt-->Qt Resource File -->鏀瑰悕--> 瀹屾垚-->娣诲姞鍓嶇紑-->娣诲姞鏂囦欢-->淇濆瓨 + +浣跨敤璧勬簮锛� + +- 1銆侀�氳繃灞炴�ч�夋嫨銆� +- 2銆佸湪鏍峰紡涓娇鐢紝鐢ㄧ殑鏄祫婧愯矾寰勩�� +- 3銆佸湪浠g爜娣诲姞璧勬簮璺緞锛屼娇鐢ㄣ�� + - 浣跨敤鏂瑰紡锛歶i->pushButton->setStyleSheet(); + +**榧犳爣鐐瑰嚮骞剁Щ鍔ㄧ獥鍙�** + +澶存枃浠讹細 + +``` +<QMouseEvent> + +<QPoint> +``` + +鏂规硶涓�锛� + +``` +void WorkMainWindow::mousePressEvent(QMouseEvent *event) //鑾峰彇鍋忕Щ閲忥紝榧犳爣鐐瑰嚮浜嬩欢 +{ + m_offect = event->globalPos() - this->pos(); //m_offect涓篞Point绫诲瀷鎴愬憳鍙橀噺 +} + +void WorkMainWindow::mouseMoveEvent(QMouseEvent *event) //榧犳爣绉诲姩浜嬩欢 +{ + this->move(event->globalPos() - m_offect); +} +``` + +event->globalPos() 鑾峰彇榧犳爣鍦ㄥ睆骞曚腑鐨勫叏灞�浣嶇疆銆� + +this->pos() 鑾峰彇褰撳墠绐楀彛鐨勪綅缃�� + +鏂规硶浜岋細 + +``` +//瀹氫箟榧犳爣涓夌鐘舵�佹柟娉� +protected: +//榧犳爣鎸変笅 +void mousePressEvent(QMouseEvent *e); +//榧犳爣绉诲姩 +void mouseMoveEvent(QMouseEvent *e); +//榧犳爣閲婃斁 +void mouseReleaseEvent(QMouseEvent *e); +private: +QPoint last; + +//鑾峰彇榧犳爣鐐瑰畾浣嶇獥浣撲綅缃� +void MainWindow::mousePressEvent(QMouseEvent *e) +{ + last = e->globalPos(); +} +void MainWindow::mouseMoveEvent(QMouseEvent *e) +{ + int dx = e->globalX() - last.x(); + int dy = e->globalY() - last.y(); + last = e->globalPos(); + move(x()+dx,y()+dy); +} +void MainWindow::mouseReleaseEvent(QMouseEvent *e) +{ + int dx = e->globalX() - last.x(); + int dy = e->globalY() - last.y(); + move(x()+dx, y()+dy); +} +``` + +setWindowFlag(Qt::FramelessWindowHint)锛� 鍒犻櫎绐楀彛椤堕儴 + +## QT榛樿婧愮爜 + +### QT澶存枃浠� mainWindow.h + +``` +#ifndef TESTMAINWINDOW_H +#define TESTMAINWINDOW_H + +#include <QMainWindow> + +namespace Ui {//閬垮厤鍚屽悕鍐茬獊锛屼娇鐢ㄥ懡鍚嶇┖闂� +class TestMainWindow;//璐熻矗鐣岄潰鐩稿叧鐨勪簨鎯� +} + +//鍚屽悕绫昏礋璐I瀵瑰簲鍔熻兘鐨勫疄鐜� +class TestMainWindow : public QMainWindow +{ + Q_OBJECT//鏈変簡杩欎釜瀹忥紝鎵嶈兘浣跨敤淇″彿涓庢Ы鍑芥暟 + +public: + static int a; + explicit TestMainWindow(QWidget *parent = 0);//鏄剧ず鍏抽敭瀛楋紝闃叉闅愬紡杞崲 + ~TestMainWindow(); + +private slots: + //鎸夐挳鐨勫姛鑳芥Ы鍑芥暟 + void on_pushButton_clicked(); + +private: + //ui鎸囬拡浠h〃鐫�璁捐鐣岄潰鐨勫璞� + Ui::TestMainWindow *ui; +}; + +#endif // TESTMAINWINDOW_H + +``` + +``` +namespace Ui { +class TestMainWindow;//璐熻矗鐣岄潰鐩稿叧鐨勪簨鎯� +} +``` + +瀹氫箟浜嗗懡鍚嶇┖闂碪i锛屽苟鍦ㄥ叾涓墠缃0鏄庝簡TestMainWindow绫伙紝杩欎釜绫诲氨鏄湪testmainwindow.h鏂囦欢涓湅鍒扮殑閭d釜绫汇�傚洜涓哄畠涓庢柊瀹氫箟鐨勭被鍚屽悕锛屾墍浠ヤ娇鐢ㄤ簡Ui鍛藉悕绌洪棿銆傝�屽墠缃0鏄庢槸涓轰簡鍔犲揩缂栬瘧閫熷害锛屼篃鍙互閬垮厤鍦ㄤ竴涓ご鏂囦欢涓殢鎰忓寘鍚叾浠栧ご鏂囦欢鑰屼骇鐢熼敊璇�傚洜涓鸿繖閲屽彧浣跨敤浜嗚绫诲璞$殑鎸囬拡锛屽锛� + +``` +private: + //ui鎸囬拡浠h〃鐫�璁捐鐣岄潰鐨勫璞� + Ui::TestMainWindow *ui; +}; +``` + +**瀹氫箟浜嗚绫诲璞$殑鎸囬拡锛岃繖骞朵笉闇�瑕佽绫荤殑瀹屾暣瀹氫箟锛屾墍浠ュ彲浠ヤ娇鐢ㄥ墠缃0鏄庯紙鍚庣画鍦╟pp鏂囦欢涓姞鍏i_xxx.h鐨勫ご鏂囦欢澹版槑锛夈��**杩欐牱灏变笉鐢ㄥ湪杩欓噷娣诲姞ui_hellodialog.h鐨勫ご鏂囦欢鍖呭惈锛岃�屽彲浠ュ皢鍏舵斁鍒癶ellodialog.cpp鏂囦欢涓繘琛屻�� + +``` +class TestMainWindow : public QMainWindow +{ + Q_OBJECT//鏈変簡杩欎釜瀹忥紝鎵嶈兘浣跨敤淇″彿涓庢Ы鍑芥暟 +``` + +瀹氫箟绫伙紝骞舵寚瀹氱户鎵胯嚜QMainWindow + +瀹氫箟浜哘_OBJECT瀹忥紝鎵╁睍浜嗘櫘閫欳++绫荤殑鍔熻兘锛屾瘮濡備笅涓�绔犺璁茬殑淇″彿鍜屾Ы鍔熻兘銆傚繀椤诲湪绫诲畾涔夌殑鏈�寮�濮嬪鏉ュ畾涔夎繖涓畯 + +``` +explicit TestMainWindow(QWidget *parent = 0);//鏄剧ず鍏抽敭瀛楋紝闃叉闅愬紡杞崲 +``` + +鏄樉寮忔瀯閫犲嚱鏁帮紝鍙傛暟鏄敤鏉ユ寚瀹氱埗绐楀彛鐨勶紝榛樿鏄病鏈夌埗绐楀彛鐨勩�� + +### QT main.cpp鏂囦欢 + +``` +explicit:鏄剧ず鐨勶紝闃叉闅愬紡杞崲 +class A{ + int a; +public: + explicit A(int x){ + a=x; + } +}; +int main(int argc, char *argv[]) +{ + + A a1(5);//鏄剧ず璋冪敤鏈夊弬鏋勯�� + A a2=A(5);//鏄剧ず璋冪敤鏋勯�狅細A锛坕nt x锛� + A a3=5; //闅愬紡杞崲锛屼竴鏃﹀姞浜唀xplicit锛屽叧閿瓧淇グ鏈夊弬鏋勯�狅紝闅愬紡杞崲灏变細澶辫触 + return 0; +} +``` + +``` +鏍囩锛歭abel + +api锛氳缃枃鏈細瀵硅薄.setText锛堚�滄枃鏈�濓級 + +鈥� 鍙栨枃鏈細瀵硅薄.Text锛堬級->杩斿洖QString绫诲瀷鐨勬枃鏈� + +ui鐣岄潰鎺т欢锛氶�氳繃ui鎸囬拡鎵惧埌 + +鈥� 鏁板瓧锛�0~N锛屾瘡鐐逛竴娆″�煎姞涓�锛屽苟鍦ㄦ爣绛句笂鏄剧ず鏈�鏂板�� + +鈥� 鏁板瓧杞瓧绗︿覆锛歈String锛氾細number锛堟暟瀛楋級 +``` + +**鍒涘缓搴旂敤绋嬪簭瀵硅薄**锛� + +- `QApplication`瀵硅薄璐熻矗绠$悊搴旂敤绋嬪簭鐨勭敓鍛藉懆鏈熷拰鍏ㄥ眬鐘舵�併�� +- 瀹冨鐞嗗簲鐢ㄧ▼搴忕殑鍒濆鍖栥�佷簨浠跺惊鐜拰璧勬簮绠$悊銆備緥濡傦紝瀹冭礋璐f帴鏀跺拰鍒嗗彂鎿嶄綔绯荤粺鍙戦�佺粰搴旂敤绋嬪簭鐨勪簨浠讹紝濡傞紶鏍囩偣鍑汇�侀敭鐩樿緭鍏ョ瓑銆� +- **QApplication绫诲璞�**锛岀敤浜庣鐞嗗簲鐢ㄧ▼搴忕殑璧勬簮锛屼换浣曚竴涓猀t GUI绋嬪簭閮借鏈変竴涓猀Application瀵硅薄銆傚洜涓篞t绋嬪簭鍙互鎺ユ敹鍛戒护琛屽弬鏁帮紝鎵�浠ュ畠闇�瑕乤rgc鍜宎rgv涓や釜鍙傛暟銆� + +**鍒濆鍖栧拰鏄剧ず鐣岄潰**锛� + +- 鍦╜main`鍑芥暟涓紝閫氬父浼氬垱寤虹晫闈㈢被鐨勫疄渚嬶紝骞惰皟鐢ㄥ叾`show`鏂规硶鏉ユ樉绀虹晫闈€�� + +- 鏂板缓浜嗕竴涓猀Label瀵硅薄锛屽苟灏哘Dialog瀵硅薄浣滀负鍙傛暟锛岃〃鏄庝簡瀵硅瘽妗嗘槸瀹冪殑鐖剁獥鍙o紝涔熷氨鏄杩欎釜鏍囩鏀惧湪瀵硅瘽妗嗙獥鍙d腑銆� +- 鍦ㄩ粯璁ゆ儏鍐典笅锛屾柊寤虹殑鍙閮ㄤ欢瀵硅薄閮芥槸涓嶅彲瑙佺殑锛岃浣跨敤show()鍑芥暟璁╁畠浠樉绀哄嚭鏉ャ�� + +**杩涘叆浜嬩欢寰幆**锛� + +- `main`鍑芥暟閫氬父浼氳皟鐢╜QApplication`瀵硅薄鐨刞exec`鏂规硶锛岃繘鍏ュ簲鐢ㄧ▼搴忕殑浜嬩欢寰幆銆� +- 浜嬩欢寰幆璐熻矗涓嶆柇鍦版帴鏀跺拰澶勭悊浜嬩欢锛岀洿鍒板簲鐢ㄧ▼搴忛��鍑恒�傚湪浜嬩欢寰幆涓紝褰撶敤鎴蜂笌鐣岄潰杩涜浜や簰鏃讹紝鐩稿簲鐨勪俊鍙峰拰妲戒細琚Е鍙戯紝鎵ц鐩稿簲鐨勪笟鍔¢�昏緫銆� + +- QApplication瀵硅薄杩涘叆浜嬩欢寰幆锛�**杩欐牱褰換t搴旂敤绋嬪簭鍦ㄨ繍琛屾椂渚垮彲浠ユ帴鏀朵骇鐢熺殑浜嬩欢**锛屼緥濡傚崟鍑诲拰閿洏鎸変笅绛変簨浠� + +**娓呯悊璧勬簮鍜岄��鍑哄簲鐢ㄧ▼搴�**锛� + +- 褰撳簲鐢ㄧ▼搴忛��鍑烘椂锛宍main`鍑芥暟璐熻矗娓呯悊璧勬簮锛屽閲婃斁鍐呭瓨銆佸叧闂枃浠剁瓑銆� +- 閫氬父锛屽湪`main`鍑芥暟鐨勬渶鍚庯紝浼氳繑鍥炰竴涓��鍑虹爜锛屼互鎸囩ず搴旂敤绋嬪簭鐨勯��鍑虹姸鎬� + +### QT mainWindow.cpp鏂囦欢 + +``` +#include "testmainwindow.h" +#include "ui_testmainwindow.h" +#include <QDebug> + +TestMainWindow::TestMainWindow(QWidget *parent) : + //濮旀墭鏋勯�� + QMainWindow(parent), + //寮�杈熸柊绌洪棿缁橴i鎸囬拡璧嬪�� + ui(new Ui::TestMainWindow) +{ + //缁欑晫闈㈡帶浠�/Ui鎸囬拡瀵硅薄鍒濆鍖栵紝寮�杈熷唴瀛� + ui->setupUi(this);//鍒濆鍖栵紝绫讳腑鐨勬寚閽堟尐涓柊寤� +} +TestMainWindow::~TestMainWindow() +{ + //鏋愭瀯鍫嗗唴瀛� + delete ui; +} + +int TestMainWindow::a = 100; + +//妲藉嚱鏁� +void TestMainWindow::on_pushButton_clicked() +{ + qDebug()<<"100"; + //閫氳繃鐐瑰嚮鎸夐挳 + qDebug()<<ui->label->text(); + + static int num; + ui->label->setText(QString::number(a)); + a++; +} + +``` + +绗�2琛屾坊鍔犱簡ui澶存枃浠讹紝鍥犱负鍦═estMainWindow.h鏂囦欢涓彧鏄娇鐢ㄤ簡鍓嶇疆澹版槑锛屾墍浠ュご鏂囦欢鍦ㄨ繖閲屾坊鍔犮�� + +绗�7琛岃缃畇etupUi()鍑芥暟鐨勫弬鏁颁负this锛岃〃绀轰负鐜板湪杩欎釜绫绘墍浠h〃鐨勫璇濇鍒涘缓鐣岄潰銆� + +### 鍦≦t Creator涓娇鐢�.ui鐣岄潰鏂囦欢 ui_xxx.h + +ui鐣岄潰鐢熸垚鐨勬帶浠舵槸xxx.ui鏍煎紡鐨刋ML鏂囦欢 + +闇�瑕侀�氳繃缂栬瘧.ui鏂囦欢锛� + +鈥� 鎵撳紑鍛戒护鎻愮ず绗︾▼搴忥紝鐒跺悗杈撳叆: +鈥� cd C:\Qt\helloworld_2鍛戒护杩涘叆helloworld_2鏂囦欢澶逛腑銆傚啀**浣跨敤uic缂栬瘧宸ュ叿锛屼粠ui鏂囦欢鐢熸垚澶存枃浠�**銆傚叿浣撳懡浠ゆ槸锛� +鈥� **uic 鈥搊 ui_hellodialog.h hellodialog.ui** +鈥� 灏卞儚鍓嶉潰鐪嬪埌鐨勯偅鏍凤紝ui鏂囦欢鐢熸垚鐨勯粯璁ゅご鏂囦欢鐨勫悕绉版槸鈥渦i_鈥濆姞ui鏂囦欢鐨勫悕绉般�傝繖鏃跺湪helloworld_2鐩綍涓凡缁忕敓鎴愪簡鐩稿簲鐨勫ご鏂囦欢銆� + +鏈湴纾佺洏鐨勯」鐩洰褰曠殑build-helloworld-Desktop_Qt_5_6_1_MinGW_32bit-Debug鐩綍涓紝灏卞彲浠ョ湅鍒扮敱.ui鏂囦欢鐢熸垚鐨剈i_hellodialog.h澶存枃浠躲�� + +鎴栨槸鍦ㄦ簮鏂囦欢鐨勬瀯閫犲嚱鏁扮殑鍒濆鍖栧垪琛ㄤ腑瀵筓i::绫诲悕浣跨敤F2杩涘叆 + +ui澶存枃浠朵腑鍖呭惈浜嗗鎵�鏈夎璁$晫闈㈢殑鎺т欢鐨勫垵濮嬪寲瀹氫箟鍜岄噸鍛藉悕锛屾渶鍚庝娇鐢╟onnectSlotsByName杩涜鍏宠仈 + +``` +QMetaObject::connectSlotsByName(ConnectionMainWindow); +``` + +## qt绐楀彛鎷栨嫿浜嬩欢 + +### QT绯荤粺涓ゅぇ寰幆 + +**1.绯荤粺鐨勬秷鎭惊鐜細**浼氶�氳繃寰幆鎵ц鐨勬秷鎭槦鍒楁帴鏀惰緭鍏ヨ澶�(榧犳爣銆侀敭鐩樼偣鍑�)鍙戞潵鐨勬秷鎭紝杩涜瀵瑰簲鐨勪腑鏂簨浠� + +**2.Qt绋嬪簭鐨勪簨浠跺惊鐜細**绋嬪簭閫氳繃浜嬩欢寰幆锛屾崟鎹夊搴斾簨浠讹紝鍒嗗彂缁欏搴旈儴浠讹紝浠庤��**鎵ц涓庝箣鍏宠仈鐨勬Ы鍑芥暟** + +### 榧犳爣鐐瑰嚮骞剁Щ鍔ㄧ獥鍙g殑闂 + + + +### 绐楀彛鎷栨嫿瀹炵幇 + +澶存枃浠舵瀯閫犲嚱鏁颁腑鍔犲叆鍧愭爣鎴愬憳鍙橀噺鍜岄紶鏍囩偣鍑汇�侀紶鏍囨嫋鎷戒簨浠� + +```cpp +public: + explicit Login(QWidget *parent = 0); + ~Login(); + + QPoint m_offset; + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); +``` + +婧愭枃浠朵腑閫氳繃璁$畻绐楀彛宸︿笂瑙掑潗鏍囧拰榧犳爣闂村亸绉婚噺鏉ュ疄鐜扮Щ鍔� + +qt2022浣跨敤globalPosition().toPoint()鑾峰彇褰撳墠榧犳爣鍧愭爣 + +```cpp +void Login::mousePressEvent(QMouseEvent *event) +{ + //姹傚潗鏍囧亸绉婚噺 + m_offset = event->globalPos() - this->pos(); +} + +void Login::mouseMoveEvent(QMouseEvent *event) +{ + //绉诲姩绐楀彛锛岀獥鍙f柊鍧愭爣璁板綍涓哄綋鍓嶉紶鏍囨澗寮�浣嶇疆-绉诲姩鐨勫亸绉婚噺 + this->move(event->globalPos() - m_offset); +} +``` + +鏂规硶3锛氬畾涔塓Point last; last璁板綍榧犳爣鐐瑰嚮绐楀彛鏃剁殑绐楀彛鍧愭爣 + +```cpp +//鑾峰彇榧犳爣鐐瑰畾浣嶇獥浣撲綅缃� +void MainWindow::mousePressEvent(QMouseEvent *event) +{ + last = event->globalPos(); +} + +void MainWindow::mouseMoveEvent(QMouseEvent *event) +{ + int dx = event->globalX() - last.x(); + int dy = event->globalY() - last.y(); + + last = event->globalPos(); + move(x()+dx,y()+dy); +} + +void MainWindow::mouseReleaseEvent(QMouseEvent *event) +{ + //dx,dy鏄亸绉婚噺 + int dx = event->globalX() - last.x(); + int dy = event->globalY() - last.y(); + move(x()+dx,y()+dy); +} +``` + +## 瀵硅薄妯″瀷 + +淇″彿鏈川鍒欎负浜嬩欢銆傛Ы鐨勬湰璐ㄦ槸瀵逛俊鍙峰搷搴旂殑鍑芥暟 + +淇″彿鍛堢幇鏂瑰紡灏辨槸鍑芥暟(鏌愪釜浜嬩欢浜х敓锛孮t妗嗘灦鏈哄埗浼氳皟鐢ㄥ搴旂殑淇″彿鍑芥暟锛岄�氱煡浣跨敤鑰咃級銆� + +- 1銆佹墍璋撲俊鍙锋Ы(瑙傚療鑰呮ā寮�)銆� +- 2銆佸綋鏌愪竴涓簨浠跺彂鐢熶箣鍚庯紝鍒欎細鍙戝嚭涓�涓俊鍙�(signal)銆� +- 3銆佸鐞嗕俊鍙峰拰鑷繁鐨勪竴鍑芥暟绉颁负妲�(slot)缁戝畾鏉ュ鐞嗚繖涓鐞嗚繖涓俊鍙枫�傚綋淇″彿鍙戝嚭鏃讹紝琚繛鎺ョ殑妲藉嚱鏁颁細鑷姩琚洖璋冩搷浣溿�傛Ы鍑芥暟鍙互璺熶竴涓俊鍙峰叧鑱旓紝褰撲俊鍙疯鍙戝皠鍚庯紝**鍏宠仈鐨勬Ы鍑芥暟鑷姩鎵ц銆�** +- 4銆乧onnect():鍙傛暟1淇″彿鍙戦�佽��;鍙傛暟2淇″彿;鍙傛暟3淇″彿鎺ユ敹鑰�;鍙傛暟4妲藉嚱鏁�(鎺ユ敹鍒颁俊鍙蜂箣鍚庢墽琛岀殑鍑芥暟)銆� + +### 淇″彿锛氭槸涓�涓嚱鏁� + +澹版槑锛歴ignals + +浣滅敤锛氫綔涓鸿Е鍙戣�� + +``` +绫� +signals: + void 淇″彿鍚�(褰㈠弬鍒楄〃); //鍙0鏄庯紝涓嶅疄鐜� +浣跨敤锛歟mit 淇″彿鍚�(瀹炲弬); +``` + +绫讳腑澹版槑涓�涓俊鍙凤紝渚嬪锛� + +signals: + + void dlgReturn(int); // 鑷畾涔夌殑淇″彿锛屽彧澹版槑锛屼笉瀹炵幇 + +- 澹版槑涓�涓俊鍙疯浣跨敤signals鍏抽敭瀛椼�� +- 鍦╯ignals鍓嶉潰涓嶈兘浣跨敤public銆乸rivate鍜宲rotected绛夐檺瀹氱锛屽洜涓哄彧鏈夊畾涔夎淇″彿鐨勭被鍙婂叾瀛愮被鎵嶅彲浠ュ彂灏勮淇″彿銆� +- 淇″彿鍙敤澹版槑锛屼笉闇�瑕佷篃涓嶈兘瀵瑰畠杩涜瀹氫箟瀹炵幇銆� +- 淇″彿娌℃湁杩斿洖鍊硷紝鍙兘鏄痸oid绫诲瀷鐨勩�� +- 鍙湁QObject绫诲強鍏跺瓙绫绘淳鐢熺殑绫绘墠鑳戒娇鐢ㄤ俊鍙峰拰妲芥満鍒讹紝浣跨敤淇″彿鍜屾Ы锛岃繕蹇呴』鍦ㄧ被澹版槑鐨勬渶寮�濮嬪娣诲姞Q_OBJECT瀹忋�� + +**鍙戝皠淇″彿** + +渚嬪锛� + +void MyDialog::on_pushButton_clicked() // 纭畾鎸夐挳 + +{ + + int value = ui->spinBox->value(); // 鑾峰彇杈撳叆鐨勬暟鍊� + + emit dlgReturn(value); // 鍙戝皠淇″彿 + + close(); // 鍏抽棴瀵硅瘽妗� + +} + +褰撳崟鍑荤‘瀹氭寜閽椂锛屼究鑾峰彇spinBox閮ㄤ欢涓殑鏁板�硷紝鐒跺悗浣跨敤鑷畾涔夌殑淇″彿灏嗗叾浣滀负鍙傛暟鍙戝皠鍑哄幓銆傚彂灏勪竴涓俊鍙疯浣跨敤emit鍏抽敭瀛楋紝渚嬪绋嬪簭涓彂灏勪簡dlgReturn()淇″彿銆� + +淇″彿浣滅敤锛氫綔涓鸿Е鍙戣�� + +### 妲斤細鎴愬憳鍑芥暟 + +澹版槑锛歴lots + +浣滅敤锛氫綔涓哄姛鑳芥墽琛岃�� + +``` +绫� +private slots锛� + void 妲藉悕(褰㈠弬鍒楄〃); //鏈夊0鏄庯紝鏈夊疄鐜� + {//鍔熻兘} +``` + +澹版槑锛� + +private slots: + + void showValue(int value); + +瀹炵幇锛� + +void Widget::showValue(int value) // 鑷畾涔夋Ы + +{ + + ui->label->setText(tr("鑾峰彇鐨勫�兼槸锛�%1").arg(value)); + +} + +浣滅敤锛氫綔涓哄姛鑳芥墽琛岃�呫�� + +- 澹版槑涓�涓Ы闇�瑕佷娇鐢╯lots鍏抽敭瀛椼�� +- 涓�涓Ы鍙互鏄痯rivate銆乸ublic鎴栬�卲rotected绫诲瀷鐨勶紝妲戒篃鍙互琚0鏄庝负铏氬嚱鏁帮紝杩欎笌鏅�氱殑鎴愬憳鍑芥暟鏄竴鏍风殑锛屼篃鍙互鍍忚皟鐢ㄤ竴涓櫘閫氬嚱鏁颁竴鏍锋潵璋冪敤妲姐�� +- 妲界殑鏈�澶х壒鐐瑰氨鏄彲浠ュ拰淇″彿鍏宠仈銆� + +### 淇″彿妲斤細瀹炵幇瀵硅薄闂寸殑閫氫俊 + +淇″彿鍜屾Ы鐢ㄤ簬涓や釜瀵硅薄涔嬮棿鐨勯�氫俊锛屼俊鍙峰拰妲芥満鍒舵槸Qt鐨勬牳蹇冪壒寰侊紝涔熸槸Qt涓嶅悓浜庡叾浠栧紑鍙戞鏋剁殑鏈�绐佸嚭鐨勭壒寰併�� + +- 鍦≦t涓紝浣跨敤浜嗕俊鍙峰拰妲芥潵杩涜瀵硅薄闂寸殑閫氫俊銆� +- 褰撲竴涓壒娈婄殑浜嬫儏鍙戠敓鏃朵究鍙互鍙戝皠涓�涓俊鍙凤紝姣斿鎸夐挳琚崟鍑伙紱鑰屾Ы灏辨槸涓�涓嚱鏁帮紝瀹冨湪淇″彿鍙戝皠鍚庤璋冪敤锛屾潵鍝嶅簲杩欎釜淇″彿銆� +- 鍦≦t鐨勯儴浠剁被涓凡缁忓畾涔変簡涓�浜涗俊鍙峰拰妲斤紝浣嗘槸鏇村鐨勫仛娉曟槸瀛愮被鍖栬繖涓儴浠讹紝鐒跺悗娣诲姞鑷繁鐨勪俊鍙峰拰妲芥潵瀹炵幇鎯宠鐨勫姛鑳姐�� + +**璋冪敤椤哄簭锛�** + +1銆佸湪Qt4鐗堟湰閲岄潰锛屽綋淇″彿琚Е鍙戞椂锛屼細渚濇闅忔満璋冪敤锛屽嵆鏈淇″彿浼氭妸涓庝俊鍙峰叧鑱旂殑鎵�鏈夌殑妲藉嚱鏁伴兘璋冪敤涓�閬嶏紝浣嗛『搴忔槸闅忔満鐨勶紝鍙敤STL妯℃澘搴撶殑map(鏈夊簭瀛樺偍)銆乻et(鏈夊簭瀛樺偍)瀹瑰櫒瀛樺偍銆� + +2銆佸湪Qt5鐗堟湰閲岄潰锛屽垯涓庡叧鑱斾俊鍙风殑椤哄簭鏈夊叧锛岃皟鐢ㄩ『搴忎笌鍏宠仈椤哄簭涓�鑷淬�傚彲鐢⊿TL妯℃澘搴撶殑vector銆乴ist銆乨eque銆乽nordered_map(鏃犲簭瀛樺偍)銆乽nordered_set(鏃犲簭瀛樺偍)瀹瑰櫒瀛樺偍銆� + +### 淇″彿妲界殑鍏宠仈鍑芥暟锛� + +**connect(淇″彿鍙戦�佽�呫�佷俊鍙枫�佷俊鍙锋帴鏀惰�呫�佹Ы銆佽繛鎺ユ柟寮�)** + +鍑芥暟鍘熷瀷锛� + +bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) + +- 瀹冪殑绗竴涓弬鏁颁负鍙戦�佷俊鍙风殑瀵硅薄锛屼緥濡傝繖閲岀殑dlg锛� +- 绗簩涓弬鏁版槸瑕佸彂閫佺殑淇″彿锛岃繖閲屾槸SIGNAL(dlgReturn(int))锛� +- 绗笁涓弬鏁版槸鎺ユ敹淇″彿鐨勫璞★紝杩欓噷鏄痶his锛岃〃鏄庢槸鏈儴浠讹紝鍗砏idget锛屽綋杩欎釜鍙傛暟涓簍his鏃讹紝涔熷彲浠ュ皢杩欎釜鍙傛暟鐪佺暐鎺夛紝鍥犱负connect()鍑芥暟杩樻湁鍙﹀涓�涓噸杞藉舰寮忥紝璇ュ弬鏁伴粯璁や负this锛� +- 绗洓涓弬鏁版槸瑕佹墽琛岀殑妲斤紝杩欓噷鏄疭LOT(showValue(int))銆� +- 瀵逛簬淇″彿鍜屾Ы锛屽繀椤讳娇鐢⊿IGNAL()鍜孲LOT()瀹忥紝瀹冧滑鍙互灏嗗叾鍙傛暟杞寲涓篶onst char* 绫诲瀷銆俢onnect()鍑芥暟鐨勮繑鍥炲�间负bool绫诲瀷锛屽綋鍏宠仈鎴愬姛鏃惰繑鍥瀟rue銆� +- 淇″彿鍜屾Ы鐨勫弬鏁板彧鑳芥湁绫诲瀷锛屼笉鑳芥湁鍙橀噺锛屼緥濡傚啓鎴怱LOT(showValue(int value))鏄笉瀵圭殑銆傚浜庝俊鍙峰拰妲界殑鍙傛暟闂锛屽熀鏈師鍒欐槸淇″彿涓殑鍙傛暟绫诲瀷瑕佸拰妲戒腑鐨勫弬鏁扮被鍨嬬浉瀵瑰簲锛岃�屼笖淇″彿涓殑鍙傛暟鍙互澶氫簬妲戒腑鐨勫弬鏁帮紝浣嗘槸涓嶈兘鍙嶈繃鏉ワ紝濡傛灉淇″彿涓湁澶氫綑鐨勫弬鏁帮紝閭d箞瀹冧滑灏嗚蹇界暐銆� + +淇″彿鍙戦�佽�呮槸涓�涓寚閽堬紝鎷ユ湁淇″彿锛涗俊鍙锋帴鏀惰�呮槸涓�涓寚閽堬紝鎷ユ湁妲斤紱 + +杩炴帴鏂瑰紡锛� + +- 鑷姩杩炴帴(Qt::AutoConnection)锛氶粯璁ょ殑锛屽崟绾跨▼鍒囨崲鍒扮洿鎺ヨ繛鎺ワ紝澶氱嚎绋嬪垏鎹㈠埌闃熷垪杩炴帴銆� +- 鐩存帴杩炴帴(Qt::DirectConnection)锛氬崟绾跨▼锛屽悓姝ワ紝闃诲銆� +- 闃熷垪杩炴帴(Qt::QueuedConnection)锛氾紙鍗曪級澶氱嚎绋嬶紝寮傛锛岄潪闃诲銆� +- 闃诲闃熷垪杩炴帴(Qt::BlockingQueuedConnection)锛氬彧鑳藉绾跨▼锛屽悓姝ワ紝闃诲锛涜嫢鍗曠嚎绋嬶紝姝婚攣銆� +- 鍞竴杩炴帴(Qt::UniqueConnection)锛氶槻姝㈤噸澶嶈繛鎺ワ紙鍏朵粬鏁堟灉鍚岃嚜鍔ㄨ繛鎺ワ級銆� + +淇″彿鍙戦�佽�呭拰鎺ユ敹鑰呭湪鍚屼竴绾跨▼鍐呬负鍗曠嚎绋嬨�� + +淇″彿鍙戦�佽�呭拰鎺ユ敹鑰呬笉鍦ㄥ悓涓�绾跨▼鍐呬负澶氱嚎绋嬨�� + +鍚屾锛氭帓闃熸墽琛屻�� + +寮傛锛氬悓鏃舵墽琛屻�� + +STL搴擄細vector 5 list 5 deque 5 map 4 set 4 + + + +### 鍏宠仈鍑芥暟鍘熷瀷锛� + +connect鍐欐硶锛� + +1.瀹忕殑鍐欐硶锛歋IGNAL,SLOT锛宑onnect(淇″彿鍙戦�佽�咃紝SIGNAL(淇″彿鍚�(鍙傜被鍨�))锛屼俊鍙锋帴鏀惰�咃紝SLOT(妲藉悕(鍙傜被鍨�)))锛� + +``` +澶存枃浠剁被涓0鏄庯細 +signals: + void mySignal(); //淇″彿澹版槑 +private slots: + void mySlot(); //妲藉0鏄� + void on_pushButton_clicked(); + +婧愭枃浠讹細 +SignalSlotMainWindow::SignalSlotMainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::SignalSlotMainWindow) +{ + ui->setupUi(this); + connect(this,SIGNAL(mySignal()),this,SLOT(mySlot())); //淇″彿妲借繛鎺� + //淇″彿鍙戦�佽�呬负鎸囬拡绫诲瀷锛屾嫢鏈変俊鍙凤紝淇″彿鎺ユ敹鑰呬负鎸囬拡绫诲瀷锛屾嫢鏈夋Ы鍑芥暟 +} +SignalSlotMainWindow::~SignalSlotMainWindow() +{ + delete ui; +} +void SignalSlotMainWindow::mySlot() //鑷畾涔夋Ы鍑芥暟 +{ + qDebug()<<100; +} +void SignalSlotMainWindow::on_pushButton_clicked() //榛樿妲藉嚱鏁帮紝鐐瑰嚮浜嬩欢 +{ + emit mySignal(); //鍙戝皠淇″彿 +} +``` + +2.涓�鑸殑鍑芥暟鎸囬拡锛屽墠鎻愭槸淇″彿妲芥棤閲嶈浇锛� + +connect(淇″彿鍙戦�佽�咃紝&绫诲悕锛氾細淇″彿鍚嶏紝淇″彿鎺ユ敹鑰咃紝&绫诲悕锛氾細妲藉悕)锛� + +``` +connect(d,&D::ShowSignal,this,&WorkMainWindow::ShowSlot); +``` + +3.鑻ユ湁閲嶈浇锛屼娇鐢≦Overload鍔犺浇鍑芥暟鎸囬拡锛� + +connect(淇″彿鍙戦�佽�咃紝QOverlaod<褰㈠弬>锛氾細of(&绫诲悕锛氾細淇″彿鍚�)锛屼俊鍙锋帴鏀惰�咃紝QOverlaod<褰㈠弬鍒楄〃>锛氾細of(&绫诲悕锛氾細妲藉悕))锛� + +``` +connect(d,QOverload<>::of(&D::ShowSignal),this,QOverload<>::of(&WorkMainWindow::ShowSlot)); +``` + +4.鑻ユЫ鍔熻兘绠�鍗曪紝鍒欏彲浣縧ambda琛ㄨ揪寮忓彇浠fЫ锛� + +connect(淇″彿鍙戦�佽�咃紝QOverlaod<褰㈠弬鍒楄〃>锛氾細of(&绫诲悕锛氾細绫诲悕)锛屼俊鍙锋帴鏀惰�咃紝銆�=/&/鍙橀噺鍚嶃��(褰㈠弬鍒楄〃){...})锛� + +``` +connect(d,QOverload<>::of(&D::ShowSignal),this,[=](){ + a->show(); + b->show(); + c->show(); + this->show();}); +``` + +**淇″彿涓庢Ы瀹炵幇姝ラ** + +- 1銆佹湁淇″彿-->鎵惧湴鏂瑰彂灏勪俊鍙� +- 2銆佹湁妲�-->瀹炵幇鍔熻兘銆� + - **娉ㄦ剰锛氫俊鍙蜂笌妲藉湪涓�寮�濮嬫棤浠讳綍鍏崇郴銆�** +- 3銆佸叧鑱斾俊鍙锋Ы-->鍏宠仈涔嬪悗锛屼骇鐢熷叧绯汇�� + - 浣跨敤connect()鍑芥暟杩涜鍏宠仈锛屽畯鐨勫啓娉曪細SIGNAL/SLOT锛屼俊鍙峰彂灏勫悗灏变細鎵ц妲藉嚱鏁般�� + +**浣跨敤淇″彿妲界殑鏉′欢** + +1銆佺被寰楃户鎵� QObject 绫伙紙鐩存帴鎴栭棿鎺ワ級 + +2銆佺被棣栬寰椾娇鐢ㄥ畯锛歈_OBJECT + +3銆佹墠鍙互娣诲姞鑷畾涔変俊鍙枫�佹Ы銆� + +**娉ㄥ唽鍏冪被鍨�** + +褰撲俊鍙锋Ы鐨勫弬鏁颁负鑷畾涔夌被鍨嬫椂锛岄渶瑕佹敞鍐屽厓绫诲瀷鎵嶈兘瀹夊叏浣跨敤锛岀壒鍒槸鍦ㄥ绾跨▼鐨勬儏鍐典笅锛� + +API锛歲RegisterMataType<绫诲瀷>("绫诲瀷"); + +***鑷姩鍏宠仈(鍙仛浜嗚В)锛�** + +**鏍煎紡锛�** + +void on_瀵硅薄鍚峗淇″彿鍚�(褰㈠弬鍒楄〃鈥︹��); //妲藉嚱鏁� + +**鏉′欢锛�** + +- 缁欏璞℃敞鍐屽悕瀛楋細瀵硅薄.setObjectName("瀵硅薄")锛� + - 绀轰緥锛歱ushButton = new QPushButton(centralWidget); + - pushButton->setObjectName(QStringLiteral("pushButton")); +- 璋冪敤锛歝onnectSlotsByName(瀵硅薄鍚�) + - 绀轰緥锛歈MetaObject::connectSlotsByName(ConnectionMainWindow); + +**缁撹锛�** + +1銆丵Object绫绘槸鎵�鏈塓t绫荤殑鍩虹被 + +2銆丵Widget绫绘槸鎵�鏈夊彲瑙嗙晫闈㈢被鐨勫熀绫� + +**鎬荤粨锛�** + +**UI鐩稿叧锛�** + +1銆佸厛缁樺埗鏁堟灉鐣岄潰銆� + +2銆佹兂鍔炴硶鍦ㄤ富鐣岄潰鏄剧ず鍑烘墍鏈夌晫闈€�� + +**鍔熻兘鐩稿叧锛�** + +鎼炴竻妤氳皝鏈変俊鍙疯皝鏈夋Ы锛屾兂娓呮鍦ㄥ摢閲岃繛鎺ヤ俊鍙锋Ы銆� + +涓�鑸湪涓荤晫闈㈠叧鑱旓紙鏍囧噯璇存硶锛氬湪鎷ユ湁淇″彿/妲界殑瀵硅薄鐨勭被涓叧鑱旓級銆� + + + +瀵硅薄鏍�(澶氬弶鏍�)锛氱被浼糃++閲屾櫤鑳芥寚閽堢殑鏁堟灉锛岄槻姝t鐨勫爢鍐呭瓨娉勬紡銆� + +**瀛楃涓叉埅鍙�** + +QString str = "abcdefg"; + +str.left(闀垮害) 浠�0寮�濮嬬殑闀垮害 + +str.mid(涓嬫爣锛岄暱搴�) 浠庝笅鏍囧紑濮嬶紝鍘籱涓瓧绗� + +str.right(闀垮害) 浠庢湯灏惧紑濮嬶紝鍚戝墠鍙栭暱搴︿釜瀛楃 + +**<Qtimer> 淇″彿锛歵imeout()-->鍏宠仈妲�** + +API鍑芥暟锛� + +- start()/start(姣) 鍚姩 +- stop() 鍋滄 +- 璁惧畾鍛ㄦ湡 setInterval(姣) + +**瀛楃鏁板�艰浆鎹�** + +瀛楃涓茶浆鏁板�硷細str.toInt(); //str涓篞String绫诲瀷 + +鏁板�艰浆瀛楃涓诧細QString::number(鏁板瓧) + +### 淇″彿涓庢Ы鐨勯噸澶嶈繛鎺ラ棶棰� + +**涓�銆佸啓鍦ㄧ偣鍑绘Ы鍑芥暟鍐呭鑷撮噸澶嶅叧鑱旂殑鍘熷洜** + +1. 澶氭璋冪敤闂锛� + - 褰撴妸淇″彿涓庢Ы鐨刞connect`鍏宠仈鍑芥暟鍐欏湪鎸夐挳鐐瑰嚮鐨勬Ы鍑芥暟锛堝`on_pushButton_clicked`锛変腑鏃讹紝姣忔鐐瑰嚮鎸夐挳锛岃繖涓Ы鍑芥暟閮戒細琚墽琛屼竴娆°�� + - 姣忔鎵ц閮戒細鍐嶆璋冪敤`connect`锛屼粠鑰屽鑷翠俊鍙峰拰鍚屼竴涓Ы涓嶆柇鍦伴噸澶嶅叧鑱斻�� + - 渚嬪锛岀涓�娆$偣鍑绘寜閽紝寤虹珛浜嗕竴涓叧鑱旓紱绗簩娆$偣鍑伙紝鍙堝缓绔嬩簡涓�涓浉鍚岀殑鍏宠仈锛屼互姝ょ被鎺ㄣ�� + +**浜屻�佸啓鍦ㄦ瀯閫犲嚱鏁颁腑涓嶄細閲嶅鍏宠仈鐨勫師鍥�** + +1. 涓�娆℃�у缓绔嬭繛鎺ワ細 + - 鏋勯�犲嚱鏁板湪瀵硅薄鍒涘缓鏃跺彧琚皟鐢ㄤ竴娆°�� + - 鎶婁俊鍙蜂笌妲界殑鍏宠仈鏀惧湪鏋勯�犲嚱鏁颁腑锛屽湪瀵硅薄鍒濆鍖栨椂灏卞缓绔嬩簡杩炴帴锛屽苟涓旇繖涓繃绋嬪彧鍙戠敓涓�娆°�� + - 鍚庣画鏃犺杩涜澶氬皯娆℃寜閽偣鍑绘垨鍏朵粬鎿嶄綔锛岄兘涓嶄細鍐嶆寤虹珛鐩稿悓鐨勮繛鎺ワ紝鍥犱负杩炴帴鍦ㄤ竴寮�濮嬪氨宸茬粡纭畾骞朵笖涓嶄細琚噸澶嶆墽琛屻�� + +缁间笂鎵�杩帮紝涓轰簡閬垮厤閲嶅鍏宠仈锛岄�氬父寤鸿鍦ㄦ瀯閫犲嚱鏁版垨鍏朵粬鍚堥�傜殑鍒濆鍖栦綅缃繘琛屼俊鍙蜂笌妲界殑杩炴帴锛岃�屼笉鏄湪鍙兘琚娆¤皟鐢ㄧ殑妲藉嚱鏁板唴閮ㄨ繘琛岃繛鎺ユ搷浣溿�� + +### 浣跨敤淇″彿妲芥敞鎰忎簨椤癸細 + +1.绫荤户鎵縌Object绫籟鐩存帴鎴栭棿鎺 + +2.绫婚琛屼娇鐢ㄥ畯锛歈_OBJECT + +3.娣诲姞鑷畾涔変俊鍙凤紝妲� + +``` +褰撲俊鍙锋Ы鐨勫弬鏁颁负鑷畾涔夌被鍨嬫椂锛岄渶瑕佸仛涓�浜涚壒娈婂鐞嗘墠鑳藉畨鍏ㄤ娇鐢紝鐗瑰埆鏄湪澶氱嚎绋嬬殑鎯呭喌涓嬶紱 +鐗规畩澶勭悊灏辨槸锛氬鑷畾涔夌被鍨嬭繘琛屽厓绫诲瀷娉ㄥ唽锛� +鍙互鐩存帴浣跨敤API鏉ユ敞鍐岋細濡備笅 + qRegisterMetaType<MyClass>(鈥淢yClass鈥�) +鑻ヨ浣跨敤鍒板紩鐢ㄧ被鍨嬶紝涔熼渶瑕佸寮曠敤娉ㄥ唽 +qRegisterMetaType<MyClass>(鈥淢yClass&鈥�) +``` + +qRegisterMetaType<绫诲瀷>(鈥滅被鍨嬧��) + +缁撹锛� + +1.QObject绫绘槸鎵�鏈塹t绫荤殑鍩虹被 + +2.QWidget绫绘槸鎵�鏈夊彲瑙嗗寲鐣岄潰绫荤殑鍩虹被 + +### qt涓夊ぇ鏍稿績 + +1.淇″彿妲� + +2.鍏冨璞$郴缁� + +3.浜嬩欢妯″瀷 + +``` +鑷姩鍏宠仈锛� +void on_瀵硅薄鍚峗淇″彿鍚�(褰㈠弬鍒楄〃); //妲藉嚱鏁� +``` + +MFC锛氬井杞熀纭�绫诲簱锛屼篃鍙互鍦╲s涓嬬粯鍒秛i鐣岄潰銆恦s鍐呴噺銆� + +| | 骞冲彴 | 璺ㄥ钩鍙� | 閫氫俊鏂瑰紡 | 婧愮爜 | 寰幆 | +| ---- | ----------------------- | ------ | -------- | ---- | -------- | +| MFC | Windows | 鍚� | 鍥炶皟鏈哄埗 | 闂簮 | 娑堟伅寰幆 | +| Qt | Linux锛學indows锛孉ndroid | 鏄� | 淇″彿妲� | 寮�婧� | 浜嬩欢寰幆 | + +## sender鍑芥暟 + +**淇″彿妲戒紶閫佹暟鎹殑涓ょ鏂瑰紡**锛� + +1.淇″彿涓甫鍙傛暟 + +2.sender鍑芥暟+灞炴�х郴缁� + +**sender鍑芥暟浣滅敤:**杩斿洖淇″彿鍙戦�佽�呯殑鎸囬拡 + +**sender鐨勪娇鐢ㄥ満鏅細**鍙互鍦ㄦЫ涓嬁鍒板璞℃寚閽堬紝閰嶅悎灞炴�х郴缁燂紝鍙�**瀹炵幇瀵硅薄闂撮�氫俊** + +QSignalMapper + +API锛� + +- mapping(鍙傛暟) +- sethapping(鍙傛暟锛屽弬鏁�) + +``` + connect(m_second,SIGNAL(secSignal()),this,SLOT(showtext())); 杩炴帴淇″彿妲� + +void PropertyMainWindow::showtext() +{ + QString str = sender()->property("textData").toString(); //閫氳繃淇″彿鍙戦�佽�呯殑瀵硅薄鎸囬拡鑾峰彇textData灞炴�у唴瀹癸紝杞负瀛楃涓插瀷 + ui->label->setText(str); //淇敼label鐨則ext灞炴�т负str +} +``` + +## 灞炴�у搴擜PI + +``` +鍏堟妸鎺т欢鏀惧埌ui鐣岄潰 + +鍦ㄦ瀯閫犱腑ui->鎺т欢瀵硅薄->璇�->1.灞炴�у悕褰撳嚱鏁板悕 + 2.鍔犲墠缂�閰嶅悎浣跨敤 + 鍐�->set灞炴�у悕(鍙傛暟鍒楄〃) +鏍囩锛屾寜閽紝琛岀紪杈戞 text->text() + setText() +鍐呭锛氭暟鍊硷紝鏂囨湰锛屼笅鎷夐�夋嫨 +璇伙細灞炴�у悕() +鍐欙細set灞炴�у悕() + +澶嶉�夋 +is灞炴�у悕--bool +has灞炴�у悕--bool +灞炴�у悕--bool +``` + +## 灞炴�х郴缁� + +1.浣滅敤 + +- 1銆佸彲閰嶅悎sender()鍑芥暟瀹炵幇瀵硅薄闂寸殑閫氫俊銆� +- 2銆佸彲鐢ㄦ潵鎺屾彙鎺т欢鑳屽悗鐨勫疄鐜板師鐞嗐�� + +2.娣诲姞灞炴�х殑鏂瑰紡 + +1銆佸畯锛歈_PROPERTY + +2銆丄PI锛� + +瀵硅薄.setProperty() 娣诲姞/淇敼 + +瀵硅薄.property() 璇诲彇灞炴�� + +**瀹忕殑鏂瑰紡** + +Q_PROPERTY(绫诲瀷 灞炴�у悕 READ 鍑芥暟鍚� WRITE 鍑芥暟鍚� NOTIFY 淇″彿鍚嶁�︹��); + +绫诲瀷锛氶渶娣诲姞瀵瑰簲鐨勭鏈夋垚鍛樺瓨灞炴�у唴瀹�(鍚岀被鍨�) + +灞炴�у悕锛氬綋瀛楃涓茬敤 + +鍑芥暟鍚嶏細瀵圭鏈夋垚鍛樺彉閲忚鍐� + +淇″彿鍚嶏細鍐欑殑鏃跺�欏彂灏勪俊鍙烽�氱煡鍙樻洿浜嗭紝鍙樻洿鏃舵惡甯﹀弬鏁帮紝浼犻�掑彉鏇寸殑鍐呭銆� + +鐢╩ap瀹瑰櫒瀛樻斁鍚嶅�煎锛屽瓨鍦ㄥ垯瑕嗙洊锛涗笉瀛樺湪鍒欐柊澧炪�� + +## 瀵硅薄鏍�: + +**鏈川:**澶氬弶鏍戙�傚埄鐢ㄦ爤鐨勭粨鏋勭壒鐐瑰幓鑷姩閿�姣佺埗鑺傜偣瀵瑰叾瀛╁瓙鍒楄〃涓殑瀵硅薄涔熶竴璧疯閿�姣� + +**浣滅敤锛�** + +- 闃叉鍐呭瓨娉勬紡锛屼笌鏅鸿兘鎸囬拡寮傛洸鍚屽伐銆� +- 鑻ュ璞℃湁鐣岄潰锛岃繕鍙互鎺у埗鐣岄潰鏄剧ず灞傛銆傦紙瀛愰儴浠跺湪鐖堕儴浠朵笂鏄剧ず锛� + - 娉ㄦ剰锛氳繖閲岀殑鐖跺瓙鏄潪缁ф壙鍏崇郴锛屽彧鏄爲涓婄殑鑺傜偣鍏崇郴銆� + +**娣诲姞瀵硅薄鍒版爲鐨勬柟寮忥細** + +1銆佸疄渚嬪寲鏃讹紝鍙傛暟浼犵埗鑺傜偣鎸囬拡 + +``` +A *a1 = new A(this); //this浣滀负a1鐨勭埗鑺傜偣鎸囬拡 +``` + +2銆佷娇鐢ˋPI鏉ユ寚瀹氱埗鑺傜偣鎸囬拡锛氬璞�.setParent(鐖惰妭鐐规寚閽�); + +``` +A *a2 = new A; +a2->setParent(this); //this浣滀负a2鐨勭埗鑺傜偣鎸囬拡 +``` + +**鏂板C++绫诲浣曟坊鍔犲埌瀵硅薄鏍戯細** + +鏂版坊C++绫伙紝棣栧厛**缁ф壙QPushButton**杩欎釜鏈夊彲瑙嗗寲鐣岄潰鐨勭埗绫� + +鐒跺悗鍦ㄦ瀯閫犲嚱鏁扮殑瀹氫箟涓�**娣诲姞 QWidget绫荤殑鎸囬拡** + +```cpp +#ifndef MYBUTTON_H +#define MYBUTTON_H +#include <QPushButton> + +class MyButton : public QPushButton +{ +public: + MyButton(QWidget *p = 0); + ~MyButton(); +}; + +#endif // MYBUTTON_H + +``` + +鎺ョ潃鍘籧pp婧愭枃浠朵腑浣跨敤濮旀墭鏋勯�犲湪绫荤殑鏋勯�犲嚱鏁扮殑鍒濆鍖栧垪琛ㄤ腑瀹屾垚鍒濆鍖� + +```cpp +#include "mybutton.h" +#include <QDebug> +MyButton::MyButton(QWidget *p) + :QPushButton(p)//濮旀墭鏋勯�狅紝QWidget鐖剁被鏄湁鐣岄潰鐨勫熀绫� +{ + +} + +MyButton::~MyButton() +{ + qDebug()<<"delete MyButton"; +} + +``` + +濡傛涓�鏉ワ紝鏂扮殑C++绫籑yButton灏卞彲浠ラ�氳繃涓诲嚱鏁皀ew鍑烘潵锛屾坊鍔犲埌瀵硅薄鏍戜腑杩涜缁熶竴绠$悊浜嗭細 + +``` + + + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +22銆� + +### 1. `auto` 鍏抽敭瀛� +`auto` 鍏抽敭瀛楃敤浜庤嚜鍔ㄦ帹瀵煎彉閲忕殑绫诲瀷锛屽湪缂栬瘧鏃舵牴鎹垵濮嬪寲琛ㄨ揪寮忚嚜鍔ㄧ‘瀹氬彉閲忕殑绫诲瀷锛屼粠鑰岀畝鍖栦唬鐮佺紪鍐欙紝灏ゅ叾閫傜敤浜庣被鍨嬪悕杈冮暱鎴栧鏉傜殑鎯呭喌銆� + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> +#include <vector> + +int main() { + // 鑷姩鎺ㄥ涓� int 绫诲瀷 + auto num = 10; + // 鑷姩鎺ㄥ涓� std::vector<int>::iterator 绫诲瀷 + std::vector<int> vec = {1, 2, 3}; + auto it = vec.begin(); + + std::cout << "num: " << num << std::endl; + for (; it != vec.end(); ++it) { + std::cout << *it << " "; + } + std::cout << std::endl; + + return 0; +} +``` + +### 2. `nullptr` 鍏抽敭瀛� +`nullptr` 鏄� C++11 寮曞叆鐨勪竴涓柊鐨勭┖鎸囬拡瀛楅潰閲忥紝鐢ㄤ簬琛ㄧず绌烘寚閽堛�傚畠鍙互闅愬紡杞崲涓轰换浣曟寚閽堢被鍨嬶紝瑙e喅浜� `NULL` 鍦ㄦ煇浜涙儏鍐典笅鐨勪簩涔夋�ч棶棰樸�� + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> + +void func(int* ptr) { + if (ptr == nullptr) { + std::cout << "浼犲叆鐨勬槸涓�涓┖鎸囬拡" << std::endl; + } else { + std::cout << "浼犲叆鐨勪笉鏄┖鎸囬拡" << std::endl; + } +} + +int main() { + int* ptr = nullptr; + func(ptr); + + return 0; +} +``` + + +### 3. `tuple` 鍏冪粍 +`std::tuple` 鏄竴涓浐瀹氬ぇ灏忕殑銆佸彲浠ュ瓨鍌ㄤ笉鍚岀被鍨嬪厓绱犵殑瀹瑰櫒銆傚畠鍙互灏嗗涓笉鍚岀被鍨嬬殑鍊肩粍鍚堟垚涓�涓璞★紝鏂逛究鏁版嵁鐨勪紶閫掑拰澶勭悊銆� + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> +#include <tuple> + +int main() { + // 鍒涘缓涓�涓寘鍚� int銆乨ouble 鍜� std::string 绫诲瀷鍏冪礌鐨勫厓缁� + auto myTuple = std::make_tuple(10, 3.14, "Hello"); + + // 鑾峰彇鍏冪粍涓殑鍏冪礌 + int num = std::get<0>(myTuple); + double d = std::get<1>(myTuple); + std::string str = std::get<2>(myTuple); + + std::cout << "num: " << num << ", d: " << d << ", str: " << str << std::endl; + + return 0; +} +``` + + +### 4. 鑼冨洿 `for` 寰幆 +鑼冨洿 `for` 寰幆鎻愪緵浜嗕竴绉嶆洿绠�娲佺殑鏂瑰紡鏉ラ亶鍘嗗鍣ㄦ垨鏁扮粍涓殑鍏冪礌锛屾棤闇�鎵嬪姩绠$悊杩唬鍣ㄦ垨绱㈠紩銆� + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> +#include <vector> + +int main() { + std::vector<int> vec = {1, 2, 3, 4, 5}; + + // 鑼冨洿 for 寰幆閬嶅巻 vector + for (auto element : vec) { + std::cout << element << " "; + } + std::cout << std::endl; + + return 0; +} +``` + + +### 5. 鍖垮悕鍑芥暟 `lambda` +`lambda` 琛ㄨ揪寮忔槸涓�绉嶅尶鍚嶅嚱鏁帮紝鍏佽鍦ㄩ渶瑕佸嚱鏁板璞$殑鍦版柟鐩存帴瀹氫箟涓�涓畝鐭殑鍑芥暟锛屾棤闇�鏄惧紡瀹氫箟涓�涓懡鍚嶇殑鍑芥暟鎴栧嚱鏁板璞$被銆� + +#### 绀轰緥浠g爜 +```cpp +#include <iostream> +#include <vector> +#include <algorithm> + +int main() { + std::vector<int> vec = {1, 2, 3, 4, 5}; + + // 浣跨敤 lambda 琛ㄨ揪寮忓 vector 涓殑姣忎釜鍏冪礌杩涜骞虫柟鎿嶄綔 + std::for_each(vec.begin(), vec.end(), [](int& num) { + num = num * num; + }); + + // 杈撳嚭澶勭悊鍚庣殑 vector + for (auto element : vec) { + std::cout << element << " "; + } + std::cout << std::endl; + + return 0; +} +``` +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +23銆� + +### G++ 缂栬瘧鍣ㄧ殑浣跨敤 + +#### `-o` 鍜� `-c` 閫夐」鐨勫尯鍒� +- **`-c` 閫夐」**锛氬彧杩涜缂栬瘧鍜屾眹缂栨搷浣滐紝涓嶈繘琛岄摼鎺ャ�傚畠浼氬皢姣忎釜婧愭枃浠讹紙`.cpp` 鏂囦欢锛夊垎鍒紪璇戞垚瀵瑰簲鐨勭洰鏍囨枃浠讹紙`.o` 鏂囦欢锛夛紝浣嗕笉浼氱敓鎴愬彲鎵ц鏂囦欢銆備緥濡傦細 +```bash +g++ -c main.cpp utils.cpp +``` +涓婅堪鍛戒护浼氱敓鎴� `main.o` 鍜� `utils.o` 涓や釜鐩爣鏂囦欢銆� +- **`-o` 閫夐」**锛氱敤浜庢寚瀹氳緭鍑烘枃浠剁殑鍚嶇О銆傚彲浠ョ敤浜庣敓鎴愬彲鎵ц鏂囦欢锛屼篃鍙互鐢ㄤ簬鐢熸垚鐩爣鏂囦欢銆備緥濡傦細 +```bash +g++ main.cpp utils.cpp -o my_program +``` +姝ゅ懡浠や細灏� `main.cpp` 鍜� `utils.cpp` 缂栬瘧銆侀摼鎺ユ垚涓�涓悕涓� `my_program` 鐨勫彲鎵ц鏂囦欢銆� + +#### `-g` 閫夐」鐨勭洰鐨� +`-g` 閫夐」鐢ㄤ簬鍦ㄧ紪璇戞椂鐢熸垚璋冭瘯淇℃伅锛岃繖浜涗俊鎭細琚祵鍏ュ埌鐢熸垚鐨勭洰鏍囨枃浠舵垨鍙墽琛屾枃浠朵腑銆傝皟璇曚俊鎭寘鍚簡婧愪唬鐮佺殑琛屽彿銆佸彉閲忓悕銆佸嚱鏁板悕绛夛紝浣垮緱璋冭瘯鍣紙濡� GDB锛夎兘澶熷皢鍙墽琛屾枃浠朵腑鐨勬寚浠や笌婧愪唬鐮佷腑鐨勮瀵瑰簲璧锋潵锛屾柟渚胯繘琛岃皟璇曘�傜ず渚嬪懡浠ゅ涓嬶細 +```bash +g++ -g main.cpp -o my_program +``` + +### GDB 璋冭瘯鍣ㄧ殑浣跨敤 + +#### 閫愯鍙ワ紙Step锛夊拰閫愯繃绋嬶紙Next锛夋墽琛� +- **閫愯鍙ユ墽琛岋紙Step锛�**锛氫娇鐢� `step` 鎴� `s` 鍛戒护锛屽畠浼氳繘鍏ュ嚱鏁板唴閮紝閫愯鎵ц浠g爜锛屽寘鎷嚱鏁拌皟鐢ㄨ鍙ヤ篃浼氳繘鍏ュ嚱鏁颁綋鍐呴儴鎵ц銆備緥濡傦紝鍦� GDB 涓惎鍔ㄨ皟璇曞悗锛� +```plaintext +(gdb) s +``` +- **閫愯繃绋嬫墽琛岋紙Next锛�**锛氫娇鐢� `next` 鎴� `n` 鍛戒护锛屽畠浼氭墽琛屼竴琛屼唬鐮侊紝浣嗕笉浼氳繘鍏ュ嚱鏁板唴閮紝鑰屾槸灏嗗嚱鏁拌皟鐢ㄥ綋浣滀竴鏉¤鍙ユ墽琛屽畬姣曘�備緥濡傦細 +```plaintext +(gdb) n +``` + +#### 缁欏嚱鏁拌缃柇鐐� +浣跨敤 `break` 鎴� `b` 鍛戒护锛屽悗闈㈣窡涓婂嚱鏁板悕鍗冲彲鍦ㄨ鍑芥暟鐨勫叆鍙e璁剧疆鏂偣銆備緥濡傦紝瑕佸湪 `main` 鍑芥暟澶勮缃柇鐐癸細 +```plaintext +(gdb) b main +``` + +#### 缁欐渶鍚庝竴琛岃缃柇鐐� +棣栧厛闇�瑕佺煡閬撴簮鏂囦欢鐨勫悕绉板拰鎬昏鏁般�傚彲浠ヤ娇鐢� `break` 鍛戒护锛屽悗闈㈣窡涓婃簮鏂囦欢鍚嶅拰琛屽彿銆傚亣璁炬簮鏂囦欢鍚嶄负 `main.cpp`锛屽彲浠ラ�氳繃浠ヤ笅鍛戒护鏌ョ湅鎬昏鏁帮細 +```bash +wc -l main.cpp +``` +鍋囪鎬昏鏁颁负 100锛岄偅涔堝湪鏈�鍚庝竴琛岃缃柇鐐圭殑鍛戒护涓猴細 +```plaintext +(gdb) b main.cpp:100 +``` + +#### 鏌ョ湅鎵�鏈夋柇鐐� +浣跨敤 `info breakpoints` 鎴� `info b` 鍛戒护鍙互鏌ョ湅褰撳墠璁剧疆鐨勬墍鏈夋柇鐐逛俊鎭紝鍖呮嫭鏂偣缂栧彿銆佷綅缃�佹槸鍚﹀惎鐢ㄧ瓑銆備緥濡傦細 +```plaintext +(gdb) info b +``` + +### Makefile 鐨勭紪鍐欎笌鎵ц + +#### 鎵ц涓�涓� Makefile +鍦ㄥ寘鍚� Makefile 鐨勭洰褰曚笅锛岀洿鎺ュ湪缁堢杈撳叆 `make` 鍛戒护鍗冲彲鎵ц Makefile 涓殑瑙勫垯銆傚鏋� Makefile 鐨勬枃浠跺悕涓嶆槸榛樿鐨� `Makefile` 鎴� `makefile`锛屽彲浠ヤ娇鐢� `-f` 閫夐」鎸囧畾 Makefile 鐨勬枃浠跺悕銆備緥濡傦細 +```bash +make -f my_makefile +``` + +#### 缂栧啓涓�涓� Makefile +涓�涓畝鍗曠殑 Makefile 閫氬父鍖呭惈鐩爣锛坱arget锛夈�佷緷璧栵紙dependency锛夊拰鍛戒护锛坈ommand锛変笁閮ㄥ垎銆備互涓嬫槸涓�涓畝鍗曠殑绀轰緥锛岀敤浜庣紪璇戜竴涓寘鍚� `main.cpp` 鍜� `utils.cpp` 鐨� C++ 椤圭洰锛� +```makefile +# 缂栬瘧鍣ㄥ拰缂栬瘧閫夐」 +CXX = g++ +CXXFLAGS = -Wall -g + +# 鐩爣鏂囦欢鍒楄〃 +OBJS = main.o utils.o + +# 鏈�缁堝彲鎵ц鏂囦欢 +TARGET = my_program + +# 鐢熸垚鍙墽琛屾枃浠剁殑瑙勫垯 +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) + +# 鐢熸垚 main.o 鐨勮鍒� +main.o: main.cpp utils.h + $(CXX) $(CXXFLAGS) -c main.cpp + +# 鐢熸垚 utils.o 鐨勮鍒� +utils.o: utils.cpp utils.h + $(CXX) $(CXXFLAGS) -c utils.cpp + +# 娓呯悊瑙勫垯 +clean: + rm -f $(OBJS) $(TARGET) +``` +涓婅堪 Makefile 鐨勮В閲婂涓嬶細 +- `CXX`锛氭寚瀹氱紪璇戝櫒涓� `g++`銆� +- `CXXFLAGS`锛氭寚瀹氱紪璇戦�夐」锛宍-Wall` 琛ㄧず鏄剧ず鎵�鏈夎鍛婁俊鎭紝`-g` 琛ㄧず鐢熸垚璋冭瘯淇℃伅銆� +- `OBJS`锛氬垪鍑烘墍鏈夌殑鐩爣鏂囦欢銆� +- `TARGET`锛氭寚瀹氭渶缁堢敓鎴愮殑鍙墽琛屾枃浠剁殑鍚嶇О銆� +- `$(TARGET): $(OBJS)`锛氬畾涔夌敓鎴愬彲鎵ц鏂囦欢鐨勮鍒欙紝渚濊禆浜庢墍鏈夌殑鐩爣鏂囦欢銆� +- `main.o: main.cpp utils.h` 鍜� `utils.o: utils.cpp utils.h`锛氬垎鍒畾涔夌敓鎴� `main.o` 鍜� `utils.o` 鐨勮鍒欙紝渚濊禆浜庡搴旂殑婧愭枃浠跺拰澶存枃浠躲�� +- `clean`锛氬畾涔夋竻鐞嗚鍒欙紝鐢ㄤ簬鍒犻櫎鐢熸垚鐨勭洰鏍囨枃浠跺拰鍙墽琛屾枃浠躲�� +24銆� + +### 杩炴帴骞舵搷浣� MySQL 鏁版嵁搴� + +#### 1. 浣跨敤 MySQL API +MySQL API 鏄� MySQL 瀹樻柟鎻愪緵鐨� C/C++ 鎺ュ彛锛岃兘璁╀綘鐩存帴涓� MySQL 鏁版嵁搴撹繘琛屼氦浜掋�� + +**绀轰緥浠g爜** +```cpp +#include <iostream> +#include <mysql/mysql.h> + +int main() { + // 鍒濆鍖� MySQL 杩炴帴 + MYSQL *conn = mysql_init(nullptr); + if (conn == nullptr) { + std::cerr << "鍒濆鍖� MySQL 杩炴帴澶辫触: " << mysql_error(conn) << std::endl; + return 1; + } + + // 杩炴帴鍒� MySQL 鏁版嵁搴� + if (mysql_real_connect(conn, "localhost", "user", "password", "database_name", 0, nullptr, 0) == nullptr) { + std::cerr << "杩炴帴鍒� MySQL 鏁版嵁搴撳け璐�: " << mysql_error(conn) << std::endl; + mysql_close(conn); + return 1; + } + + // 澧炲垹鏀规煡鎿嶄綔绀轰緥 + + // 鎻掑叆鏁版嵁 + std::string insertQuery = "INSERT INTO users (name, age) VALUES ('John', 25)"; + if (mysql_query(conn, insertQuery.c_str()) != 0) { + std::cerr << "鎻掑叆鏁版嵁澶辫触: " << mysql_error(conn) << std::endl; + } + + // 鏌ヨ鏁版嵁 + std::string selectQuery = "SELECT * FROM users"; + if (mysql_query(conn, selectQuery.c_str()) == 0) { + MYSQL_RES *result = mysql_store_result(conn); + if (result != nullptr) { + MYSQL_ROW row; + while ((row = mysql_fetch_row(result))) { + for (int i = 0; i < mysql_num_fields(result); ++i) { + std::cout << (row[i] ? row[i] : "NULL") << " "; + } + std::cout << std::endl; + } + mysql_free_result(result); + } + } else { + std::cerr << "鏌ヨ鏁版嵁澶辫触: " << mysql_error(conn) << std::endl; + } + + // 鏇存柊鏁版嵁 + std::string updateQuery = "UPDATE users SET age = 26 WHERE name = 'John'"; + if (mysql_query(conn, updateQuery.c_str()) != 0) { + std::cerr << "鏇存柊鏁版嵁澶辫触: " << mysql_error(conn) << std::endl; + } + + // 鍒犻櫎鏁版嵁 + std::string deleteQuery = "DELETE FROM users WHERE name = 'John'"; + if (mysql_query(conn, deleteQuery.c_str()) != 0) { + std::cerr << "鍒犻櫎鏁版嵁澶辫触: " << mysql_error(conn) << std::endl; + } + + // 璋冪敤瀛樺偍杩囩▼ + std::string callProcedureQuery = "CALL your_stored_procedure()"; + if (mysql_query(conn, callProcedureQuery.c_str()) != 0) { + std::cerr << "璋冪敤瀛樺偍杩囩▼澶辫触: " << mysql_error(conn) << std::endl; + } + + // 鍏抽棴 MySQL 杩炴帴 + mysql_close(conn); + return 0; +} +``` +**浠g爜瑙i噴** +- `mysql_init`锛氬垵濮嬪寲 MySQL 杩炴帴銆� +- `mysql_real_connect`锛氳繛鎺ュ埌鎸囧畾鐨� MySQL 鏁版嵁搴撱�� +- `mysql_query`锛氭墽琛� SQL 璇彞銆� +- `mysql_store_result`锛氳幏鍙栨煡璇㈢粨鏋滈泦銆� +- `mysql_fetch_row`锛氶�愯鑾峰彇缁撴灉闆嗕腑鐨勬暟鎹�� +- `mysql_free_result`锛氶噴鏀剧粨鏋滈泦鍗犵敤鐨勫唴瀛樸�� +- `mysql_close`锛氬叧闂� MySQL 杩炴帴銆� + +#### 2. 浣跨敤 ADO锛圓ctiveX Data Objects锛� +ADO 鏄井杞彁渚涚殑涓�绉嶆暟鎹闂妧鏈紝鍙敤浜庤繛鎺ュ绉嶆暟鎹簱锛屽寘鎷� MySQL銆備笉杩囧湪 Linux 鐜涓嬩娇鐢� ADO 涓嶅お鏂逛究锛屼竴鑸湪 Windows 鐜涓粨鍚� Visual Studio 寮�鍙戙�備互涓嬫槸涓�涓畝鍗曠ず渚嬶細 +```cpp +#include <iostream> +#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile") + +int main() { + CoInitialize(nullptr); + _ConnectionPtr conn(__uuidof(Connection)); + _RecordsetPtr rs(__uuidof(Recordset)); + + try { + // 杩炴帴鍒� MySQL 鏁版嵁搴� + conn->Open("Provider=MSDASQL;Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Database=database_name;User=user;Password=password;", "", "", adConnectUnspecified); + + // 鎻掑叆鏁版嵁 + conn->Execute("INSERT INTO users (name, age) VALUES ('John', 25)", nullptr, adCmdText); + + // 鏌ヨ鏁版嵁 + rs = conn->Execute("SELECT * FROM users", nullptr, adCmdText); + while (!rs->EndOfFile) { + std::cout << (const char*)_bstr_t(rs->Fields->GetItem("name")->Value) << " " + << (long)rs->Fields->GetItem("age")->Value << std::endl; + rs->MoveNext(); + } + + // 鏇存柊鏁版嵁 + conn->Execute("UPDATE users SET age = 26 WHERE name = 'John'", nullptr, adCmdText); + + // 鍒犻櫎鏁版嵁 + conn->Execute("DELETE FROM users WHERE name = 'John'", nullptr, adCmdText); + + // 璋冪敤瀛樺偍杩囩▼ + conn->Execute("EXEC your_stored_procedure", nullptr, adCmdText); + + // 鍏抽棴杩炴帴 + rs->Close(); + conn->Close(); + } catch (_com_error& e) { + std::cerr << "閿欒淇℃伅: " << (const char*)e.Description() << std::endl; + } + + CoUninitialize(); + return 0; +} +``` +**浠g爜瑙i噴** +- `CoInitialize`锛氬垵濮嬪寲 COM 搴撱�� +- `_ConnectionPtr` 鍜� `_RecordsetPtr`锛氱敤浜庡垱寤鸿繛鎺ュ璞″拰璁板綍闆嗗璞°�� +- `conn->Open`锛氭墦寮�鏁版嵁搴撹繛鎺ャ�� +- `conn->Execute`锛氭墽琛� SQL 璇彞銆� +- `CoUninitialize`锛氶噴鏀� COM 搴撹祫婧愩�� + +### 杩炴帴骞舵搷浣� Oracle 鏁版嵁搴� + +#### 1. 浣跨敤 OCI锛圤racle Call Interface锛� +OCI 鏄� Oracle 鎻愪緵鐨勫簳灞� C/C++ 鎺ュ彛锛岀敤浜庝笌 Oracle 鏁版嵁搴撹繘琛屼氦浜掋�� + +**绀轰緥浠g爜** +```cpp +#include <iostream> +#include <oci.h> + +int main() { + OCIEnv *envhp; + OCIError *errhp; + OCISvcCtx *svchp; + OCIStmt *stmthp; + OCIDefine *defnp; + OCIBind *bndp; + sword status; + + // 鍒濆鍖� OCI 鐜 + status = OCIEnvCreate(&envhp, OCI_DEFAULT, nullptr, nullptr, nullptr, nullptr, 0, nullptr); + if (status != OCI_SUCCESS) { + std::cerr << "鍒濆鍖� OCI 鐜澶辫触" << std::endl; + return 1; + } + + // 鍒涘缓閿欒鍙ユ焺 + status = OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, nullptr); + if (status != OCI_SUCCESS) { + std::cerr << "鍒涘缓閿欒鍙ユ焺澶辫触" << std::endl; + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + + // 杩炴帴鍒� Oracle 鏁版嵁搴� + status = OCILogon(envhp, errhp, &svchp, (text *)"user/password@database", strlen("user/password@database")); + if (status != OCI_SUCCESS) { + std::cerr << "杩炴帴鍒� Oracle 鏁版嵁搴撳け璐�" << std::endl; + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + + // 鎻掑叆鏁版嵁 + status = OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, nullptr); + if (status != OCI_SUCCESS) { + std::cerr << "鍒涘缓璇彞鍙ユ焺澶辫触" << std::endl; + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + status = OCIStmtPrepare(stmthp, errhp, (text *)"INSERT INTO users (name, age) VALUES (:1, :2)", strlen("INSERT INTO users (name, age) VALUES (:1, :2)"), OCI_NTV_SYNTAX, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "鍑嗗鎻掑叆璇彞澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + // 缁戝畾鍙傛暟 + char name[] = "John"; + int age = 25; + status = OCIBindByName(stmthp, &bndp, errhp, (text *)":1", -1, name, sizeof(name), SQLT_STR, nullptr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "缁戝畾鍙傛暟 1 澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + status = OCIBindByName(stmthp, &bndp, errhp, (text *)":2", -1, &age, sizeof(age), SQLT_INT, nullptr, nullptr, nullptr, 0, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "缁戝畾鍙傛暟 2 澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + status = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, nullptr, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "鎵ц鎻掑叆璇彞澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + + // 鏌ヨ鏁版嵁 + status = OCIStmtPrepare(stmthp, errhp, (text *)"SELECT * FROM users", strlen("SELECT * FROM users"), OCI_NTV_SYNTAX, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "鍑嗗鏌ヨ璇彞澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + status = OCIStmtExecute(svchp, stmthp, errhp, 0, 0, nullptr, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "鎵ц鏌ヨ璇彞澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + // 瀹氫箟鍒� + char resultName[50]; + int resultAge; + status = OCIDefineByPos(stmthp, &defnp, errhp, 1, resultName, sizeof(resultName), SQLT_STR, nullptr, nullptr, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "瀹氫箟鍒� 1 澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + status = OCIDefineByPos(stmthp, &defnp, errhp, 2, &resultAge, sizeof(resultAge), SQLT_INT, nullptr, nullptr, nullptr, OCI_DEFAULT); + if (status != OCI_SUCCESS) { + std::cerr << "瀹氫箟鍒� 2 澶辫触" << std::endl; + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + return 1; + } + while ((status = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT)) == OCI_SUCCESS) { + std::cout << resultName << " " << resultAge << std::endl; + } + + // 鏇存柊鏁版嵁銆佸垹闄ゆ暟鎹拰璋冪敤瀛樺偍杩囩▼鐨勬搷浣滀笌鎻掑叆銆佹煡璇㈢被浼硷紝杩欓噷鐪佺暐 + + // 閲婃斁璧勬簮 + OCIHandleFree(stmthp, OCI_HTYPE_STMT); + OCILogoff(svchp, errhp); + OCIHandleFree(errhp, OCI_HTYPE_ERROR); + OCIHandleFree(envhp, OCI_HTYPE_ENV); + + return 0; +} +``` +**浠g爜瑙i噴** +- `OCIEnvCreate`锛氬垵濮嬪寲 OCI 鐜銆� +- `OCIHandleAlloc`锛氬垎閰嶅悇绉� OCI 鍙ユ焺銆� +- `OCILogon`锛氳繛鎺ュ埌 Oracle 鏁版嵁搴撱�� +- `OCIStmtPrepare`锛氬噯澶� SQL 璇彞銆� +- `OCIBindByName`锛氱粦瀹� SQL 璇彞涓殑鍙傛暟銆� +- `OCIStmtExecute`锛氭墽琛� SQL 璇彞銆� +- `OCIDefineByPos`锛氬畾涔夋煡璇㈢粨鏋滈泦涓殑鍒椼�� +- `OCIStmtFetch2`锛氳幏鍙栨煡璇㈢粨鏋滈泦涓殑鏁版嵁銆� +- `OCILogoff`锛氭柇寮�涓� Oracle 鏁版嵁搴撶殑杩炴帴銆� +- `OCIHandleFree`锛氶噴鏀� OCI 鍙ユ焺鍗犵敤鐨勮祫婧愩�� + +#### 2. 浣跨敤 ADO 杩炴帴 Oracle +鍜岃繛鎺� MySQL 绫讳技锛屽湪 Windows 鐜涓嬪彲浠ヤ娇鐢� ADO 杩炴帴 Oracle 鏁版嵁搴擄紝绀轰緥浠g爜濡備笅锛� +```cpp +#include <iostream> +#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile") + +int main() { + CoInitialize(nullptr); + _ConnectionPtr conn(__uuidof(Connection)); + _RecordsetPtr rs(__uuidof(Recordset)); + + try { + // 杩炴帴鍒� Oracle 鏁版嵁搴� + conn->Open("Provider=OraOLEDB.Oracle;Data Source=database_name;User ID=user;Password=password;", "", "", adConnectUnspecified); + + // 鎻掑叆鏁版嵁 + conn->Execute("INSERT INTO users (name, age) VALUES ('John', 25)", nullptr, adCmdText); + + // 鏌ヨ鏁版嵁 + rs = conn->Execute("SELECT * FROM users", nullptr, adCmdText); + while (!rs->EndOfFile) { + std::cout << (const char*)_bstr_t(rs->Fields->GetItem("name")->Value) << " " + << (long)rs->Fields->GetItem("age")->Value << std::endl; + rs->MoveNext(); + } + + // 鏇存柊鏁版嵁 + conn->Execute("UPDATE users SET age = 26 WHERE name = 'John'", nullptr, adCmdText); + + // 鍒犻櫎鏁版嵁 + conn->Execute("DELETE FROM users WHERE name = 'John'", nullptr, adCmdText); + + // 璋冪敤瀛樺偍杩囩▼ + conn->Execute("EXEC your_stored_procedure", nullptr, adCmdText); + + // 鍏抽棴杩炴帴 + rs->Close(); + conn->Close(); + } catch (_com_error& e) { + std::cerr << "閿欒淇℃伅: " << (const char*)e.Description() << std::endl; + } + + CoUninitialize(); + return 0; +} +``` +**浠g爜瑙i噴**鍜屼娇鐢� ADO 杩炴帴 MySQL 绫讳技锛屼富瑕佸尯鍒湪浜庤繛鎺ュ瓧绗︿覆鐨勪笉鍚屻�� + + + + + + + + + + + + + \ No newline at end of file diff --git "a/Group_\347\216\213\345\260\217\345\210\232/Client/\347\216\213\345\260\217\345\210\232/document/C++\347\237\245\350\257\206\347\202\271\350\256\241\345\210\222\350\241\250.xlsx" "b/Group_\347\216\213\345\260\217\345\210\232/Client/\347\216\213\345\260\217\345\210\232/document/C++\347\237\245\350\257\206\347\202\271\350\256\241\345\210\222\350\241\250.xlsx" new file mode 100644 index 0000000..8de63b2 --- /dev/null +++ "b/Group_\347\216\213\345\260\217\345\210\232/Client/\347\216\213\345\260\217\345\210\232/document/C++\347\237\245\350\257\206\347\202\271\350\256\241\345\210\222\350\241\250.xlsx" Binary files differ diff --git "a/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYC\347\254\224\350\256\260.doc" "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYC\347\254\224\350\256\260.doc" new file mode 100644 index 0000000..a4138b5 --- /dev/null +++ "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYC\347\254\224\350\256\260.doc" Binary files differ diff --git "a/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYc++.doc" "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYc++.doc" new file mode 100644 index 0000000..8a5956f --- /dev/null +++ "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFYc++.doc" Binary files differ diff --git "a/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFY\345\265\214\345\205\245\345\274\217.doc" "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFY\345\265\214\345\205\245\345\274\217.doc" new file mode 100644 index 0000000..340a34e --- /dev/null +++ "b/Group_\351\251\254\345\273\272\345\274\272/Client/\345\210\230\344\270\260\346\257\205/document/LFY\345\265\214\345\205\245\345\274\217.doc" Binary files differ diff --git "a/PCB_\351\241\271\347\233\256\346\200\273\347\273\223.txt" "b/PCB_\351\241\271\347\233\256\346\200\273\347\273\223.txt" new file mode 100644 index 0000000..8886cec --- /dev/null +++ "b/PCB_\351\241\271\347\233\256\346\200\273\347\273\223.txt" @@ -0,0 +1,110 @@ + + ============================================ + 椤圭洰鎬荤粨锛� + 1銆佹湇鍔$ + 缃戠粶閫氫俊锛� + tcp鍗忚锛岄暱杩炴帴 + 绮樺寘闂锛歵cp鍗忚鏈韩娌℃湁鎶ユ枃闀垮害鐨勫瓧娈� + 瑙e喅鐨勮瘽鏄湪搴旂敤灞傚姞涓�涓嚜瀹氫箟鐨勬暟鎹ご锛屽湪鏁版嵁澶撮噷闈㈠鍔犱竴涓皝鍖呴暱搴﹀瓧娈碉紝鎸夊皝鍖呴暱搴︽潵杩涜鏀跺寘瑙e寘鍗冲彲 + 銆愪篃鍙互鍔犱竴浜涚壒娈婄殑鏍囧織浣嶆潵鍒嗛殧--鏍囧織浣嶇殑椋庨櫓鏄唴瀹瑰彲鑳戒細鍖呭惈鏍囧織浣嶏紝瀵艰嚧瑙e寘鍑洪棶棰樸�� + + 閽堝闀胯繛鎺ョ殑鍗婂紑闂繛鎺ワ紝浣跨敤蹇冭烦妫�娴嬫潵鍘婚櫎鏃犵敤鐨勯暱杩炴帴锛屽苟涓旇繘琛屽鎴风鐨勬柇绾块噸杩炵殑淇濇椿 + + + 鎬ц兘浼樺寲锛氱敱澶氱嚎绋嬪崌绾т负绾跨▼姹� + 绾跨▼姹狅細涓嶄細瀵圭嚎绋嬮绻佺殑鍒涘缓鍜岄攢姣� + 鍙槸鎺у埗绾跨▼鐨勪娇鐢紝閰嶅悎浠诲姟闃熷垪瀹屾垚鎿嶄綔锛� + 鎿嶄綔杩囩▼锛� + 鏈変釜鎬荤殑璋冨害锛岃礋璐e垽鏂换鍔¢槦鍒椾腑鏈夋病鏈変换鍔′互鍙婄嚎绋嬮槦鍒椾腑杩樻湁娌℃湁绌洪棽绾跨▼ + + 濡傛灉鏈変换鍔℃潵骞朵笖鏈夌┖闂茬嚎绋嬶紝灏变細灏嗕换鍔″垎鍙戠粰绌洪棽绾跨▼鏉ユ墽琛� + + 缁嗚妭锛� + 浠诲姟闃熷垪锛� + 婊$殑璇濓紝灏辨槸杈惧埌浜嗕换鍔¤兘鎺掔殑鏈�澶у�� + 灏遍渶瑕佹姏涓�涓弧鐨勫紓甯告垨鑰呬娇鐢ㄦ潯浠跺彉閲忔潵绛夊緟鏀惧叆闃熷垪涓紱 + + 绾跨▼闃熷垪锛� + 绾跨▼鏁版渶灏忓�笺�佹渶澶у�肩殑璁惧畾 + 鏈�灏忓�硷細淇濊瘉甯歌鐨勬搷浣� + 鏈�澶у�硷細鍙兘鏈�澶х殑鏋侀檺锛屽湪鍏佽鐨勮寖鍥村唴璁惧畾涓�涓悎鐞嗗�� + 銆愪竴鑸粠鏈�灏忓埌鏈�澶т箣闂达紝鍙互鐢卞苟鍙戦噺鐨勫鍔犳潵瀵瑰簲寮�杈熸洿澶氭暟閲忕殑绾跨▼锛屽噺灏戜篃鏄竴鏍风殑閬撶悊銆� + 鐢ㄤ簡绾跨▼姹犱箣鍚庯紝涓氬姟鐨勬搷浣滅敱鍚屾鐨勬柟寮忓垏鎹㈠埌浜嗗紓姝ョ殑鏂瑰紡锛屾�ц兘涔熻兘寰楀埌杩涗竴姝ユ彁鍗囥�� + + 閫氫俊妯″瀷锛� + select妯″瀷锛歔杞--鎸夋椂闂撮棿闅旀瘡娆′粠澶村埌灏鹃亶鍘哴 + 鍩轰簬鏁扮粍瀛樻斁濂楁帴瀛楃殑杞妯″瀷 + 鏁扮粍闀垮害鏈夐粯璁ゅぇ灏忥細windows-64锛宭inux-1024 + 澶у皬鍙互淇敼 + 閲忕骇锛�1000涓乏鍙砙鍗冪骇] + + poll妯″瀷锛� + 鍩轰簬閾捐〃瀛樻斁濂楁帴瀛楃殑杞妯″瀷 + 閾捐〃鏃犻暱搴﹂檺鍒� + 閲忕骇锛�10000涓乏鍙砙涓囩骇] + + epoll妯″瀷锛� + 鍩轰簬浜嬩欢瑙﹀彂鐨勪竴涓猵oll妯″瀷锛屾晥鐜囨洿楂� + 浣跨敤鍥炶皟鐨勬柟寮忓鐞� + 閲忕骇锛�1000000涓乏鍙砙鐧句竾绾 + + 鏁版嵁搴撳皝瑁咃細MySQL鏁版嵁搴撶殑杩炴帴鏁伴噺榛樿鏈�澶у��100涓� + 鍗曚緥妯″紡--澶氬鍦版柟鍏辩敤鍚屼竴涓璞� + 浼樼偣锛氱渷鍐呭瓨 + 缂虹偣锛氭晥鐜囦笉澶熼珮 + + 鎻愬崌鎬ц兘锛氳繛鎺ユ睜[绫讳技绾跨▼姹犵殑鎿嶄綔] + 杩炴帴姹犵殑鏍稿績鏄湁涓�瀹氭暟閲忕殑鏁版嵁搴撹繛鎺� + 鏈変换鍔℃潵浜嗭紝鍙互缁欎竴涓┖闂茶繛鎺ワ紝鏉ユ墽琛屼换鍔� + + 鏃ュ織灏佽锛� + 鍗曚緥妯″紡 + 鏂囦欢婊氬姩--鏀瑰悕绠楁硶--鐢↖D鎴栬�呮椂闂存埑鐨勬柟寮忔敼鍚� + + + + + + + 2銆佸鎴风 + 鏈夌晫闈紝鏈�瀹规槗纰板埌鐨勯棶棰樻槸鐣岄潰鍗¢】鐨勯棶棰� + 瑙e喅锛氬皢鑰楁椂涓氬姟鏀惧埌瀛愮嚎绋嬩腑鍘绘墽琛岋紝杩欐牱灏变笉浼氶樆濉炰富绾跨▼閲岄潰鐨勭晫闈㈠搷搴旀搷浣滐紝浠庤�岃В鍐冲崱椤块棶棰� + + 鏂囦欢浼犺緭锛氭柇鐐圭画浼� + 涓�鑸鍦ㄦ湇鍔$涓撻棬寮勪釜琛ㄦ潵璁板綍涓�涓嬩紶杈撲俊鎭� + 褰撳彂鐢熶紶杈撲腑鏂箣鍚庯紝灏卞彲浠ラ�氳繃鏌ヨ璁板綍鏉ョ‘瀹氭柇鐐瑰 + 鍐嶅姣旇緝宸蹭紶鍐呭鏂偣涔嬪墠鐨勫嚑涓瓧鑺傚唴瀹规槸鍚﹀拰鍘熷鏂囦欢鐨勪竴鑷达紝涓�鑷村垯寮�濮嬩粠鏂偣澶勯噸浼犮�� + 鑻ヨ褰曟壘涓嶅埌鎴栧凡浼犳枃浠朵涪澶遍兘闇�瑕佷粠澶村紑濮嬩紶杈撱�� + + 瓒呭ぇ鏂囦欢鐨勮鍙栵細鎸夎璇诲彇锛屼笉鑳戒竴涓嬪瓙鍏ㄨ杩涙潵锛屽惁鍒欏唴瀛樹笉澶熺敤 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/PCB\345\267\245\345\216\202\346\231\272\350\203\275\345\210\266\351\200\240_9.19_250104" "b/PCB\345\267\245\345\216\202\346\231\272\350\203\275\345\210\266\351\200\240_9.19_250104" deleted file mode 160000 index 825c76f..0000000 --- "a/PCB\345\267\245\345\216\202\346\231\272\350\203\275\345\210\266\351\200\240_9.19_250104" +++ /dev/null @@ -1 +1 @@ -Subproject commit 825c76fb27ae00a1cecc6815ca554718caaa4464 +Subproject commit 0000000000000000000000000000000000000000 -- Gitblit v1.8.0