[{"data":1,"prerenderedAt":2926},["ShallowReactive",2],{"wiki-page-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":3,"wiki-doc-items-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2504,"language-switcher-data-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2910,"wiki-i18n-paths-\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii":2925},{"id":4,"title":5,"body":6,"canonicalPath":2486,"chapterDepth":31,"chapterOrder":2487,"date":2488,"description":23,"docI18nKey":2489,"docKey":2490,"docRoot":2491,"docTitle":2492,"extension":2493,"i18nKey":2494,"isBlogPost":2495,"isWikiDoc":207,"isWikiIndex":2495,"layout":2496,"legacyPath":2496,"locale":2497,"localeSlug":2498,"meta":2499,"navigation":207,"path":2486,"seo":2500,"sourcePath":2501,"sourceStem":2494,"stem":2502,"wikiDepth":31,"__hash__":2503},"content\u002F_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII.md","RAII",{"type":7,"value":8,"toc":2467},"minimark",[9,13,17,85,99,107,110,113,136,143,147,150,153,168,171,251,255,364,367,372,869,875,883,887,1253,1257,1263,1267,1532,1536,1542,1546,1549,2095,2099,2105,2107,2110,2113,2215,2218,2223,2256,2267,2272,2312,2315,2320,2379,2382,2385,2431,2434,2463],[10,11,12],"h2",{"id":12},"本節解決什麼問題",[14,15,16],"p",{},"在 C 語言中，我們經常看到這種代碼：",[18,19,24],"pre",{"className":20,"code":21,"language":22,"meta":23,"style":23},"language-cpp shiki shiki-themes github-light github-dark","FILE* f = fopen(\"data.txt\", \"r\");\n\u002F\u002F ... 使用文件 ...\nfclose(f);  \u002F\u002F 容易忘记！\n","cpp","",[25,26,27,66,73],"code",{"__ignoreMap":23},[28,29,32,36,40,43,46,50,53,57,60,63],"span",{"class":30,"line":31},"line",1,[28,33,35],{"class":34},"sVt8B","FILE",[28,37,39],{"class":38},"szBVR","*",[28,41,42],{"class":34}," f ",[28,44,45],{"class":38},"=",[28,47,49],{"class":48},"sScJk"," fopen",[28,51,52],{"class":34},"(",[28,54,56],{"class":55},"sZZnC","\"data.txt\"",[28,58,59],{"class":34},", ",[28,61,62],{"class":55},"\"r\"",[28,64,65],{"class":34},");\n",[28,67,69],{"class":30,"line":68},2,[28,70,72],{"class":71},"sJ8bj","\u002F\u002F ... 使用文件 ...\n",[28,74,76,79,82],{"class":30,"line":75},3,[28,77,78],{"class":48},"fclose",[28,80,81],{"class":34},"(f);",[28,83,84],{"class":71},"  \u002F\u002F 容易忘记！\n",[14,86,87,88,90,91,94,95,98],{},"如果中間提前 return，或是拋出了異常，",[25,89,78],{}," 就不會執行，造成資源泄漏。類似的問題也出現在內存（",[25,92,93],{},"malloc\u002Ffree","）、鎖（",[25,96,97],{},"lock\u002Funlock","）、套接字等所有需要\"獲取-釋放\"的資源上。",[14,100,101,102,106],{},"RAII 利用 C++ 對象生命週期確定性，",[103,104,105],"strong",{},"自動管理資源","，讓你不再需要手動釋放。",[10,108,109],{"id":109},"這個特性是什麼",[14,111,112],{},"RAII（Resource Acquisition Is Initialization，資源獲取即初始化）是 C++ 中最重要的資源管理慣用法：",[114,115,116,123,129],"ul",{},[117,118,119,122],"li",{},[103,120,121],{},"構造函數","中獲取資源。",[117,124,125,128],{},[103,126,127],{},"析構函數","中釋放資源。",[117,130,131,132,135],{},"當對象離開作用域時，析構函數",[103,133,134],{},"一定","會被調用。",[14,137,138,139,142],{},"這是 C++ 區別於 C 和其他語言的",[103,140,141],{},"核心設計理念之一","，智能指針、lock_guard、fstream 都是 RAII 的實現。",[10,144,146],{"id":145},"c-標準版本","C++ 標準版本",[14,148,149],{},"C++98（RAII 從 C++ 誕生之初就存在，智能指針、lock_guard 等現代 RAII 工具在 C++11 成熟）。",[10,151,152],{"id":152},"需要的頭文件",[14,154,155,156,159,160,163,164,167],{},"RAII 是編程理念，不需要特定頭文件。但 RAII 的實現分散在各處：",[25,157,158],{},"\u003Cmemory>","（智能指針）、",[25,161,162],{},"\u003Cmutex>","（鎖）、",[25,165,166],{},"\u003Cfstream>","（文件流）等。",[10,169,170],{"id":170},"基本語法",[18,172,174],{"className":20,"code":173,"language":22,"meta":23,"style":23},"class RAIIExample\n{\n    Resource* res;  \u002F\u002F 管理的资源\n\npublic:\n    RAIIExample() : res(获取资源) { }   \u002F\u002F 构造：获取资源\n    ~RAIIExample() { 释放资源; }        \u002F\u002F 析构：释放资源\n};\n",[25,175,176,184,189,202,209,215,233,245],{"__ignoreMap":23},[28,177,178,181],{"class":30,"line":31},[28,179,180],{"class":38},"class",[28,182,183],{"class":48}," RAIIExample\n",[28,185,186],{"class":30,"line":68},[28,187,188],{"class":34},"{\n",[28,190,191,194,196,199],{"class":30,"line":75},[28,192,193],{"class":34},"    Resource",[28,195,39],{"class":38},[28,197,198],{"class":34}," res;",[28,200,201],{"class":71},"  \u002F\u002F 管理的资源\n",[28,203,205],{"class":30,"line":204},4,[28,206,208],{"emptyLinePlaceholder":207},true,"\n",[28,210,212],{"class":30,"line":211},5,[28,213,214],{"class":38},"public:\n",[28,216,218,221,224,227,230],{"class":30,"line":217},6,[28,219,220],{"class":48},"    RAIIExample",[28,222,223],{"class":34},"() : ",[28,225,226],{"class":48},"res",[28,228,229],{"class":34},"(获取资源) { }",[28,231,232],{"class":71},"   \u002F\u002F 构造：获取资源\n",[28,234,236,239,242],{"class":30,"line":235},7,[28,237,238],{"class":48},"    ~RAIIExample",[28,240,241],{"class":34},"() { 释放资源; }",[28,243,244],{"class":71},"        \u002F\u002F 析构：释放资源\n",[28,246,248],{"class":30,"line":247},8,[28,249,250],{"class":34},"};\n",[10,252,254],{"id":253},"常用-raii-實現","常用 RAII 實現",[256,257,258,275],"table",{},[259,260,261],"thead",{},[262,263,264,269,272],"tr",{},[265,266,268],"th",{"align":267},"left","RAII 類型",[265,270,271],{"align":267},"管理資源",[265,273,274],{"align":267},"頭文件",[276,277,278,293,307,321,335,349],"tbody",{},[262,279,280,286,289],{},[281,282,283],"td",{"align":267},[25,284,285],{},"std::unique_ptr",[281,287,288],{"align":267},"動態內存",[281,290,291],{"align":267},[25,292,158],{},[262,294,295,300,303],{},[281,296,297],{"align":267},[25,298,299],{},"std::shared_ptr",[281,301,302],{"align":267},"動態內存（共享）",[281,304,305],{"align":267},[25,306,158],{},[262,308,309,314,317],{},[281,310,311],{"align":267},[25,312,313],{},"std::lock_guard",[281,315,316],{"align":267},"互斥鎖",[281,318,319],{"align":267},[25,320,162],{},[262,322,323,328,331],{},[281,324,325],{"align":267},[25,326,327],{},"std::unique_lock",[281,329,330],{"align":267},"互斥鎖（靈活）",[281,332,333],{"align":267},[25,334,162],{},[262,336,337,342,345],{},[281,338,339],{"align":267},[25,340,341],{},"std::fstream",[281,343,344],{"align":267},"文件句柄",[281,346,347],{"align":267},[25,348,166],{},[262,350,351,356,359],{},[281,352,353],{"align":267},[25,354,355],{},"std::thread",[281,357,358],{"align":267},"線程（需 join\u002Fdetach）",[281,360,361],{"align":267},[25,362,363],{},"\u003Cthread>",[10,365,366],{"id":366},"示例代碼",[368,369,371],"h3",{"id":370},"示例-1沒有-raii-的問題-vs-有-raii","示例 1：沒有 RAII 的問題 vs 有 RAII",[18,373,375],{"className":20,"code":374,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n\n\u002F\u002F 模拟一个资源\nclass Resource\n{\npublic:\n    void open()  { std::cout \u003C\u003C \"Resource opened\\n\"; }\n    void close() { std::cout \u003C\u003C \"Resource closed\\n\"; }\n    void use()   { std::cout \u003C\u003C \"Resource used\\n\"; }\n};\n\n\u002F\u002F ❌ 手动管理：容易忘记 close\nvoid no_raii()\n{\n    Resource r;\n    r.open();\n    r.use();\n    \u002F\u002F 如果这里抛异常或提前 return，close 不会执行！\n    r.close();\n}\n\n\u002F\u002F ✅ RAII：利用析构函数自动释放\nclass ResourceGuard\n{\n    Resource& r;\npublic:\n    ResourceGuard(Resource& res) : r(res)\n    {\n        r.open();  \u002F\u002F 构造时获取资源\n    }\n    ~ResourceGuard()\n    {\n        r.close(); \u002F\u002F 析构时释放资源\n    }\n};\n\nvoid with_raii()\n{\n    Resource r;\n    ResourceGuard guard(r);  \u002F\u002F 构造时 open\n    r.use();\n    \u002F\u002F guard 离开作用域，析构函数自动 close\n}\n\nint main()\n{\n    std::cout \u003C\u003C \"=== no_raii ===\\n\";\n    no_raii();\n\n    std::cout \u003C\u003C \"\\n=== with_raii ===\\n\";\n    with_raii();\n\n    return 0;\n}\n",[25,376,377,385,389,394,401,405,409,442,467,493,498,503,509,521,526,532,544,554,560,570,576,581,587,595,600,611,616,642,648,662,668,676,681,693,698,703,708,718,723,728,743,752,758,763,768,779,784,804,812,817,840,848,853,864],{"__ignoreMap":23},[28,378,379,382],{"class":30,"line":31},[28,380,381],{"class":38},"#include",[28,383,384],{"class":55}," \u003Ciostream>\n",[28,386,387],{"class":30,"line":68},[28,388,208],{"emptyLinePlaceholder":207},[28,390,391],{"class":30,"line":75},[28,392,393],{"class":71},"\u002F\u002F 模拟一个资源\n",[28,395,396,398],{"class":30,"line":204},[28,397,180],{"class":38},[28,399,400],{"class":48}," Resource\n",[28,402,403],{"class":30,"line":211},[28,404,188],{"class":34},[28,406,407],{"class":30,"line":217},[28,408,214],{"class":38},[28,410,411,414,417,420,423,426,429,432,436,439],{"class":30,"line":235},[28,412,413],{"class":38},"    void",[28,415,416],{"class":48}," open",[28,418,419],{"class":34},"()  { ",[28,421,422],{"class":48},"std",[28,424,425],{"class":34},"::cout ",[28,427,428],{"class":38},"\u003C\u003C",[28,430,431],{"class":55}," \"Resource opened",[28,433,435],{"class":434},"sj4cs","\\n",[28,437,438],{"class":55},"\"",[28,440,441],{"class":34},"; }\n",[28,443,444,446,449,452,454,456,458,461,463,465],{"class":30,"line":247},[28,445,413],{"class":38},[28,447,448],{"class":48}," close",[28,450,451],{"class":34},"() { ",[28,453,422],{"class":48},[28,455,425],{"class":34},[28,457,428],{"class":38},[28,459,460],{"class":55}," \"Resource closed",[28,462,435],{"class":434},[28,464,438],{"class":55},[28,466,441],{"class":34},[28,468,470,472,475,478,480,482,484,487,489,491],{"class":30,"line":469},9,[28,471,413],{"class":38},[28,473,474],{"class":48}," use",[28,476,477],{"class":34},"()   { ",[28,479,422],{"class":48},[28,481,425],{"class":34},[28,483,428],{"class":38},[28,485,486],{"class":55}," \"Resource used",[28,488,435],{"class":434},[28,490,438],{"class":55},[28,492,441],{"class":34},[28,494,496],{"class":30,"line":495},10,[28,497,250],{"class":34},[28,499,501],{"class":30,"line":500},11,[28,502,208],{"emptyLinePlaceholder":207},[28,504,506],{"class":30,"line":505},12,[28,507,508],{"class":71},"\u002F\u002F ❌ 手动管理：容易忘记 close\n",[28,510,512,515,518],{"class":30,"line":511},13,[28,513,514],{"class":38},"void",[28,516,517],{"class":48}," no_raii",[28,519,520],{"class":34},"()\n",[28,522,524],{"class":30,"line":523},14,[28,525,188],{"class":34},[28,527,529],{"class":30,"line":528},15,[28,530,531],{"class":34},"    Resource r;\n",[28,533,535,538,541],{"class":30,"line":534},16,[28,536,537],{"class":34},"    r.",[28,539,540],{"class":48},"open",[28,542,543],{"class":34},"();\n",[28,545,547,549,552],{"class":30,"line":546},17,[28,548,537],{"class":34},[28,550,551],{"class":48},"use",[28,553,543],{"class":34},[28,555,557],{"class":30,"line":556},18,[28,558,559],{"class":71},"    \u002F\u002F 如果这里抛异常或提前 return，close 不会执行！\n",[28,561,563,565,568],{"class":30,"line":562},19,[28,564,537],{"class":34},[28,566,567],{"class":48},"close",[28,569,543],{"class":34},[28,571,573],{"class":30,"line":572},20,[28,574,575],{"class":34},"}\n",[28,577,579],{"class":30,"line":578},21,[28,580,208],{"emptyLinePlaceholder":207},[28,582,584],{"class":30,"line":583},22,[28,585,586],{"class":71},"\u002F\u002F ✅ RAII：利用析构函数自动释放\n",[28,588,590,592],{"class":30,"line":589},23,[28,591,180],{"class":38},[28,593,594],{"class":48}," ResourceGuard\n",[28,596,598],{"class":30,"line":597},24,[28,599,188],{"class":34},[28,601,603,605,608],{"class":30,"line":602},25,[28,604,193],{"class":34},[28,606,607],{"class":38},"&",[28,609,610],{"class":34}," r;\n",[28,612,614],{"class":30,"line":613},26,[28,615,214],{"class":38},[28,617,619,622,624,627,629,633,636,639],{"class":30,"line":618},27,[28,620,621],{"class":48},"    ResourceGuard",[28,623,52],{"class":34},[28,625,626],{"class":48},"Resource",[28,628,607],{"class":38},[28,630,632],{"class":631},"s4XuR"," res",[28,634,635],{"class":34},") : ",[28,637,638],{"class":48},"r",[28,640,641],{"class":34},"(res)\n",[28,643,645],{"class":30,"line":644},28,[28,646,647],{"class":34},"    {\n",[28,649,651,654,656,659],{"class":30,"line":650},29,[28,652,653],{"class":34},"        r.",[28,655,540],{"class":48},[28,657,658],{"class":34},"();",[28,660,661],{"class":71},"  \u002F\u002F 构造时获取资源\n",[28,663,665],{"class":30,"line":664},30,[28,666,667],{"class":34},"    }\n",[28,669,671,674],{"class":30,"line":670},31,[28,672,673],{"class":48},"    ~ResourceGuard",[28,675,520],{"class":34},[28,677,679],{"class":30,"line":678},32,[28,680,647],{"class":34},[28,682,684,686,688,690],{"class":30,"line":683},33,[28,685,653],{"class":34},[28,687,567],{"class":48},[28,689,658],{"class":34},[28,691,692],{"class":71}," \u002F\u002F 析构时释放资源\n",[28,694,696],{"class":30,"line":695},34,[28,697,667],{"class":34},[28,699,701],{"class":30,"line":700},35,[28,702,250],{"class":34},[28,704,706],{"class":30,"line":705},36,[28,707,208],{"emptyLinePlaceholder":207},[28,709,711,713,716],{"class":30,"line":710},37,[28,712,514],{"class":38},[28,714,715],{"class":48}," with_raii",[28,717,520],{"class":34},[28,719,721],{"class":30,"line":720},38,[28,722,188],{"class":34},[28,724,726],{"class":30,"line":725},39,[28,727,531],{"class":34},[28,729,731,734,737,740],{"class":30,"line":730},40,[28,732,733],{"class":34},"    ResourceGuard ",[28,735,736],{"class":48},"guard",[28,738,739],{"class":34},"(r);",[28,741,742],{"class":71},"  \u002F\u002F 构造时 open\n",[28,744,746,748,750],{"class":30,"line":745},41,[28,747,537],{"class":34},[28,749,551],{"class":48},[28,751,543],{"class":34},[28,753,755],{"class":30,"line":754},42,[28,756,757],{"class":71},"    \u002F\u002F guard 离开作用域，析构函数自动 close\n",[28,759,761],{"class":30,"line":760},43,[28,762,575],{"class":34},[28,764,766],{"class":30,"line":765},44,[28,767,208],{"emptyLinePlaceholder":207},[28,769,771,774,777],{"class":30,"line":770},45,[28,772,773],{"class":38},"int",[28,775,776],{"class":48}," main",[28,778,520],{"class":34},[28,780,782],{"class":30,"line":781},46,[28,783,188],{"class":34},[28,785,787,790,792,794,797,799,801],{"class":30,"line":786},47,[28,788,789],{"class":48},"    std",[28,791,425],{"class":34},[28,793,428],{"class":38},[28,795,796],{"class":55}," \"=== no_raii ===",[28,798,435],{"class":434},[28,800,438],{"class":55},[28,802,803],{"class":34},";\n",[28,805,807,810],{"class":30,"line":806},48,[28,808,809],{"class":48},"    no_raii",[28,811,543],{"class":34},[28,813,815],{"class":30,"line":814},49,[28,816,208],{"emptyLinePlaceholder":207},[28,818,820,822,824,826,829,831,834,836,838],{"class":30,"line":819},50,[28,821,789],{"class":48},[28,823,425],{"class":34},[28,825,428],{"class":38},[28,827,828],{"class":55}," \"",[28,830,435],{"class":434},[28,832,833],{"class":55},"=== with_raii ===",[28,835,435],{"class":434},[28,837,438],{"class":55},[28,839,803],{"class":34},[28,841,843,846],{"class":30,"line":842},51,[28,844,845],{"class":48},"    with_raii",[28,847,543],{"class":34},[28,849,851],{"class":30,"line":850},52,[28,852,208],{"emptyLinePlaceholder":207},[28,854,856,859,862],{"class":30,"line":855},53,[28,857,858],{"class":38},"    return",[28,860,861],{"class":434}," 0",[28,863,803],{"class":34},[28,865,867],{"class":30,"line":866},54,[28,868,575],{"class":34},[14,870,871,874],{},[103,872,873],{},"運行結果","：",[18,876,881],{"className":877,"code":879,"language":880},[878],"language-text","=== no_raii ===\nResource opened\nResource used\nResource closed\n\n=== with_raii ===\nResource opened\nResource used\nResource closed\n","text",[25,882,879],{"__ignoreMap":23},[368,884,886],{"id":885},"示例-2在示例-1-基礎上用-lock_guard-理解-raii-鎖管理","示例 2：在示例 1 基礎上，用 lock_guard 理解 RAII 鎖管理",[18,888,890],{"className":20,"code":889,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n#include \u003Cmutex>\n#include \u003Cthread>\n\nstd::mutex mtx;  \u002F\u002F 共享互斥量\nint counter = 0;\n\n\u002F\u002F ❌ 手动加锁解锁（容易出问题）\nvoid manual_lock()\n{\n    mtx.lock();\n    ++counter;\n    \u002F\u002F 如果这里抛异常，unlock 永远不会被执行！\n    mtx.unlock();\n}\n\n\u002F\u002F ✅ RAII 风格：lock_guard 自动管理锁\nvoid raii_lock()\n{\n    std::lock_guard\u003Cstd::mutex> lock(mtx);  \u002F\u002F 构造时 lock\n    ++counter;\n    \u002F\u002F lock 离开作用域，析构函数自动 unlock\n}\n\nint main()\n{\n    std::thread t1([] {\n        for (int i = 0; i \u003C 1000; ++i)\n            raii_lock();\n    });\n    std::thread t2([] {\n        for (int i = 0; i \u003C 1000; ++i)\n            raii_lock();\n    });\n\n    t1.join();\n    t2.join();\n\n    std::cout \u003C\u003C \"counter = \" \u003C\u003C counter \u003C\u003C \" (expected 2000)\\n\";\n\n    return 0;\n}\n",[25,891,892,898,905,912,916,926,939,943,948,957,961,971,979,984,993,997,1001,1006,1015,1019,1046,1052,1057,1061,1065,1073,1077,1090,1124,1131,1136,1147,1173,1179,1183,1187,1197,1206,1210,1237,1241,1249],{"__ignoreMap":23},[28,893,894,896],{"class":30,"line":31},[28,895,381],{"class":38},[28,897,384],{"class":55},[28,899,900,902],{"class":30,"line":68},[28,901,381],{"class":38},[28,903,904],{"class":55}," \u003Cmutex>\n",[28,906,907,909],{"class":30,"line":75},[28,908,381],{"class":38},[28,910,911],{"class":55}," \u003Cthread>\n",[28,913,914],{"class":30,"line":204},[28,915,208],{"emptyLinePlaceholder":207},[28,917,918,920,923],{"class":30,"line":211},[28,919,422],{"class":48},[28,921,922],{"class":34},"::mutex mtx;",[28,924,925],{"class":71},"  \u002F\u002F 共享互斥量\n",[28,927,928,930,933,935,937],{"class":30,"line":217},[28,929,773],{"class":38},[28,931,932],{"class":34}," counter ",[28,934,45],{"class":38},[28,936,861],{"class":434},[28,938,803],{"class":34},[28,940,941],{"class":30,"line":235},[28,942,208],{"emptyLinePlaceholder":207},[28,944,945],{"class":30,"line":247},[28,946,947],{"class":71},"\u002F\u002F ❌ 手动加锁解锁（容易出问题）\n",[28,949,950,952,955],{"class":30,"line":469},[28,951,514],{"class":38},[28,953,954],{"class":48}," manual_lock",[28,956,520],{"class":34},[28,958,959],{"class":30,"line":495},[28,960,188],{"class":34},[28,962,963,966,969],{"class":30,"line":500},[28,964,965],{"class":34},"    mtx.",[28,967,968],{"class":48},"lock",[28,970,543],{"class":34},[28,972,973,976],{"class":30,"line":505},[28,974,975],{"class":38},"    ++",[28,977,978],{"class":34},"counter;\n",[28,980,981],{"class":30,"line":511},[28,982,983],{"class":71},"    \u002F\u002F 如果这里抛异常，unlock 永远不会被执行！\n",[28,985,986,988,991],{"class":30,"line":523},[28,987,965],{"class":34},[28,989,990],{"class":48},"unlock",[28,992,543],{"class":34},[28,994,995],{"class":30,"line":528},[28,996,575],{"class":34},[28,998,999],{"class":30,"line":534},[28,1000,208],{"emptyLinePlaceholder":207},[28,1002,1003],{"class":30,"line":546},[28,1004,1005],{"class":71},"\u002F\u002F ✅ RAII 风格：lock_guard 自动管理锁\n",[28,1007,1008,1010,1013],{"class":30,"line":556},[28,1009,514],{"class":38},[28,1011,1012],{"class":48}," raii_lock",[28,1014,520],{"class":34},[28,1016,1017],{"class":30,"line":562},[28,1018,188],{"class":34},[28,1020,1021,1023,1026,1029,1031,1034,1037,1040,1043],{"class":30,"line":572},[28,1022,789],{"class":48},[28,1024,1025],{"class":34},"::lock_guard",[28,1027,1028],{"class":38},"\u003C",[28,1030,422],{"class":48},[28,1032,1033],{"class":34},"::mutex",[28,1035,1036],{"class":38},">",[28,1038,1039],{"class":48}," lock",[28,1041,1042],{"class":34},"(mtx);",[28,1044,1045],{"class":71},"  \u002F\u002F 构造时 lock\n",[28,1047,1048,1050],{"class":30,"line":578},[28,1049,975],{"class":38},[28,1051,978],{"class":34},[28,1053,1054],{"class":30,"line":583},[28,1055,1056],{"class":71},"    \u002F\u002F lock 离开作用域，析构函数自动 unlock\n",[28,1058,1059],{"class":30,"line":589},[28,1060,575],{"class":34},[28,1062,1063],{"class":30,"line":597},[28,1064,208],{"emptyLinePlaceholder":207},[28,1066,1067,1069,1071],{"class":30,"line":602},[28,1068,773],{"class":38},[28,1070,776],{"class":48},[28,1072,520],{"class":34},[28,1074,1075],{"class":30,"line":613},[28,1076,188],{"class":34},[28,1078,1079,1081,1084,1087],{"class":30,"line":618},[28,1080,789],{"class":48},[28,1082,1083],{"class":34},"::thread ",[28,1085,1086],{"class":48},"t1",[28,1088,1089],{"class":34},"([] {\n",[28,1091,1092,1095,1098,1100,1103,1105,1107,1110,1112,1115,1118,1121],{"class":30,"line":644},[28,1093,1094],{"class":38},"        for",[28,1096,1097],{"class":34}," (",[28,1099,773],{"class":38},[28,1101,1102],{"class":34}," i ",[28,1104,45],{"class":38},[28,1106,861],{"class":434},[28,1108,1109],{"class":34},"; i ",[28,1111,1028],{"class":38},[28,1113,1114],{"class":434}," 1000",[28,1116,1117],{"class":34},"; ",[28,1119,1120],{"class":38},"++",[28,1122,1123],{"class":34},"i)\n",[28,1125,1126,1129],{"class":30,"line":650},[28,1127,1128],{"class":48},"            raii_lock",[28,1130,543],{"class":34},[28,1132,1133],{"class":30,"line":664},[28,1134,1135],{"class":34},"    });\n",[28,1137,1138,1140,1142,1145],{"class":30,"line":670},[28,1139,789],{"class":48},[28,1141,1083],{"class":34},[28,1143,1144],{"class":48},"t2",[28,1146,1089],{"class":34},[28,1148,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171],{"class":30,"line":678},[28,1150,1094],{"class":38},[28,1152,1097],{"class":34},[28,1154,773],{"class":38},[28,1156,1102],{"class":34},[28,1158,45],{"class":38},[28,1160,861],{"class":434},[28,1162,1109],{"class":34},[28,1164,1028],{"class":38},[28,1166,1114],{"class":434},[28,1168,1117],{"class":34},[28,1170,1120],{"class":38},[28,1172,1123],{"class":34},[28,1174,1175,1177],{"class":30,"line":683},[28,1176,1128],{"class":48},[28,1178,543],{"class":34},[28,1180,1181],{"class":30,"line":695},[28,1182,1135],{"class":34},[28,1184,1185],{"class":30,"line":700},[28,1186,208],{"emptyLinePlaceholder":207},[28,1188,1189,1192,1195],{"class":30,"line":705},[28,1190,1191],{"class":34},"    t1.",[28,1193,1194],{"class":48},"join",[28,1196,543],{"class":34},[28,1198,1199,1202,1204],{"class":30,"line":710},[28,1200,1201],{"class":34},"    t2.",[28,1203,1194],{"class":48},[28,1205,543],{"class":34},[28,1207,1208],{"class":30,"line":720},[28,1209,208],{"emptyLinePlaceholder":207},[28,1211,1212,1214,1216,1218,1221,1224,1226,1228,1231,1233,1235],{"class":30,"line":725},[28,1213,789],{"class":48},[28,1215,425],{"class":34},[28,1217,428],{"class":38},[28,1219,1220],{"class":55}," \"counter = \"",[28,1222,1223],{"class":38}," \u003C\u003C",[28,1225,932],{"class":34},[28,1227,428],{"class":38},[28,1229,1230],{"class":55}," \" (expected 2000)",[28,1232,435],{"class":434},[28,1234,438],{"class":55},[28,1236,803],{"class":34},[28,1238,1239],{"class":30,"line":730},[28,1240,208],{"emptyLinePlaceholder":207},[28,1242,1243,1245,1247],{"class":30,"line":745},[28,1244,858],{"class":38},[28,1246,861],{"class":434},[28,1248,803],{"class":34},[28,1250,1251],{"class":30,"line":754},[28,1252,575],{"class":34},[14,1254,1255,874],{},[103,1256,873],{},[18,1258,1261],{"className":1259,"code":1260,"language":880},[878],"counter = 2000 (expected 2000)\n",[25,1262,1260],{"__ignoreMap":23},[368,1264,1266],{"id":1265},"示例-3在示例-2-基礎上用-fstream-理解文件-raii","示例 3：在示例 2 基礎上，用 fstream 理解文件 RAII",[18,1268,1270],{"className":20,"code":1269,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n#include \u003Cfstream>\n#include \u003Cstring>\n\n\u002F\u002F RAII：fstream 在析构时会自动关闭文件\nvoid write_and_read()\n{\n    \u002F\u002F 写文件\n    {\n        std::ofstream out(\"raii_test.txt\");\n        out \u003C\u003C \"Hello RAII!\\n\";\n        out \u003C\u003C \"This is line 2.\\n\";\n        \u002F\u002F out 离开作用域，文件自动关闭\n    }\n\n    \u002F\u002F 读文件\n    {\n        std::ifstream in(\"raii_test.txt\");\n        std::string line;\n        while (std::getline(in, line))\n        {\n            std::cout \u003C\u003C line \u003C\u003C \"\\n\";\n        }\n        \u002F\u002F in 离开作用域，文件自动关闭\n    }\n}\n\nint main()\n{\n    write_and_read();\n    std::cout \u003C\u003C \"File was automatically closed by RAII\\n\";\n    return 0;\n}\n",[25,1271,1272,1278,1285,1292,1296,1301,1310,1314,1319,1323,1341,1357,1372,1377,1381,1385,1390,1394,1410,1417,1435,1440,1462,1467,1472,1476,1480,1484,1492,1496,1503,1520,1528],{"__ignoreMap":23},[28,1273,1274,1276],{"class":30,"line":31},[28,1275,381],{"class":38},[28,1277,384],{"class":55},[28,1279,1280,1282],{"class":30,"line":68},[28,1281,381],{"class":38},[28,1283,1284],{"class":55}," \u003Cfstream>\n",[28,1286,1287,1289],{"class":30,"line":75},[28,1288,381],{"class":38},[28,1290,1291],{"class":55}," \u003Cstring>\n",[28,1293,1294],{"class":30,"line":204},[28,1295,208],{"emptyLinePlaceholder":207},[28,1297,1298],{"class":30,"line":211},[28,1299,1300],{"class":71},"\u002F\u002F RAII：fstream 在析构时会自动关闭文件\n",[28,1302,1303,1305,1308],{"class":30,"line":217},[28,1304,514],{"class":38},[28,1306,1307],{"class":48}," write_and_read",[28,1309,520],{"class":34},[28,1311,1312],{"class":30,"line":235},[28,1313,188],{"class":34},[28,1315,1316],{"class":30,"line":247},[28,1317,1318],{"class":71},"    \u002F\u002F 写文件\n",[28,1320,1321],{"class":30,"line":469},[28,1322,647],{"class":34},[28,1324,1325,1328,1331,1334,1336,1339],{"class":30,"line":495},[28,1326,1327],{"class":48},"        std",[28,1329,1330],{"class":34},"::ofstream ",[28,1332,1333],{"class":48},"out",[28,1335,52],{"class":34},[28,1337,1338],{"class":55},"\"raii_test.txt\"",[28,1340,65],{"class":34},[28,1342,1343,1346,1348,1351,1353,1355],{"class":30,"line":500},[28,1344,1345],{"class":34},"        out ",[28,1347,428],{"class":38},[28,1349,1350],{"class":55}," \"Hello RAII!",[28,1352,435],{"class":434},[28,1354,438],{"class":55},[28,1356,803],{"class":34},[28,1358,1359,1361,1363,1366,1368,1370],{"class":30,"line":505},[28,1360,1345],{"class":34},[28,1362,428],{"class":38},[28,1364,1365],{"class":55}," \"This is line 2.",[28,1367,435],{"class":434},[28,1369,438],{"class":55},[28,1371,803],{"class":34},[28,1373,1374],{"class":30,"line":511},[28,1375,1376],{"class":71},"        \u002F\u002F out 离开作用域，文件自动关闭\n",[28,1378,1379],{"class":30,"line":523},[28,1380,667],{"class":34},[28,1382,1383],{"class":30,"line":528},[28,1384,208],{"emptyLinePlaceholder":207},[28,1386,1387],{"class":30,"line":534},[28,1388,1389],{"class":71},"    \u002F\u002F 读文件\n",[28,1391,1392],{"class":30,"line":546},[28,1393,647],{"class":34},[28,1395,1396,1398,1401,1404,1406,1408],{"class":30,"line":556},[28,1397,1327],{"class":48},[28,1399,1400],{"class":34},"::ifstream ",[28,1402,1403],{"class":48},"in",[28,1405,52],{"class":34},[28,1407,1338],{"class":55},[28,1409,65],{"class":34},[28,1411,1412,1414],{"class":30,"line":562},[28,1413,1327],{"class":48},[28,1415,1416],{"class":34},"::string line;\n",[28,1418,1419,1422,1424,1426,1429,1432],{"class":30,"line":572},[28,1420,1421],{"class":38},"        while",[28,1423,1097],{"class":34},[28,1425,422],{"class":48},[28,1427,1428],{"class":34},"::",[28,1430,1431],{"class":48},"getline",[28,1433,1434],{"class":34},"(in, line))\n",[28,1436,1437],{"class":30,"line":578},[28,1438,1439],{"class":34},"        {\n",[28,1441,1442,1445,1447,1449,1452,1454,1456,1458,1460],{"class":30,"line":583},[28,1443,1444],{"class":48},"            std",[28,1446,425],{"class":34},[28,1448,428],{"class":38},[28,1450,1451],{"class":34}," line ",[28,1453,428],{"class":38},[28,1455,828],{"class":55},[28,1457,435],{"class":434},[28,1459,438],{"class":55},[28,1461,803],{"class":34},[28,1463,1464],{"class":30,"line":589},[28,1465,1466],{"class":34},"        }\n",[28,1468,1469],{"class":30,"line":597},[28,1470,1471],{"class":71},"        \u002F\u002F in 离开作用域，文件自动关闭\n",[28,1473,1474],{"class":30,"line":602},[28,1475,667],{"class":34},[28,1477,1478],{"class":30,"line":613},[28,1479,575],{"class":34},[28,1481,1482],{"class":30,"line":618},[28,1483,208],{"emptyLinePlaceholder":207},[28,1485,1486,1488,1490],{"class":30,"line":644},[28,1487,773],{"class":38},[28,1489,776],{"class":48},[28,1491,520],{"class":34},[28,1493,1494],{"class":30,"line":650},[28,1495,188],{"class":34},[28,1497,1498,1501],{"class":30,"line":664},[28,1499,1500],{"class":48},"    write_and_read",[28,1502,543],{"class":34},[28,1504,1505,1507,1509,1511,1514,1516,1518],{"class":30,"line":670},[28,1506,789],{"class":48},[28,1508,425],{"class":34},[28,1510,428],{"class":38},[28,1512,1513],{"class":55}," \"File was automatically closed by RAII",[28,1515,435],{"class":434},[28,1517,438],{"class":55},[28,1519,803],{"class":34},[28,1521,1522,1524,1526],{"class":30,"line":678},[28,1523,858],{"class":38},[28,1525,861],{"class":434},[28,1527,803],{"class":34},[28,1529,1530],{"class":30,"line":683},[28,1531,575],{"class":34},[14,1533,1534,874],{},[103,1535,873],{},[18,1537,1540],{"className":1538,"code":1539,"language":880},[878],"Hello RAII!\nThis is line 2.\nFile was automatically closed by RAII\n",[25,1541,1539],{"__ignoreMap":23},[368,1543,1545],{"id":1544},"示例-4在示例-3-基礎上提前-return-時纔看出-raii-的價值","示例 4：在示例 3 基礎上，提前 return 時纔看出 RAII 的價值",[14,1547,1548],{},"下面這個例子故意模擬\"處理到一半發現數據不合法，提前返回\"。正常流程裏手動釋放和 RAII 看起來差不多，但一旦有多個返回路徑，區別就很明顯。",[18,1550,1552],{"className":20,"code":1551,"language":22,"meta":23,"style":23},"#include \u003Ciostream>\n#include \u003Cstring>\n#include \u003Cutility>\n#include \u003Cvector>\n\nclass Connection\n{\n    std::string name_;\n\npublic:\n    explicit Connection(std::string name) : name_(std::move(name))\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" connected\\n\";\n    }\n\n    ~Connection()\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" disconnected\\n\";\n    }\n\n    void send(const std::string& msg)\n    {\n        std::cout \u003C\u003C name_ \u003C\u003C \" send: \" \u003C\u003C msg \u003C\u003C \"\\n\";\n    }\n};\n\nbool upload_with_raii(const std::vector\u003Cstd::string>& lines)\n{\n    Connection conn(\"server\"); \u002F\u002F 构造时连接，函数结束时自动断开\n\n    for (const auto& line : lines)\n    {\n        if (line.empty())\n        {\n            std::cout \u003C\u003C \"empty line, stop upload\\n\";\n            return false; \u002F\u002F conn 仍然会析构\n        }\n\n        conn.send(line);\n    }\n\n    return true; \u002F\u002F conn 也会析构\n}\n\nint main()\n{\n    std::vector\u003Cstd::string> data = {\"hello\", \"world\", \"\", \"after error\"};\n\n    bool ok = upload_with_raii(data);\n    std::cout \u003C\u003C \"upload ok = \" \u003C\u003C std::boolalpha \u003C\u003C ok \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,1553,1554,1560,1566,1573,1580,1584,1591,1595,1602,1606,1610,1647,1651,1673,1677,1681,1688,1692,1713,1717,1721,1748,1752,1782,1786,1790,1794,1830,1834,1853,1857,1872,1876,1890,1894,1911,1925,1929,1933,1944,1948,1952,1964,1968,1972,1980,1984,2028,2032,2047,2079,2083,2091],{"__ignoreMap":23},[28,1555,1556,1558],{"class":30,"line":31},[28,1557,381],{"class":38},[28,1559,384],{"class":55},[28,1561,1562,1564],{"class":30,"line":68},[28,1563,381],{"class":38},[28,1565,1291],{"class":55},[28,1567,1568,1570],{"class":30,"line":75},[28,1569,381],{"class":38},[28,1571,1572],{"class":55}," \u003Cutility>\n",[28,1574,1575,1577],{"class":30,"line":204},[28,1576,381],{"class":38},[28,1578,1579],{"class":55}," \u003Cvector>\n",[28,1581,1582],{"class":30,"line":211},[28,1583,208],{"emptyLinePlaceholder":207},[28,1585,1586,1588],{"class":30,"line":217},[28,1587,180],{"class":38},[28,1589,1590],{"class":48}," Connection\n",[28,1592,1593],{"class":30,"line":235},[28,1594,188],{"class":34},[28,1596,1597,1599],{"class":30,"line":247},[28,1598,789],{"class":48},[28,1600,1601],{"class":34},"::string name_;\n",[28,1603,1604],{"class":30,"line":469},[28,1605,208],{"emptyLinePlaceholder":207},[28,1607,1608],{"class":30,"line":495},[28,1609,214],{"class":38},[28,1611,1612,1615,1618,1620,1622,1624,1627,1630,1632,1635,1637,1639,1641,1644],{"class":30,"line":500},[28,1613,1614],{"class":38},"    explicit",[28,1616,1617],{"class":48}," Connection",[28,1619,52],{"class":34},[28,1621,422],{"class":48},[28,1623,1428],{"class":34},[28,1625,1626],{"class":48},"string",[28,1628,1629],{"class":631}," name",[28,1631,635],{"class":34},[28,1633,1634],{"class":48},"name_",[28,1636,52],{"class":34},[28,1638,422],{"class":48},[28,1640,1428],{"class":34},[28,1642,1643],{"class":48},"move",[28,1645,1646],{"class":34},"(name))\n",[28,1648,1649],{"class":30,"line":505},[28,1650,647],{"class":34},[28,1652,1653,1655,1657,1659,1662,1664,1667,1669,1671],{"class":30,"line":511},[28,1654,1327],{"class":48},[28,1656,425],{"class":34},[28,1658,428],{"class":38},[28,1660,1661],{"class":34}," name_ ",[28,1663,428],{"class":38},[28,1665,1666],{"class":55}," \" connected",[28,1668,435],{"class":434},[28,1670,438],{"class":55},[28,1672,803],{"class":34},[28,1674,1675],{"class":30,"line":523},[28,1676,667],{"class":34},[28,1678,1679],{"class":30,"line":528},[28,1680,208],{"emptyLinePlaceholder":207},[28,1682,1683,1686],{"class":30,"line":534},[28,1684,1685],{"class":48},"    ~Connection",[28,1687,520],{"class":34},[28,1689,1690],{"class":30,"line":546},[28,1691,647],{"class":34},[28,1693,1694,1696,1698,1700,1702,1704,1707,1709,1711],{"class":30,"line":556},[28,1695,1327],{"class":48},[28,1697,425],{"class":34},[28,1699,428],{"class":38},[28,1701,1661],{"class":34},[28,1703,428],{"class":38},[28,1705,1706],{"class":55}," \" disconnected",[28,1708,435],{"class":434},[28,1710,438],{"class":55},[28,1712,803],{"class":34},[28,1714,1715],{"class":30,"line":562},[28,1716,667],{"class":34},[28,1718,1719],{"class":30,"line":572},[28,1720,208],{"emptyLinePlaceholder":207},[28,1722,1723,1725,1728,1730,1733,1736,1738,1740,1742,1745],{"class":30,"line":578},[28,1724,413],{"class":38},[28,1726,1727],{"class":48}," send",[28,1729,52],{"class":34},[28,1731,1732],{"class":38},"const",[28,1734,1735],{"class":48}," std",[28,1737,1428],{"class":34},[28,1739,1626],{"class":48},[28,1741,607],{"class":38},[28,1743,1744],{"class":631}," msg",[28,1746,1747],{"class":34},")\n",[28,1749,1750],{"class":30,"line":583},[28,1751,647],{"class":34},[28,1753,1754,1756,1758,1760,1762,1764,1767,1769,1772,1774,1776,1778,1780],{"class":30,"line":589},[28,1755,1327],{"class":48},[28,1757,425],{"class":34},[28,1759,428],{"class":38},[28,1761,1661],{"class":34},[28,1763,428],{"class":38},[28,1765,1766],{"class":55}," \" send: \"",[28,1768,1223],{"class":38},[28,1770,1771],{"class":34}," msg ",[28,1773,428],{"class":38},[28,1775,828],{"class":55},[28,1777,435],{"class":434},[28,1779,438],{"class":55},[28,1781,803],{"class":34},[28,1783,1784],{"class":30,"line":597},[28,1785,667],{"class":34},[28,1787,1788],{"class":30,"line":602},[28,1789,250],{"class":34},[28,1791,1792],{"class":30,"line":613},[28,1793,208],{"emptyLinePlaceholder":207},[28,1795,1796,1799,1802,1804,1806,1808,1810,1813,1815,1817,1819,1821,1823,1825,1828],{"class":30,"line":618},[28,1797,1798],{"class":38},"bool",[28,1800,1801],{"class":48}," upload_with_raii",[28,1803,52],{"class":34},[28,1805,1732],{"class":38},[28,1807,1735],{"class":48},[28,1809,1428],{"class":34},[28,1811,1812],{"class":48},"vector",[28,1814,1028],{"class":34},[28,1816,422],{"class":48},[28,1818,1428],{"class":34},[28,1820,1626],{"class":48},[28,1822,1036],{"class":34},[28,1824,607],{"class":38},[28,1826,1827],{"class":631}," lines",[28,1829,1747],{"class":34},[28,1831,1832],{"class":30,"line":644},[28,1833,188],{"class":34},[28,1835,1836,1839,1842,1844,1847,1850],{"class":30,"line":650},[28,1837,1838],{"class":34},"    Connection ",[28,1840,1841],{"class":48},"conn",[28,1843,52],{"class":34},[28,1845,1846],{"class":55},"\"server\"",[28,1848,1849],{"class":34},");",[28,1851,1852],{"class":71}," \u002F\u002F 构造时连接，函数结束时自动断开\n",[28,1854,1855],{"class":30,"line":664},[28,1856,208],{"emptyLinePlaceholder":207},[28,1858,1859,1862,1864,1866,1869],{"class":30,"line":670},[28,1860,1861],{"class":38},"    for",[28,1863,1097],{"class":34},[28,1865,1732],{"class":38},[28,1867,1868],{"class":38}," auto&",[28,1870,1871],{"class":34}," line : lines)\n",[28,1873,1874],{"class":30,"line":678},[28,1875,647],{"class":34},[28,1877,1878,1881,1884,1887],{"class":30,"line":683},[28,1879,1880],{"class":38},"        if",[28,1882,1883],{"class":34}," (line.",[28,1885,1886],{"class":48},"empty",[28,1888,1889],{"class":34},"())\n",[28,1891,1892],{"class":30,"line":695},[28,1893,1439],{"class":34},[28,1895,1896,1898,1900,1902,1905,1907,1909],{"class":30,"line":700},[28,1897,1444],{"class":48},[28,1899,425],{"class":34},[28,1901,428],{"class":38},[28,1903,1904],{"class":55}," \"empty line, stop upload",[28,1906,435],{"class":434},[28,1908,438],{"class":55},[28,1910,803],{"class":34},[28,1912,1913,1916,1919,1922],{"class":30,"line":705},[28,1914,1915],{"class":38},"            return",[28,1917,1918],{"class":434}," false",[28,1920,1921],{"class":34},";",[28,1923,1924],{"class":71}," \u002F\u002F conn 仍然会析构\n",[28,1926,1927],{"class":30,"line":710},[28,1928,1466],{"class":34},[28,1930,1931],{"class":30,"line":720},[28,1932,208],{"emptyLinePlaceholder":207},[28,1934,1935,1938,1941],{"class":30,"line":725},[28,1936,1937],{"class":34},"        conn.",[28,1939,1940],{"class":48},"send",[28,1942,1943],{"class":34},"(line);\n",[28,1945,1946],{"class":30,"line":730},[28,1947,667],{"class":34},[28,1949,1950],{"class":30,"line":745},[28,1951,208],{"emptyLinePlaceholder":207},[28,1953,1954,1956,1959,1961],{"class":30,"line":754},[28,1955,858],{"class":38},[28,1957,1958],{"class":434}," true",[28,1960,1921],{"class":34},[28,1962,1963],{"class":71}," \u002F\u002F conn 也会析构\n",[28,1965,1966],{"class":30,"line":760},[28,1967,575],{"class":34},[28,1969,1970],{"class":30,"line":765},[28,1971,208],{"emptyLinePlaceholder":207},[28,1973,1974,1976,1978],{"class":30,"line":770},[28,1975,773],{"class":38},[28,1977,776],{"class":48},[28,1979,520],{"class":34},[28,1981,1982],{"class":30,"line":781},[28,1983,188],{"class":34},[28,1985,1986,1988,1991,1993,1995,1998,2000,2003,2005,2008,2011,2013,2016,2018,2021,2023,2026],{"class":30,"line":786},[28,1987,789],{"class":48},[28,1989,1990],{"class":34},"::vector",[28,1992,1028],{"class":38},[28,1994,422],{"class":48},[28,1996,1997],{"class":34},"::string",[28,1999,1036],{"class":38},[28,2001,2002],{"class":34}," data ",[28,2004,45],{"class":38},[28,2006,2007],{"class":34}," {",[28,2009,2010],{"class":55},"\"hello\"",[28,2012,59],{"class":34},[28,2014,2015],{"class":55},"\"world\"",[28,2017,59],{"class":34},[28,2019,2020],{"class":55},"\"\"",[28,2022,59],{"class":34},[28,2024,2025],{"class":55},"\"after error\"",[28,2027,250],{"class":34},[28,2029,2030],{"class":30,"line":806},[28,2031,208],{"emptyLinePlaceholder":207},[28,2033,2034,2037,2040,2042,2044],{"class":30,"line":814},[28,2035,2036],{"class":38},"    bool",[28,2038,2039],{"class":34}," ok ",[28,2041,45],{"class":38},[28,2043,1801],{"class":48},[28,2045,2046],{"class":34},"(data);\n",[28,2048,2049,2051,2053,2055,2058,2060,2062,2065,2067,2069,2071,2073,2075,2077],{"class":30,"line":819},[28,2050,789],{"class":48},[28,2052,425],{"class":34},[28,2054,428],{"class":38},[28,2056,2057],{"class":55}," \"upload ok = \"",[28,2059,1223],{"class":38},[28,2061,1735],{"class":48},[28,2063,2064],{"class":34},"::boolalpha ",[28,2066,428],{"class":38},[28,2068,2039],{"class":34},[28,2070,428],{"class":38},[28,2072,828],{"class":55},[28,2074,435],{"class":434},[28,2076,438],{"class":55},[28,2078,803],{"class":34},[28,2080,2081],{"class":30,"line":842},[28,2082,208],{"emptyLinePlaceholder":207},[28,2084,2085,2087,2089],{"class":30,"line":850},[28,2086,858],{"class":38},[28,2088,861],{"class":434},[28,2090,803],{"class":34},[28,2092,2093],{"class":30,"line":855},[28,2094,575],{"class":34},[14,2096,2097,874],{},[103,2098,873],{},[18,2100,2103],{"className":2101,"code":2102,"language":880},[878],"server connected\nserver send: hello\nserver send: world\nempty line, stop upload\nserver disconnected\nupload ok = false\n",[25,2104,2102],{"__ignoreMap":23},[10,2106,873],{"id":873},[14,2108,2109],{},"見上方每個示例的\"運行結果\"。",[10,2111,2112],{"id":2112},"示例中的關鍵語法解釋",[256,2114,2115,2134],{},[259,2116,2117],{},[262,2118,2119,2122,2125,2128,2131],{},[265,2120,2121],{"align":267},"示例",[265,2123,2124],{"align":267},"講了什麼",[265,2126,2127],{"align":267},"新出現的語法",[265,2129,2130],{"align":267},"爲什麼這樣寫",[265,2132,2133],{"align":267},"注意事項",[276,2135,2136,2153,2172,2195],{},[262,2137,2138,2141,2144,2147,2150],{},[281,2139,2140],{"align":267},"示例 1",[281,2142,2143],{"align":267},"RAII 基本原理",[281,2145,2146],{"align":267},"構造函數獲取，析構函數釋放",[281,2148,2149],{"align":267},"展示了手動管理的問題和 RAII 的解決方案",[281,2151,2152],{"align":267},"RAII 的\"一定執行析構\"是 C++ 的核心保證",[262,2154,2155,2158,2161,2166,2169],{},[281,2156,2157],{"align":267},"示例 2",[281,2159,2160],{"align":267},"lock_guard 是 RAII",[281,2162,2163],{"align":267},[25,2164,2165],{},"std::lock_guard\u003Cstd::mutex>",[281,2167,2168],{"align":267},"構造時加鎖，析構時解鎖，異常安全",[281,2170,2171],{"align":267},"比手動 lock\u002Funlock 安全得多",[262,2173,2174,2177,2180,2189,2192],{},[281,2175,2176],{"align":267},"示例 3",[281,2178,2179],{"align":267},"fstream 是 RAII",[281,2181,2182,2185,2186],{"align":267},[25,2183,2184],{},"std::ofstream","、",[25,2187,2188],{},"std::ifstream",[281,2190,2191],{"align":267},"構造時打開文件，析構時關閉文件",[281,2193,2194],{"align":267},"不需要顯式寫 close",[262,2196,2197,2200,2203,2209,2212],{},[281,2198,2199],{"align":267},"示例 4",[281,2201,2202],{"align":267},"多返回路徑中的 RAII",[281,2204,2205,2206],{"align":267},"構造\u002F析構、提前 ",[25,2207,2208],{},"return",[281,2210,2211],{"align":267},"真實工程裏經常有提前返回，RAII 能保證資源仍被釋放",[281,2213,2214],{"align":267},"資源對象要放在正確的作用域裏",[10,2216,2217],{"id":2217},"常見錯誤",[14,2219,2220],{},[103,2221,2222],{},"錯誤 1：在析構函數中拋出異常",[18,2224,2226],{"className":20,"code":2225,"language":22,"meta":23,"style":23},"~MyRAII()\n{\n    cleanup();  \u002F\u002F 如果 cleanup 抛异常...\n}\n",[25,2227,2228,2238,2242,2252],{"__ignoreMap":23},[28,2229,2230,2233,2236],{"class":30,"line":31},[28,2231,2232],{"class":38},"~",[28,2234,2235],{"class":48},"MyRAII",[28,2237,520],{"class":34},[28,2239,2240],{"class":30,"line":68},[28,2241,188],{"class":34},[28,2243,2244,2247,2249],{"class":30,"line":75},[28,2245,2246],{"class":48},"    cleanup",[28,2248,658],{"class":34},[28,2250,2251],{"class":71},"  \u002F\u002F 如果 cleanup 抛异常...\n",[28,2253,2254],{"class":30,"line":204},[28,2255,575],{"class":34},[14,2257,2258,2259,2262,2263,2266],{},"如果析構函數拋異常，且同時有另一個異常正在傳播，程序會直接 ",[25,2260,2261],{},"std::terminate","。析構函數應標記 ",[25,2264,2265],{},"noexcept"," 並捕獲所有異常。",[14,2268,2269],{},[103,2270,2271],{},"錯誤 2：把 RAII 對象創建在堆上",[18,2273,2275],{"className":20,"code":2274,"language":22,"meta":23,"style":23},"auto* guard = new std::lock_guard\u003Cstd::mutex>(mtx);  \u002F\u002F ❌ 永远不会自动析构！\n",[25,2276,2277],{"__ignoreMap":23},[28,2278,2279,2282,2285,2287,2290,2292,2294,2297,2299,2301,2303,2306,2309],{"class":30,"line":31},[28,2280,2281],{"class":38},"auto*",[28,2283,2284],{"class":34}," guard ",[28,2286,45],{"class":38},[28,2288,2289],{"class":38}," new",[28,2291,1735],{"class":48},[28,2293,1428],{"class":34},[28,2295,2296],{"class":48},"lock_guard",[28,2298,1028],{"class":34},[28,2300,422],{"class":48},[28,2302,1428],{"class":34},[28,2304,2305],{"class":48},"mutex",[28,2307,2308],{"class":34},">(mtx);",[28,2310,2311],{"class":71},"  \u002F\u002F ❌ 永远不会自动析构！\n",[14,2313,2314],{},"正確做法：RAII 對象必須在棧上創建，才能利用離開作用域自動析構的特性。",[14,2316,2317],{},[103,2318,2319],{},"錯誤 3：忘記 RAII 對象的作用域",[18,2321,2323],{"className":20,"code":2322,"language":22,"meta":23,"style":23},"void func()\n{\n    std::lock_guard\u003Cstd::mutex> lock(mtx);\n    \u002F\u002F 锁在这里面生效\n}  \u002F\u002F 离开作用域，解锁\n\n\u002F\u002F 在外面访问共享数据没有保护！\n",[25,2324,2325,2334,2338,2357,2362,2370,2374],{"__ignoreMap":23},[28,2326,2327,2329,2332],{"class":30,"line":31},[28,2328,514],{"class":38},[28,2330,2331],{"class":48}," func",[28,2333,520],{"class":34},[28,2335,2336],{"class":30,"line":68},[28,2337,188],{"class":34},[28,2339,2340,2342,2344,2346,2348,2350,2352,2354],{"class":30,"line":75},[28,2341,789],{"class":48},[28,2343,1025],{"class":34},[28,2345,1028],{"class":38},[28,2347,422],{"class":48},[28,2349,1033],{"class":34},[28,2351,1036],{"class":38},[28,2353,1039],{"class":48},[28,2355,2356],{"class":34},"(mtx);\n",[28,2358,2359],{"class":30,"line":204},[28,2360,2361],{"class":71},"    \u002F\u002F 锁在这里面生效\n",[28,2363,2364,2367],{"class":30,"line":211},[28,2365,2366],{"class":34},"}",[28,2368,2369],{"class":71},"  \u002F\u002F 离开作用域，解锁\n",[28,2371,2372],{"class":30,"line":217},[28,2373,208],{"emptyLinePlaceholder":207},[28,2375,2376],{"class":30,"line":235},[28,2377,2378],{"class":71},"\u002F\u002F 在外面访问共享数据没有保护！\n",[14,2380,2381],{},"正確做法：確保在鎖的作用域內訪問共享數據。",[10,2383,2384],{"id":2384},"使用建議",[2386,2387,2388,2394,2400,2406,2415,2421],"ol",{},[117,2389,2390,2393],{},[103,2391,2392],{},"\"需要配對的獲取\u002F釋放\"就用 RAII","：這是 C++ 的資源管理第一原則。",[117,2395,2396,2399],{},[103,2397,2398],{},"永遠不要手動 new\u002Fdelete、lock\u002Funlock、open\u002Fclose","：用智能指針、lock_guard、fstream。",[117,2401,2402,2405],{},[103,2403,2404],{},"RAII 對象必須在棧上","：利用作用域自動觸發析構。",[117,2407,2408,2411,2412,2414],{},[103,2409,2410],{},"析構函數永遠不要拋異常","：標記 ",[25,2413,2265],{},"。",[117,2416,2417,2420],{},[103,2418,2419],{},"理解 RAII 就理解了 C++ 的核心設計哲學","：後續智能指針、併發編程都建立在 RAII 之上。",[117,2422,2423,2426,2427,2430],{},[103,2424,2425],{},"用作用域控制資源持有時間","：想早點釋放資源，就把 RAII 對象放進更小的 ",[25,2428,2429],{},"{}"," 作用域。",[10,2432,2433],{"id":2433},"小結",[114,2435,2436,2439,2442,2451,2457,2460],{},[117,2437,2438],{},"RAII = 資源獲取即初始化，是 C++ 最核心的資源管理慣用法。",[117,2440,2441],{},"構造時獲取資源，析構時釋放資源，離開作用域保證釋放。",[117,2443,2444,2185,2446,2185,2448,2450],{},[25,2445,285],{},[25,2447,313],{},[25,2449,341],{}," 都是 RAII。",[117,2452,2453,2454,2456],{},"多個 ",[25,2455,2208],{},"、異常、複雜分支下，RAII 的價值最明顯。",[117,2458,2459],{},"永遠不要在析構函數中拋異常。",[117,2461,2462],{},"理解了 RAII，就爲理解智能指針和併發編程打好了基礎。",[2464,2465,2466],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":23,"searchDepth":68,"depth":68,"links":2468},[2469,2470,2471,2472,2473,2474,2475,2481,2482,2483,2484,2485],{"id":12,"depth":68,"text":12},{"id":109,"depth":68,"text":109},{"id":145,"depth":68,"text":146},{"id":152,"depth":68,"text":152},{"id":170,"depth":68,"text":170},{"id":253,"depth":68,"text":254},{"id":366,"depth":68,"text":366,"children":2476},[2477,2478,2479,2480],{"id":370,"depth":75,"text":371},{"id":885,"depth":75,"text":886},{"id":1265,"depth":75,"text":1266},{"id":1544,"depth":75,"text":1545},{"id":873,"depth":68,"text":873},{"id":2112,"depth":68,"text":2112},{"id":2217,"depth":68,"text":2217},{"id":2384,"depth":68,"text":2384},{"id":2433,"depth":68,"text":2433},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","2000-0800","2023-10-05","wiki\u002F2023-10-05-cplusplus-jiao-xue","zh-hant:2023-10-05-cplusplus-jiao-xue","\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII",false,null,"zh-Hant","zh-hant",{},{"title":5,"description":23},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","a-_HVCvc3Wju9G8pKjO42qYAqlV61jumMzI68nSbOrY",[2505,2511,2516,2521,2526,2531,2536,2541,2546,2551,2556,2561,2566,2571,2576,2581,2586,2591,2596,2601,2606,2611,2616,2621,2626,2631,2636,2641,2646,2651,2656,2661,2666,2671,2676,2681,2686,2691,2696,2701,2706,2711,2716,2721,2726,2727,2732,2737,2742,2747,2752,2757,2762,2767,2772,2777,2782,2787,2792,2797,2802,2807,2812,2817,2822,2827,2832,2837,2842,2847,2852,2857,2862,2867,2872,2877,2882,2887,2892,2897,2902,2907],{"path":2506,"stem":2507,"title":2508,"date":2488,"chapterOrder":2509,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++開發環境搭建與測試","0100",0,{"path":2512,"stem":2513,"title":2514,"date":2488,"chapterOrder":2515,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基礎初識","0200",{"path":2517,"stem":2518,"title":2519,"date":2488,"chapterOrder":2520,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","數據類型與數據存放","0300",{"path":2522,"stem":2523,"title":2524,"date":2488,"chapterOrder":2525,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","輸入輸出","0400",{"path":2527,"stem":2528,"title":2529,"date":2488,"chapterOrder":2530,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","運算符","0500",{"path":2532,"stem":2533,"title":2534,"date":2488,"chapterOrder":2535,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程結構","0600",{"path":2537,"stem":2538,"title":2539,"date":2488,"chapterOrder":2540,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","數組","0700",{"path":2542,"stem":2543,"title":2544,"date":2488,"chapterOrder":2545,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函數與頭文件","0800",{"path":2547,"stem":2548,"title":2549,"date":2488,"chapterOrder":2550,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指針","0900",{"path":2552,"stem":2553,"title":2554,"date":2488,"chapterOrder":2555,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","結構體與共用體","1000",{"path":2557,"stem":2558,"title":2559,"date":2488,"chapterOrder":2560,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","內存分區與生命週期","1100",{"path":2562,"stem":2563,"title":2564,"date":2488,"chapterOrder":2565,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用","1200",{"path":2567,"stem":2568,"title":2569,"date":2488,"chapterOrder":2570,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao-yu-ming-ming-kong-jian","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高与命名空间","函數提高與命名空間","1300",{"path":2572,"stem":2573,"title":2574,"date":2488,"chapterOrder":2575,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封裝","1400-0100",{"path":2577,"stem":2578,"title":2579,"date":2488,"chapterOrder":2580,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","對象初始化和清理","1400-0200",{"path":2582,"stem":2583,"title":2584,"date":2488,"chapterOrder":2585,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","對象模型與this指針","1400-0300",{"path":2587,"stem":2588,"title":2589,"date":2488,"chapterOrder":2590,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元與運算符重載","1400-0400",{"path":2592,"stem":2593,"title":2594,"date":2488,"chapterOrder":2595,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","繼承","1400-0500",{"path":2597,"stem":2598,"title":2599,"date":2488,"chapterOrder":2600,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多態","1400-0600",{"path":2602,"stem":2603,"title":2604,"date":2488,"chapterOrder":2605,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","類和對象","1400",{"path":2607,"stem":2608,"title":2609,"date":2488,"chapterOrder":2610,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作","1500",{"path":2612,"stem":2613,"title":2614,"date":2488,"chapterOrder":2615,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","異常處理","1600",{"path":2617,"stem":2618,"title":2619,"date":2488,"chapterOrder":2620,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板","1700",{"path":2622,"stem":2623,"title":2624,"date":2488,"chapterOrder":2625,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初識","1800-0100",{"path":2627,"stem":2628,"title":2629,"date":2488,"chapterOrder":2630,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array","1800-0200",{"path":2632,"stem":2633,"title":2634,"date":2488,"chapterOrder":2635,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器","1800-0300",{"path":2637,"stem":2638,"title":2639,"date":2488,"chapterOrder":2640,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器","1800-0400",{"path":2642,"stem":2643,"title":2644,"date":2488,"chapterOrder":2645,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器","1800-0500",{"path":2647,"stem":2648,"title":2649,"date":2488,"chapterOrder":2650,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器","1800-0600",{"path":2652,"stem":2653,"title":2654,"date":2488,"chapterOrder":2655,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器","1800-0700",{"path":2657,"stem":2658,"title":2659,"date":2488,"chapterOrder":2660,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器","1800-0800",{"path":2662,"stem":2663,"title":2664,"date":2488,"chapterOrder":2665,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器","1800-0900",{"path":2667,"stem":2668,"title":2669,"date":2488,"chapterOrder":2670,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器","1800-1000",{"path":2672,"stem":2673,"title":2674,"date":2488,"chapterOrder":2675,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函數對象與謂詞","1800-1100",{"path":2677,"stem":2678,"title":2679,"date":2488,"chapterOrder":2680,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法","1800-1200",{"path":2682,"stem":2683,"title":2684,"date":2488,"chapterOrder":2685,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高編程","1800",{"path":2687,"stem":2688,"title":2689,"date":2488,"chapterOrder":2690,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++類型轉換","1900",{"path":2692,"stem":2693,"title":2694,"date":2488,"chapterOrder":2695,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto","2000-0100",{"path":2697,"stem":2698,"title":2699,"date":2488,"chapterOrder":2700,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr","nullptr","2000-0200",{"path":2702,"stem":2703,"title":2704,"date":2488,"chapterOrder":2705,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using","2000-0300",{"path":2707,"stem":2708,"title":2709,"date":2488,"chapterOrder":2710,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class","enum class","2000-0400",{"path":2712,"stem":2713,"title":2714,"date":2488,"chapterOrder":2715,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","範圍 for 循環","2000-0500",{"path":2717,"stem":2718,"title":2719,"date":2488,"chapterOrder":2720,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","結構化綁定","2000-0600",{"path":2722,"stem":2723,"title":2724,"date":2488,"chapterOrder":2725,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr","2000-0700",{"path":2486,"stem":2502,"title":5,"date":2488,"chapterOrder":2487,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},{"path":2728,"stem":2729,"title":2730,"date":2488,"chapterOrder":2731,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指針","2000-0900",{"path":2733,"stem":2734,"title":2735,"date":2488,"chapterOrder":2736,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移動語義","2000-1000",{"path":2738,"stem":2739,"title":2740,"date":2488,"chapterOrder":2741,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表達式","2000-1100",{"path":2743,"stem":2744,"title":2745,"date":2488,"chapterOrder":2746,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function","2000-1200",{"path":2748,"stem":2749,"title":2750,"date":2488,"chapterOrder":2751,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind","2000-1300",{"path":2753,"stem":2754,"title":2755,"date":2488,"chapterOrder":2756,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional","2000-1400",{"path":2758,"stem":2759,"title":2760,"date":2488,"chapterOrder":2761,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant","2000-1500",{"path":2763,"stem":2764,"title":2765,"date":2488,"chapterOrder":2766,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span","2000-1600",{"path":2768,"stem":2769,"title":2770,"date":2488,"chapterOrder":2771,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print","2000-1700",{"path":2773,"stem":2774,"title":2775,"date":2488,"chapterOrder":2776,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono","2000-1800",{"path":2778,"stem":2779,"title":2780,"date":2488,"chapterOrder":2781,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-std-thread","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-std-thread","std::thread 與 join","2000-1900-0100",{"path":2783,"stem":2784,"title":2785,"date":2488,"chapterOrder":2786,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-mutex-lock-guard","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-mutex-lock-guard","mutex 與 lock_guard","2000-1900-0200",{"path":2788,"stem":2789,"title":2790,"date":2488,"chapterOrder":2791,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-std-atomic","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-std-atomic","std::atomic","2000-1900-0300",{"path":2793,"stem":2794,"title":2795,"date":2488,"chapterOrder":2796,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0400-condition-variable","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0400-condition-variable","condition_variable","2000-1900-0400",{"path":2798,"stem":2799,"title":2800,"date":2488,"chapterOrder":2801,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bian-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发编程","併發編程","2000-1900",{"path":2803,"stem":2804,"title":2805,"date":2488,"chapterOrder":2806,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem","2000-2000",{"path":2808,"stem":2809,"title":2810,"date":2488,"chapterOrder":2811,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 簡介","2000-2100",{"path":2813,"stem":2814,"title":2815,"date":2488,"chapterOrder":2816,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","現代C++","2000",{"path":2818,"stem":2819,"title":2820,"date":2488,"chapterOrder":2821,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定時器與異步 IO","2100-0100-0100",{"path":2823,"stem":2824,"title":2825,"date":2488,"chapterOrder":2826,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基礎","2100-0100-0200",{"path":2828,"stem":2829,"title":2830,"date":2488,"chapterOrder":2831,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信","2100-0100-0300",{"path":2833,"stem":2834,"title":2835,"date":2488,"chapterOrder":2836,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信","2100-0100-0400",{"path":2838,"stem":2839,"title":2840,"date":2488,"chapterOrder":2841,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信","2100-0100-0500",{"path":2843,"stem":2844,"title":2845,"date":2488,"chapterOrder":2846,"chapterDepth":68,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","機器人工程寫法與 ROS2 集成","2100-0100-0600",{"path":2848,"stem":2849,"title":2850,"date":2488,"chapterOrder":2851,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio異步IO庫","2100-0100",{"path":2853,"stem":2854,"title":2855,"date":2488,"chapterOrder":2856,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen線性代數庫","2100-0200",{"path":2858,"stem":2859,"title":2860,"date":2488,"chapterOrder":2861,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV計算機視覺庫","2100-0300",{"path":2863,"stem":2864,"title":2865,"date":2488,"chapterOrder":2866,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL點雲庫","2100-0400",{"path":2868,"stem":2869,"title":2870,"date":2488,"chapterOrder":2871,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李羣李代數庫","2100-0500",{"path":2873,"stem":2874,"title":2875,"date":2488,"chapterOrder":2876,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用庫學習","2100",{"path":2878,"stem":2879,"title":2880,"date":2488,"chapterOrder":2881,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets與構建安裝","2200-0100",{"path":2883,"stem":2884,"title":2885,"date":2488,"chapterOrder":2886,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","頂層CMake與公共編譯選項","2200-0200",{"path":2888,"stem":2889,"title":2890,"date":2488,"chapterOrder":2891,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src與lib模塊CMake詳解","2200-0300",{"path":2893,"stem":2894,"title":2895,"date":2488,"chapterOrder":2896,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方庫依賴寫法","2200-0400",{"path":2898,"stem":2899,"title":2900,"date":2488,"chapterOrder":2901,"chapterDepth":31,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板擴展與常見問題","2200-0500",{"path":2903,"stem":2904,"title":2905,"date":2488,"chapterOrder":2906,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":2495},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板","2200",{"path":2491,"stem":2908,"title":2909,"date":2488,"chapterOrder":2496,"chapterDepth":2510,"docKey":2490,"docRoot":2491,"docTitle":2492,"isWikiDoc":207,"isWikiIndex":207},"_i18n\u002Fzh-hant\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",{"variants":2911},[2912,2915,2916,2919,2922],{"path":2913,"localeSlug":2914,"i18nKey":2494},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","en-us",{"path":2486,"localeSlug":2498,"i18nKey":2494},{"path":2917,"localeSlug":2918,"i18nKey":2494},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-hk",{"path":2920,"localeSlug":2921,"i18nKey":2494},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-tw",{"path":2923,"localeSlug":2924,"i18nKey":2494},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","zh-cn",[2913,2501,2486,2501,2917,2501,2920,2501,2923,2501],1784646812838]