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 = &num;//鎸囬拡甯搁噺锛屾寚閽堟湰韬殑鍊间笉鍙�
+5. const int* const ptr = &num;//鎸囧悜甯搁噺鐨勫父閲忔寚閽�,閮戒笉鍙�
+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>
+```
+
+![img](./Image-1730682583556-1.png)
+
+### 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
+
+![img](./Image.png)
+
+### 鍏宠仈鍑芥暟鍘熷瀷锛�
+
+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