[{"data":1,"prerenderedAt":3722},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan":3,"wiki-doc-items-2023-10-05-cplusplus-jiao-xue":3164,"wiki:author-members":3710},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":3151,"chapterOrder":3152,"date":3153,"description":86,"docKey":3154,"docRoot":3155,"docTitle":3156,"extension":3157,"isWikiDoc":527,"isWikiIndex":3158,"meta":3159,"navigation":527,"path":3160,"seo":3161,"stem":3162,"wikiDepth":93,"__hash__":3163},"wiki\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换.md","C++类型转换",[7],"董佳辉",{"type":9,"value":10,"toc":3122},"minimark",[11,15,19,54,64,67,70,73,77,80,124,148,151,182,193,196,199,230,244,247,255,258,276,279,282,369,372,376,379,382,385,406,417,420,491,497,500,504,512,764,770,778,782,787,1148,1152,1158,1174,1183,1198,1339,1343,1349,1362,1391,1403,1406,1415,1420,1423,1441,1456,1472,1475,1491,1494,1499,1512,1521,1583,1586,1591,1598,1603,1606,1611,1618,1987,1992,1998,2001,2004,2034,2045,2059,2065,2071,2074,2080,2083,2110,2116,2122,2125,2131,2138,2141,2147,2150,2153,2194,2206,2209,2226,2235,2237,2243,2246,2277,2287,2295,2307,2310,2319,2322,2328,2331,2364,2372,2378,2384,2387,2393,2405,2408,2425,2428,2434,2460,2462,2468,2484,2486,2492,2502,2504,2510,2513,2529,2532,2625,2629,2640,2643,2692,2695,2748,2754,2757,2786,2798,2804,2808,2811,2837,2843,2846,2868,2874,2886,2889,2893,2937,2943,2948,2952,2998,3004,3008,3046,3052,3055,3085,3088,3115,3118],[12,13,14],"h2",{"id":14},"本节解决什么问题",[16,17,18],"p",{},"C++ 中经常会遇到“把一种类型当成另一种类型使用”的场景，例如：",[20,21,22,35,41,44,51],"ul",{},[23,24,25,26,30,31,34],"li",{},"把 ",[27,28,29],"code",{},"double"," 转成 ",[27,32,33],{},"int","。",[23,36,25,37,40],{},[27,38,39],{},"enum class"," 转成整数。",[23,42,43],{},"把基类指针安全地转成派生类指针。",[23,45,46,47,50],{},"临时去掉 ",[27,48,49],{},"const"," 限定，适配旧接口。",[23,52,53],{},"在底层代码里把指针、整数、字节视图互相转换。",[16,55,56,57,60,61,63],{},"C 风格强转写法 ",[27,58,59],{},"(目标类型)表达式"," 能做很多事，但问题也在这里：它太“万能”，读代码的人很难一眼看出这次转换到底是普通数值转换、继承层级转换、去掉 ",[27,62,49],{},"，还是危险的底层重解释。",[16,65,66],{},"C++ 提供了四个更明确的类型转换运算符，让转换意图写在代码里。",[12,68,69],{"id":69},"隐式转换和显式转换",[16,71,72],{},"类型转换可以分为隐式转换和显式转换。",[74,75,76],"h3",{"id":76},"隐式转换",[16,78,79],{},"隐式转换是由编译器自动完成的转换，代码中不需要写出转换操作。例如：",[81,82,87],"pre",{"className":83,"code":84,"language":85,"meta":86,"style":86},"language-cpp shiki shiki-themes github-light github-dark","int count = 10;\ndouble result = count;\n","cpp","",[27,88,89,111],{"__ignoreMap":86},[90,91,94,97,101,104,108],"span",{"class":92,"line":93},"line",1,[90,95,33],{"class":96},"szBVR",[90,98,100],{"class":99},"sVt8B"," count ",[90,102,103],{"class":96},"=",[90,105,107],{"class":106},"sj4cs"," 10",[90,109,110],{"class":99},";\n",[90,112,114,116,119,121],{"class":92,"line":113},2,[90,115,29],{"class":96},[90,117,118],{"class":99}," result ",[90,120,103],{"class":96},[90,122,123],{"class":99}," count;\n",[16,125,126,127,130,131,133,134,130,137,139,140,143,144,147],{},"这里 ",[27,128,129],{},"count"," 是 ",[27,132,33],{},"，而 ",[27,135,136],{},"result",[27,138,29],{},"。编译器会自动把整数 ",[27,141,142],{},"10"," 转换成浮点数 ",[27,145,146],{},"10.0","，这就是隐式转换。",[16,149,150],{},"隐式转换写起来方便，但有些转换可能造成数据丢失：",[81,152,154],{"className":83,"code":153,"language":85,"meta":86,"style":86},"double price = 19.8;\nint whole_price = price;\n",[27,155,156,170],{"__ignoreMap":86},[90,157,158,160,163,165,168],{"class":92,"line":93},[90,159,29],{"class":96},[90,161,162],{"class":99}," price ",[90,164,103],{"class":96},[90,166,167],{"class":106}," 19.8",[90,169,110],{"class":99},[90,171,172,174,177,179],{"class":92,"line":113},[90,173,33],{"class":96},[90,175,176],{"class":99}," whole_price ",[90,178,103],{"class":96},[90,180,181],{"class":99}," price;\n",[16,183,184,185,188,189,192],{},"这段代码通常可以通过编译，但 ",[27,186,187],{},"whole_price"," 得到的是 ",[27,190,191],{},"19","，小数部分会被丢弃。因为转换没有明确写出来，阅读代码时也容易忽略它。",[74,194,195],{"id":195},"显式转换",[16,197,198],{},"显式转换是程序员在代码中明确要求进行的转换。例如：",[81,200,202],{"className":83,"code":201,"language":85,"meta":86,"style":86},"double price = 19.8;\nint whole_price = static_cast\u003Cint>(price);\n",[27,203,204,216],{"__ignoreMap":86},[90,205,206,208,210,212,214],{"class":92,"line":93},[90,207,29],{"class":96},[90,209,162],{"class":99},[90,211,103],{"class":96},[90,213,167],{"class":106},[90,215,110],{"class":99},[90,217,218,220,222,224,227],{"class":92,"line":113},[90,219,33],{"class":96},[90,221,176],{"class":99},[90,223,103],{"class":96},[90,225,226],{"class":96}," static_cast\u003Cint>",[90,228,229],{"class":99},"(price);\n",[16,231,232,233,236,237,240,241,243],{},"这里的 ",[27,234,235],{},"static_cast\u003Cint>"," 明确表示：程序员知道 ",[27,238,239],{},"price"," 会被转换成 ",[27,242,33],{},"，也接受小数部分被丢弃。",[16,245,246],{},"两者的区别可以简单理解为：",[20,248,249,252],{},[23,250,251],{},"隐式转换：编译器根据上下文自动转换。",[23,253,254],{},"显式转换：程序员在代码中明确写出要转换成什么类型。",[16,256,257],{},"隐式转换并不一定不安全，显式转换也不代表一定安全。显式写出转换的主要价值，是让转换意图更清楚，并让编译器按照指定的转换方式进行检查。",[16,259,260,261,264,265,264,268,271,272,275],{},"下面介绍的 ",[27,262,263],{},"static_cast","、",[27,266,267],{},"dynamic_cast",[27,269,270],{},"const_cast"," 和 ",[27,273,274],{},"reinterpret_cast","，都是 C++ 提供的显式类型转换。",[12,277,278],{"id":278},"这个特性是什么",[16,280,281],{},"C++ 的四种显式类型转换是：",[283,284,285,302],"table",{},[286,287,288],"thead",{},[289,290,291,296,299],"tr",{},[292,293,295],"th",{"align":294},"left","转换方式",[292,297,298],{"align":294},"主要用途",[292,300,301],{"align":294},"安全程度",[303,304,305,319,336,356],"tbody",{},[289,306,307,313,316],{},[308,309,310],"td",{"align":294},[27,311,312],{},"static_cast\u003CT>(expr)",[308,314,315],{"align":294},"常规类型转换，如数值、枚举、父子类上行转换",[308,317,318],{"align":294},"常用，编译期检查",[289,320,321,326,329],{},[308,322,323],{"align":294},[27,324,325],{},"dynamic_cast\u003CT>(expr)",[308,327,328],{"align":294},"多态类型的安全向下转换",[308,330,331,332,335],{"align":294},"运行期检查，失败返回 ",[27,333,334],{},"nullptr"," 或抛异常",[289,337,338,343,353],{},[308,339,340],{"align":294},[27,341,342],{},"const_cast\u003CT>(expr)",[308,344,345,346,348,349,352],{"align":294},"添加或移除 ",[27,347,49],{}," \u002F ",[27,350,351],{},"volatile"," 限定",[308,354,355],{"align":294},"要非常克制",[289,357,358,363,366],{},[308,359,360],{"align":294},[27,361,362],{},"reinterpret_cast\u003CT>(expr)",[308,364,365],{"align":294},"底层二进制重解释，如指针和整数互转",[308,367,368],{"align":294},"最危险，少用",[16,370,371],{},"原则：能不用强转就不用；必须强转时，优先选择语义最窄、最能说明意图的转换。",[12,373,375],{"id":374},"c-标准版本","C++ 标准版本",[16,377,378],{},"C++98 就已经提供这四种转换写法，实际工程中依然推荐使用它们替代 C 风格强转。",[12,380,381],{"id":381},"需要的头文件",[16,383,384],{},"类型转换本身不需要额外头文件。示例代码使用到的库需要对应头文件，例如：",[81,386,388],{"className":83,"code":387,"language":85,"meta":86,"style":86},"#include \u003Ccstdint>\n#include \u003Ciostream>\n",[27,389,390,399],{"__ignoreMap":86},[90,391,392,395],{"class":92,"line":93},[90,393,394],{"class":96},"#include",[90,396,398],{"class":397},"sZZnC"," \u003Ccstdint>\n",[90,400,401,403],{"class":92,"line":113},[90,402,394],{"class":96},[90,404,405],{"class":397}," \u003Ciostream>\n",[16,407,408,412,413,416],{},[409,410,411],"strong",{},"运行结果："," 此代码块不含 ",[27,414,415],{},"main"," 函数，是语法、接口或分文件示例，不能独立运行，因此没有终端输出。",[12,418,419],{"id":419},"基本语法",[81,421,423],{"className":83,"code":422,"language":85,"meta":86,"style":86},"目标类型 value = static_cast\u003C目标类型>(表达式);\n目标类型 value = dynamic_cast\u003C目标类型>(表达式);\n目标类型 value = const_cast\u003C目标类型>(表达式);\n目标类型 value = reinterpret_cast\u003C目标类型>(表达式);\n",[27,424,425,444,459,475],{"__ignoreMap":86},[90,426,427,430,432,435,438,441],{"class":92,"line":93},[90,428,429],{"class":99},"目标类型 value ",[90,431,103],{"class":96},[90,433,434],{"class":96}," static_cast\u003C",[90,436,437],{"class":99},"目标类型",[90,439,440],{"class":96},">",[90,442,443],{"class":99},"(表达式);\n",[90,445,446,448,450,453,455,457],{"class":92,"line":113},[90,447,429],{"class":99},[90,449,103],{"class":96},[90,451,452],{"class":96}," dynamic_cast\u003C",[90,454,437],{"class":99},[90,456,440],{"class":96},[90,458,443],{"class":99},[90,460,462,464,466,469,471,473],{"class":92,"line":461},3,[90,463,429],{"class":99},[90,465,103],{"class":96},[90,467,468],{"class":96}," const_cast\u003C",[90,470,437],{"class":99},[90,472,440],{"class":96},[90,474,443],{"class":99},[90,476,478,480,482,485,487,489],{"class":92,"line":477},4,[90,479,429],{"class":99},[90,481,103],{"class":96},[90,483,484],{"class":96}," reinterpret_cast\u003C",[90,486,437],{"class":99},[90,488,440],{"class":96},[90,490,443],{"class":99},[16,492,493,412,495,416],{},[409,494,411],{},[27,496,415],{},[12,498,499],{"id":499},"示例代码",[74,501,503],{"id":502},"示例-1static_cast-处理常规转换","示例 1：static_cast 处理常规转换",[16,505,506,508,509,511],{},[27,507,263],{}," 适合明确、常规、编译期能检查的转换。比如数值转换、",[27,510,39],{}," 转整数、父类指针指向子类对象等。",[81,513,515],{"className":83,"code":514,"language":85,"meta":86,"style":86},"#include \u003Ciostream>\n\nenum class Status\n{\n    ok = 200,\n    not_found = 404\n};\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    double score = 89.7;\n    int integer_score = static_cast\u003Cint>(score);\n\n    Status status = Status::not_found;\n    int status_code = static_cast\u003Cint>(status);\n\n    std::cout \u003C\u003C \"integer_score = \" \u003C\u003C integer_score \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"status_code = \" \u003C\u003C status_code \u003C\u003C \"\\n\";\n\n    \u002F\u002F 返回 0 表示程序正常结束。\n    return 0;\n}\n",[27,516,517,523,529,541,546,561,572,578,583,594,599,606,622,638,643,657,672,677,710,736,741,747,758],{"__ignoreMap":86},[90,518,519,521],{"class":92,"line":93},[90,520,394],{"class":96},[90,522,405],{"class":397},[90,524,525],{"class":92,"line":113},[90,526,528],{"emptyLinePlaceholder":527},true,"\n",[90,530,531,534,537],{"class":92,"line":461},[90,532,533],{"class":96},"enum",[90,535,536],{"class":96}," class",[90,538,540],{"class":539},"sScJk"," Status\n",[90,542,543],{"class":92,"line":477},[90,544,545],{"class":99},"{\n",[90,547,549,552,555,558],{"class":92,"line":548},5,[90,550,551],{"class":106},"    ok",[90,553,554],{"class":96}," =",[90,556,557],{"class":106}," 200",[90,559,560],{"class":99},",\n",[90,562,564,567,569],{"class":92,"line":563},6,[90,565,566],{"class":106},"    not_found",[90,568,554],{"class":96},[90,570,571],{"class":106}," 404\n",[90,573,575],{"class":92,"line":574},7,[90,576,577],{"class":99},"};\n",[90,579,581],{"class":92,"line":580},8,[90,582,528],{"emptyLinePlaceholder":527},[90,584,586,588,591],{"class":92,"line":585},9,[90,587,33],{"class":96},[90,589,590],{"class":539}," main",[90,592,593],{"class":99},"()\n",[90,595,597],{"class":92,"line":596},10,[90,598,545],{"class":99},[90,600,602],{"class":92,"line":601},11,[90,603,605],{"class":604},"sJ8bj","    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n",[90,607,609,612,615,617,620],{"class":92,"line":608},12,[90,610,611],{"class":96},"    double",[90,613,614],{"class":99}," score ",[90,616,103],{"class":96},[90,618,619],{"class":106}," 89.7",[90,621,110],{"class":99},[90,623,625,628,631,633,635],{"class":92,"line":624},13,[90,626,627],{"class":96},"    int",[90,629,630],{"class":99}," integer_score ",[90,632,103],{"class":96},[90,634,226],{"class":96},[90,636,637],{"class":99},"(score);\n",[90,639,641],{"class":92,"line":640},14,[90,642,528],{"emptyLinePlaceholder":527},[90,644,646,649,651,654],{"class":92,"line":645},15,[90,647,648],{"class":99},"    Status status ",[90,650,103],{"class":96},[90,652,653],{"class":539}," Status",[90,655,656],{"class":99},"::not_found;\n",[90,658,660,662,665,667,669],{"class":92,"line":659},16,[90,661,627],{"class":96},[90,663,664],{"class":99}," status_code ",[90,666,103],{"class":96},[90,668,226],{"class":96},[90,670,671],{"class":99},"(status);\n",[90,673,675],{"class":92,"line":674},17,[90,676,528],{"emptyLinePlaceholder":527},[90,678,680,683,686,689,692,695,697,699,702,705,708],{"class":92,"line":679},18,[90,681,682],{"class":539},"    std",[90,684,685],{"class":99},"::cout ",[90,687,688],{"class":96},"\u003C\u003C",[90,690,691],{"class":397}," \"integer_score = \"",[90,693,694],{"class":96}," \u003C\u003C",[90,696,630],{"class":99},[90,698,688],{"class":96},[90,700,701],{"class":397}," \"",[90,703,704],{"class":106},"\\n",[90,706,707],{"class":397},"\"",[90,709,110],{"class":99},[90,711,713,715,717,719,722,724,726,728,730,732,734],{"class":92,"line":712},19,[90,714,682],{"class":539},[90,716,685],{"class":99},[90,718,688],{"class":96},[90,720,721],{"class":397}," \"status_code = \"",[90,723,694],{"class":96},[90,725,664],{"class":99},[90,727,688],{"class":96},[90,729,701],{"class":397},[90,731,704],{"class":106},[90,733,707],{"class":397},[90,735,110],{"class":99},[90,737,739],{"class":92,"line":738},20,[90,740,528],{"emptyLinePlaceholder":527},[90,742,744],{"class":92,"line":743},21,[90,745,746],{"class":604},"    \u002F\u002F 返回 0 表示程序正常结束。\n",[90,748,750,753,756],{"class":92,"line":749},22,[90,751,752],{"class":96},"    return",[90,754,755],{"class":106}," 0",[90,757,110],{"class":99},[90,759,761],{"class":92,"line":760},23,[90,762,763],{"class":99},"}\n",[16,765,766,769],{},[409,767,768],{},"运行结果","：",[81,771,776],{"className":772,"code":774,"language":775,"meta":86},[773],"language-text","integer_score = 89\nstatus_code = 404\n","text",[27,777,774],{"__ignoreMap":86},[74,779,781],{"id":780},"示例-2dynamic_cast-安全判断真实对象类型","示例 2：dynamic_cast 安全判断真实对象类型",[16,783,784,786],{},[27,785,267],{}," 常用于多态基类。向下转换时，它会在运行期检查对象真实类型。",[81,788,790],{"className":83,"code":789,"language":85,"meta":86,"style":86},"#include \u003Ciostream>\n\nstruct Animal\n{\n    virtual ~Animal() = default;\n};\n\nstruct Cat : Animal\n{\n    void meow() const\n    {\n        std::cout \u003C\u003C \"cat: meow\\n\";\n    }\n};\n\nstruct Dog : Animal\n{\n};\n\nvoid try_meow(Animal* animal)\n{\n    Cat* cat = dynamic_cast\u003CCat*>(animal);\n\n    if (cat != nullptr)\n    {\n        cat->meow();\n    }\n    else\n    {\n        std::cout \u003C\u003C \"not a cat\\n\";\n    }\n}\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    Cat cat;\n    Dog dog;\n\n    try_meow(&cat);\n    try_meow(&dog);\n\n    \u002F\u002F 返回 0 表示程序正常结束。\n    return 0;\n}\n",[27,791,792,798,802,810,814,832,836,840,850,854,867,872,890,895,899,903,912,916,920,924,948,952,975,979,996,1001,1013,1018,1024,1029,1047,1052,1057,1062,1071,1076,1081,1087,1093,1098,1112,1124,1129,1134,1143],{"__ignoreMap":86},[90,793,794,796],{"class":92,"line":93},[90,795,394],{"class":96},[90,797,405],{"class":397},[90,799,800],{"class":92,"line":113},[90,801,528],{"emptyLinePlaceholder":527},[90,803,804,807],{"class":92,"line":461},[90,805,806],{"class":96},"struct",[90,808,809],{"class":539}," Animal\n",[90,811,812],{"class":92,"line":477},[90,813,545],{"class":99},[90,815,816,819,822,825,827,830],{"class":92,"line":548},[90,817,818],{"class":96},"    virtual",[90,820,821],{"class":539}," ~Animal",[90,823,824],{"class":99},"() ",[90,826,103],{"class":96},[90,828,829],{"class":96}," default",[90,831,110],{"class":99},[90,833,834],{"class":92,"line":563},[90,835,577],{"class":99},[90,837,838],{"class":92,"line":574},[90,839,528],{"emptyLinePlaceholder":527},[90,841,842,844,847],{"class":92,"line":580},[90,843,806],{"class":96},[90,845,846],{"class":539}," Cat",[90,848,849],{"class":99}," : Animal\n",[90,851,852],{"class":92,"line":585},[90,853,545],{"class":99},[90,855,856,859,862,864],{"class":92,"line":596},[90,857,858],{"class":96},"    void",[90,860,861],{"class":539}," meow",[90,863,824],{"class":99},[90,865,866],{"class":96},"const\n",[90,868,869],{"class":92,"line":601},[90,870,871],{"class":99},"    {\n",[90,873,874,877,879,881,884,886,888],{"class":92,"line":608},[90,875,876],{"class":539},"        std",[90,878,685],{"class":99},[90,880,688],{"class":96},[90,882,883],{"class":397}," \"cat: meow",[90,885,704],{"class":106},[90,887,707],{"class":397},[90,889,110],{"class":99},[90,891,892],{"class":92,"line":624},[90,893,894],{"class":99},"    }\n",[90,896,897],{"class":92,"line":640},[90,898,577],{"class":99},[90,900,901],{"class":92,"line":645},[90,902,528],{"emptyLinePlaceholder":527},[90,904,905,907,910],{"class":92,"line":659},[90,906,806],{"class":96},[90,908,909],{"class":539}," Dog",[90,911,849],{"class":99},[90,913,914],{"class":92,"line":674},[90,915,545],{"class":99},[90,917,918],{"class":92,"line":679},[90,919,577],{"class":99},[90,921,922],{"class":92,"line":712},[90,923,528],{"emptyLinePlaceholder":527},[90,925,926,929,932,935,938,941,945],{"class":92,"line":738},[90,927,928],{"class":96},"void",[90,930,931],{"class":539}," try_meow",[90,933,934],{"class":99},"(",[90,936,937],{"class":539},"Animal",[90,939,940],{"class":96},"*",[90,942,944],{"class":943},"s4XuR"," animal",[90,946,947],{"class":99},")\n",[90,949,950],{"class":92,"line":743},[90,951,545],{"class":99},[90,953,954,957,959,962,964,966,969,972],{"class":92,"line":749},[90,955,956],{"class":99},"    Cat",[90,958,940],{"class":96},[90,960,961],{"class":99}," cat ",[90,963,103],{"class":96},[90,965,452],{"class":96},[90,967,968],{"class":99},"Cat",[90,970,971],{"class":96},"*>",[90,973,974],{"class":99},"(animal);\n",[90,976,977],{"class":92,"line":760},[90,978,528],{"emptyLinePlaceholder":527},[90,980,982,985,988,991,994],{"class":92,"line":981},24,[90,983,984],{"class":96},"    if",[90,986,987],{"class":99}," (cat ",[90,989,990],{"class":96},"!=",[90,992,993],{"class":106}," nullptr",[90,995,947],{"class":99},[90,997,999],{"class":92,"line":998},25,[90,1000,871],{"class":99},[90,1002,1004,1007,1010],{"class":92,"line":1003},26,[90,1005,1006],{"class":99},"        cat->",[90,1008,1009],{"class":539},"meow",[90,1011,1012],{"class":99},"();\n",[90,1014,1016],{"class":92,"line":1015},27,[90,1017,894],{"class":99},[90,1019,1021],{"class":92,"line":1020},28,[90,1022,1023],{"class":96},"    else\n",[90,1025,1027],{"class":92,"line":1026},29,[90,1028,871],{"class":99},[90,1030,1032,1034,1036,1038,1041,1043,1045],{"class":92,"line":1031},30,[90,1033,876],{"class":539},[90,1035,685],{"class":99},[90,1037,688],{"class":96},[90,1039,1040],{"class":397}," \"not a cat",[90,1042,704],{"class":106},[90,1044,707],{"class":397},[90,1046,110],{"class":99},[90,1048,1050],{"class":92,"line":1049},31,[90,1051,894],{"class":99},[90,1053,1055],{"class":92,"line":1054},32,[90,1056,763],{"class":99},[90,1058,1060],{"class":92,"line":1059},33,[90,1061,528],{"emptyLinePlaceholder":527},[90,1063,1065,1067,1069],{"class":92,"line":1064},34,[90,1066,33],{"class":96},[90,1068,590],{"class":539},[90,1070,593],{"class":99},[90,1072,1074],{"class":92,"line":1073},35,[90,1075,545],{"class":99},[90,1077,1079],{"class":92,"line":1078},36,[90,1080,605],{"class":604},[90,1082,1084],{"class":92,"line":1083},37,[90,1085,1086],{"class":99},"    Cat cat;\n",[90,1088,1090],{"class":92,"line":1089},38,[90,1091,1092],{"class":99},"    Dog dog;\n",[90,1094,1096],{"class":92,"line":1095},39,[90,1097,528],{"emptyLinePlaceholder":527},[90,1099,1101,1104,1106,1109],{"class":92,"line":1100},40,[90,1102,1103],{"class":539},"    try_meow",[90,1105,934],{"class":99},[90,1107,1108],{"class":96},"&",[90,1110,1111],{"class":99},"cat);\n",[90,1113,1115,1117,1119,1121],{"class":92,"line":1114},41,[90,1116,1103],{"class":539},[90,1118,934],{"class":99},[90,1120,1108],{"class":96},[90,1122,1123],{"class":99},"dog);\n",[90,1125,1127],{"class":92,"line":1126},42,[90,1128,528],{"emptyLinePlaceholder":527},[90,1130,1132],{"class":92,"line":1131},43,[90,1133,746],{"class":604},[90,1135,1137,1139,1141],{"class":92,"line":1136},44,[90,1138,752],{"class":96},[90,1140,755],{"class":106},[90,1142,110],{"class":99},[90,1144,1146],{"class":92,"line":1145},45,[90,1147,763],{"class":99},[16,1149,1150,769],{},[409,1151,768],{},[81,1153,1156],{"className":1154,"code":1155,"language":775,"meta":86},[773],"cat: meow\nnot a cat\n",[27,1157,1155],{"__ignoreMap":86},[1159,1160,1161],"blockquote",{},[16,1162,1163,1164,1166,1167,1169,1170,1173],{},"注意：",[27,1165,267],{}," 用在指针上，转换失败会得到 ",[27,1168,334],{},"；用在引用上，转换失败会抛出 ",[27,1171,1172],{},"std::bad_cast","。它要求基类至少有一个虚函数，通常是虚析构函数。",[74,1175,1177,1178,1180,1181,352],{"id":1176},"示例-3const_cast-只改变-const-限定","示例 3：",[27,1179,270],{}," 只改变 ",[27,1182,49],{},[16,1184,1185,1187,1188,348,1190,1192,1193,30,1195,1197],{},[27,1186,270],{}," 只能添加或移除 ",[27,1189,49],{},[27,1191,351],{}," 限定，不能把 ",[27,1194,33],{},[27,1196,29],{},"，也不能把两个不相关的类型互相转换。",[81,1199,1201],{"className":83,"code":1200,"language":85,"meta":86,"style":86},"#include \u003Ciostream>\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    int value = 10;\n    const int& readonly_ref = value;\n\n    int& writable_ref = const_cast\u003Cint&>(readonly_ref);\n    writable_ref = 20;\n\n    std::cout \u003C\u003C \"value = \" \u003C\u003C value \u003C\u003C \"\\n\";\n\n    \u002F\u002F 返回 0 表示程序正常结束。\n    return 0;\n}\n",[27,1202,1203,1209,1213,1221,1225,1229,1242,1258,1262,1278,1290,1294,1319,1323,1327,1335],{"__ignoreMap":86},[90,1204,1205,1207],{"class":92,"line":93},[90,1206,394],{"class":96},[90,1208,405],{"class":397},[90,1210,1211],{"class":92,"line":113},[90,1212,528],{"emptyLinePlaceholder":527},[90,1214,1215,1217,1219],{"class":92,"line":461},[90,1216,33],{"class":96},[90,1218,590],{"class":539},[90,1220,593],{"class":99},[90,1222,1223],{"class":92,"line":477},[90,1224,545],{"class":99},[90,1226,1227],{"class":92,"line":548},[90,1228,605],{"class":604},[90,1230,1231,1233,1236,1238,1240],{"class":92,"line":563},[90,1232,627],{"class":96},[90,1234,1235],{"class":99}," value ",[90,1237,103],{"class":96},[90,1239,107],{"class":106},[90,1241,110],{"class":99},[90,1243,1244,1247,1250,1253,1255],{"class":92,"line":574},[90,1245,1246],{"class":96},"    const",[90,1248,1249],{"class":96}," int&",[90,1251,1252],{"class":99}," readonly_ref ",[90,1254,103],{"class":96},[90,1256,1257],{"class":99}," value;\n",[90,1259,1260],{"class":92,"line":580},[90,1261,528],{"emptyLinePlaceholder":527},[90,1263,1264,1267,1270,1272,1275],{"class":92,"line":585},[90,1265,1266],{"class":96},"    int&",[90,1268,1269],{"class":99}," writable_ref ",[90,1271,103],{"class":96},[90,1273,1274],{"class":96}," const_cast\u003Cint&>",[90,1276,1277],{"class":99},"(readonly_ref);\n",[90,1279,1280,1283,1285,1288],{"class":92,"line":596},[90,1281,1282],{"class":99},"    writable_ref ",[90,1284,103],{"class":96},[90,1286,1287],{"class":106}," 20",[90,1289,110],{"class":99},[90,1291,1292],{"class":92,"line":601},[90,1293,528],{"emptyLinePlaceholder":527},[90,1295,1296,1298,1300,1302,1305,1307,1309,1311,1313,1315,1317],{"class":92,"line":608},[90,1297,682],{"class":539},[90,1299,685],{"class":99},[90,1301,688],{"class":96},[90,1303,1304],{"class":397}," \"value = \"",[90,1306,694],{"class":96},[90,1308,1235],{"class":99},[90,1310,688],{"class":96},[90,1312,701],{"class":397},[90,1314,704],{"class":106},[90,1316,707],{"class":397},[90,1318,110],{"class":99},[90,1320,1321],{"class":92,"line":624},[90,1322,528],{"emptyLinePlaceholder":527},[90,1324,1325],{"class":92,"line":640},[90,1326,746],{"class":604},[90,1328,1329,1331,1333],{"class":92,"line":645},[90,1330,752],{"class":96},[90,1332,755],{"class":106},[90,1334,110],{"class":99},[90,1336,1337],{"class":92,"line":659},[90,1338,763],{"class":99},[16,1340,1341,769],{},[409,1342,768],{},[81,1344,1347],{"className":1345,"code":1346,"language":775,"meta":86},[773],"value = 20\n",[27,1348,1346],{"__ignoreMap":86},[16,1350,1351,1352,1355,1356,1358,1359,34],{},"这个例子里，",[27,1353,1354],{},"value"," 本身是一个普通的 ",[27,1357,33],{}," 变量，并不是 ",[27,1360,1361],{},"const int",[81,1363,1365],{"className":83,"code":1364,"language":85,"meta":86,"style":86},"int value = 10;\nconst int& readonly_ref = value;\n",[27,1366,1367,1379],{"__ignoreMap":86},[90,1368,1369,1371,1373,1375,1377],{"class":92,"line":93},[90,1370,33],{"class":96},[90,1372,1235],{"class":99},[90,1374,103],{"class":96},[90,1376,107],{"class":106},[90,1378,110],{"class":99},[90,1380,1381,1383,1385,1387,1389],{"class":92,"line":113},[90,1382,49],{"class":96},[90,1384,1249],{"class":96},[90,1386,1252],{"class":99},[90,1388,103],{"class":96},[90,1390,1257],{"class":99},[16,1392,1393,1394,130,1397,1399,1400,1402],{},"这两行代码的意思是：",[27,1395,1396],{},"readonly_ref",[27,1398,1354],{}," 的一个“只读引用”。它并没有创建一个新的变量，而是给 ",[27,1401,1354],{}," 起了一个只能读取、不能修改的别名。",[16,1404,1405],{},"也就是说：",[81,1407,1409],{"className":83,"code":1408,"language":85,"meta":86,"style":86},"readonly_ref\n",[27,1410,1411],{"__ignoreMap":86},[90,1412,1413],{"class":92,"line":93},[90,1414,1408],{"class":99},[16,1416,1417,1418,34],{},"本质上还是指向原来的 ",[27,1419,1354],{},[16,1421,1422],{},"接下来：",[81,1424,1426],{"className":83,"code":1425,"language":85,"meta":86,"style":86},"int& writable_ref = const_cast\u003Cint&>(readonly_ref);\n",[27,1427,1428],{"__ignoreMap":86},[90,1429,1430,1433,1435,1437,1439],{"class":92,"line":93},[90,1431,1432],{"class":96},"int&",[90,1434,1269],{"class":99},[90,1436,103],{"class":96},[90,1438,1274],{"class":96},[90,1440,1277],{"class":99},[16,1442,1443,1444,1446,1447,1449,1450,1452,1453,1455],{},"这行代码使用 ",[27,1445,270],{}," 去掉了 ",[27,1448,1396],{}," 上的 ",[27,1451,49],{}," 限定，让它重新变成一个可以修改的引用。由于它引用的还是原来的 ",[27,1454,1354],{},"，所以：",[81,1457,1459],{"className":83,"code":1458,"language":85,"meta":86,"style":86},"writable_ref = 20;\n",[27,1460,1461],{"__ignoreMap":86},[90,1462,1463,1466,1468,1470],{"class":92,"line":93},[90,1464,1465],{"class":99},"writable_ref ",[90,1467,103],{"class":96},[90,1469,1287],{"class":106},[90,1471,110],{"class":99},[16,1473,1474],{},"本质上就是在修改：",[81,1476,1478],{"className":83,"code":1477,"language":85,"meta":86,"style":86},"value = 20;\n",[27,1479,1480],{"__ignoreMap":86},[90,1481,1482,1485,1487,1489],{"class":92,"line":93},[90,1483,1484],{"class":99},"value ",[90,1486,103],{"class":96},[90,1488,1287],{"class":106},[90,1490,110],{"class":99},[16,1492,1493],{},"因此最后输出的是：",[81,1495,1497],{"className":1496,"code":1346,"language":775,"meta":86},[773],[27,1498,1346],{"__ignoreMap":86},[16,1500,1501,1502,1504,1505,1507,1508,1511],{},"需要注意的是，这个例子能够修改成功，是因为原始对象 ",[27,1503,1354],{}," 本身不是 ",[27,1506,49],{},"，只是我们临时用 ",[27,1509,1510],{},"const int&"," 这种只读方式去引用它。",[16,1513,1514,1515,1517,1518,1520],{},"如果原始对象本身就是 ",[27,1516,49],{},"，再用 ",[27,1519,270],{}," 强行修改就是未定义行为，例如：",[81,1522,1524],{"className":83,"code":1523,"language":85,"meta":86,"style":86},"const int value = 10;\nconst int& readonly_ref = value;\n\nint& writable_ref = const_cast\u003Cint&>(readonly_ref);\nwritable_ref = 20; \u002F\u002F 未定义行为\n",[27,1525,1526,1541,1553,1557,1569],{"__ignoreMap":86},[90,1527,1528,1530,1533,1535,1537,1539],{"class":92,"line":93},[90,1529,49],{"class":96},[90,1531,1532],{"class":96}," int",[90,1534,1235],{"class":99},[90,1536,103],{"class":96},[90,1538,107],{"class":106},[90,1540,110],{"class":99},[90,1542,1543,1545,1547,1549,1551],{"class":92,"line":113},[90,1544,49],{"class":96},[90,1546,1249],{"class":96},[90,1548,1252],{"class":99},[90,1550,103],{"class":96},[90,1552,1257],{"class":99},[90,1554,1555],{"class":92,"line":461},[90,1556,528],{"emptyLinePlaceholder":527},[90,1558,1559,1561,1563,1565,1567],{"class":92,"line":477},[90,1560,1432],{"class":96},[90,1562,1269],{"class":99},[90,1564,103],{"class":96},[90,1566,1274],{"class":96},[90,1568,1277],{"class":99},[90,1570,1571,1573,1575,1577,1580],{"class":92,"line":548},[90,1572,1465],{"class":99},[90,1574,103],{"class":96},[90,1576,1287],{"class":106},[90,1578,1579],{"class":99},";",[90,1581,1582],{"class":604}," \u002F\u002F 未定义行为\n",[16,1584,1585],{},"所以可以简单记住：",[16,1587,1588,1590],{},[27,1589,270],{}," 只是把“只读视角”改回“可写视角”，它不会复制出新变量，也不会真的把一个天生的常量安全地变成普通变量。",[74,1592,1594,1595,1597],{"id":1593},"示例-4reinterpret_cast-做底层重解释","示例 4：",[27,1596,274],{}," 做底层重解释",[16,1599,1600,1602],{},[27,1601,274],{}," 表示“把这段二进制数据按另一种类型解释”。它绕过了很多类型系统保护，通常只应该出现在非常底层的代码里。",[16,1604,1605],{},"比如把一个指针转换成整数形式的地址，再把这个整数地址转换回指针。",[16,1607,1608,1610],{},[27,1609,274],{}," 可以用来做一些比较“底层”的类型转换，比如把一个指针转换成整数形式的地址，再把这个整数地址转换回指针。",[16,1612,1613,1614,1617],{},"需要注意的是，这里转换的是",[409,1615,1616],{},"地址","，不是变量里面保存的值。",[81,1619,1621],{"className":83,"code":1620,"language":85,"meta":86,"style":86},"#include \u003Ccstdint>\n#include \u003Ciomanip>\n#include \u003Ciostream>\n\nint main()\n{\n    \u002F\u002F 程序从 main 函数开始执行，下面的语句会按顺序运行。\n    int value = 42;\n    int* p = &value;\n\n    std::uintptr_t raw = reinterpret_cast\u003Cstd::uintptr_t>(p);\n    int* again = reinterpret_cast\u003Cint*>(raw);\n\n    std::cout \u003C\u003C \"value = \" \u003C\u003C value \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"p = \" \u003C\u003C p \u003C\u003C \"\\n\";\n\n    std::cout \u003C\u003C \"raw = \" \u003C\u003C raw \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"raw(hex) = 0x\" \u003C\u003C std::hex \u003C\u003C raw \u003C\u003C std::dec \u003C\u003C \"\\n\";\n\n    std::cout \u003C\u003C \"again = \" \u003C\u003C again \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C \"*again = \" \u003C\u003C *again \u003C\u003C \"\\n\";\n\n    std::cout \u003C\u003C std::boolalpha;\n    std::cout \u003C\u003C \"same pointer = \" \u003C\u003C (p == again) \u003C\u003C \"\\n\";\n\n    \u002F\u002F 返回 0 表示程序正常结束。\n    return 0;\n}\n",[27,1622,1623,1629,1636,1642,1646,1654,1658,1662,1675,1691,1695,1723,1738,1742,1766,1791,1795,1820,1860,1864,1889,1918,1922,1935,1967,1971,1975,1983],{"__ignoreMap":86},[90,1624,1625,1627],{"class":92,"line":93},[90,1626,394],{"class":96},[90,1628,398],{"class":397},[90,1630,1631,1633],{"class":92,"line":113},[90,1632,394],{"class":96},[90,1634,1635],{"class":397}," \u003Ciomanip>\n",[90,1637,1638,1640],{"class":92,"line":461},[90,1639,394],{"class":96},[90,1641,405],{"class":397},[90,1643,1644],{"class":92,"line":477},[90,1645,528],{"emptyLinePlaceholder":527},[90,1647,1648,1650,1652],{"class":92,"line":548},[90,1649,33],{"class":96},[90,1651,590],{"class":539},[90,1653,593],{"class":99},[90,1655,1656],{"class":92,"line":563},[90,1657,545],{"class":99},[90,1659,1660],{"class":92,"line":574},[90,1661,605],{"class":604},[90,1663,1664,1666,1668,1670,1673],{"class":92,"line":580},[90,1665,627],{"class":96},[90,1667,1235],{"class":99},[90,1669,103],{"class":96},[90,1671,1672],{"class":106}," 42",[90,1674,110],{"class":99},[90,1676,1677,1680,1683,1685,1688],{"class":92,"line":585},[90,1678,1679],{"class":96},"    int*",[90,1681,1682],{"class":99}," p ",[90,1684,103],{"class":96},[90,1686,1687],{"class":96}," &",[90,1689,1690],{"class":99},"value;\n",[90,1692,1693],{"class":92,"line":596},[90,1694,528],{"emptyLinePlaceholder":527},[90,1696,1697,1699,1702,1705,1708,1710,1712,1715,1717,1720],{"class":92,"line":601},[90,1698,682],{"class":539},[90,1700,1701],{"class":99},"::",[90,1703,1704],{"class":96},"uintptr_t",[90,1706,1707],{"class":99}," raw ",[90,1709,103],{"class":96},[90,1711,484],{"class":96},[90,1713,1714],{"class":539},"std",[90,1716,1701],{"class":99},[90,1718,1719],{"class":96},"uintptr_t>",[90,1721,1722],{"class":99},"(p);\n",[90,1724,1725,1727,1730,1732,1735],{"class":92,"line":608},[90,1726,1679],{"class":96},[90,1728,1729],{"class":99}," again ",[90,1731,103],{"class":96},[90,1733,1734],{"class":96}," reinterpret_cast\u003Cint*>",[90,1736,1737],{"class":99},"(raw);\n",[90,1739,1740],{"class":92,"line":624},[90,1741,528],{"emptyLinePlaceholder":527},[90,1743,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764],{"class":92,"line":640},[90,1745,682],{"class":539},[90,1747,685],{"class":99},[90,1749,688],{"class":96},[90,1751,1304],{"class":397},[90,1753,694],{"class":96},[90,1755,1235],{"class":99},[90,1757,688],{"class":96},[90,1759,701],{"class":397},[90,1761,704],{"class":106},[90,1763,707],{"class":397},[90,1765,110],{"class":99},[90,1767,1768,1770,1772,1774,1777,1779,1781,1783,1785,1787,1789],{"class":92,"line":645},[90,1769,682],{"class":539},[90,1771,685],{"class":99},[90,1773,688],{"class":96},[90,1775,1776],{"class":397}," \"p = \"",[90,1778,694],{"class":96},[90,1780,1682],{"class":99},[90,1782,688],{"class":96},[90,1784,701],{"class":397},[90,1786,704],{"class":106},[90,1788,707],{"class":397},[90,1790,110],{"class":99},[90,1792,1793],{"class":92,"line":659},[90,1794,528],{"emptyLinePlaceholder":527},[90,1796,1797,1799,1801,1803,1806,1808,1810,1812,1814,1816,1818],{"class":92,"line":674},[90,1798,682],{"class":539},[90,1800,685],{"class":99},[90,1802,688],{"class":96},[90,1804,1805],{"class":397}," \"raw = \"",[90,1807,694],{"class":96},[90,1809,1707],{"class":99},[90,1811,688],{"class":96},[90,1813,701],{"class":397},[90,1815,704],{"class":106},[90,1817,707],{"class":397},[90,1819,110],{"class":99},[90,1821,1822,1824,1826,1828,1831,1833,1836,1839,1841,1843,1845,1847,1850,1852,1854,1856,1858],{"class":92,"line":679},[90,1823,682],{"class":539},[90,1825,685],{"class":99},[90,1827,688],{"class":96},[90,1829,1830],{"class":397}," \"raw(hex) = 0x\"",[90,1832,694],{"class":96},[90,1834,1835],{"class":539}," std",[90,1837,1838],{"class":99},"::hex ",[90,1840,688],{"class":96},[90,1842,1707],{"class":99},[90,1844,688],{"class":96},[90,1846,1835],{"class":539},[90,1848,1849],{"class":99},"::dec ",[90,1851,688],{"class":96},[90,1853,701],{"class":397},[90,1855,704],{"class":106},[90,1857,707],{"class":397},[90,1859,110],{"class":99},[90,1861,1862],{"class":92,"line":712},[90,1863,528],{"emptyLinePlaceholder":527},[90,1865,1866,1868,1870,1872,1875,1877,1879,1881,1883,1885,1887],{"class":92,"line":738},[90,1867,682],{"class":539},[90,1869,685],{"class":99},[90,1871,688],{"class":96},[90,1873,1874],{"class":397}," \"again = \"",[90,1876,694],{"class":96},[90,1878,1729],{"class":99},[90,1880,688],{"class":96},[90,1882,701],{"class":397},[90,1884,704],{"class":106},[90,1886,707],{"class":397},[90,1888,110],{"class":99},[90,1890,1891,1893,1895,1897,1900,1902,1905,1908,1910,1912,1914,1916],{"class":92,"line":743},[90,1892,682],{"class":539},[90,1894,685],{"class":99},[90,1896,688],{"class":96},[90,1898,1899],{"class":397}," \"*again = \"",[90,1901,694],{"class":96},[90,1903,1904],{"class":96}," *",[90,1906,1907],{"class":99},"again ",[90,1909,688],{"class":96},[90,1911,701],{"class":397},[90,1913,704],{"class":106},[90,1915,707],{"class":397},[90,1917,110],{"class":99},[90,1919,1920],{"class":92,"line":749},[90,1921,528],{"emptyLinePlaceholder":527},[90,1923,1924,1926,1928,1930,1932],{"class":92,"line":760},[90,1925,682],{"class":539},[90,1927,685],{"class":99},[90,1929,688],{"class":96},[90,1931,1835],{"class":539},[90,1933,1934],{"class":99},"::boolalpha;\n",[90,1936,1937,1939,1941,1943,1946,1948,1951,1954,1957,1959,1961,1963,1965],{"class":92,"line":981},[90,1938,682],{"class":539},[90,1940,685],{"class":99},[90,1942,688],{"class":96},[90,1944,1945],{"class":397}," \"same pointer = \"",[90,1947,694],{"class":96},[90,1949,1950],{"class":99}," (p ",[90,1952,1953],{"class":96},"==",[90,1955,1956],{"class":99}," again) ",[90,1958,688],{"class":96},[90,1960,701],{"class":397},[90,1962,704],{"class":106},[90,1964,707],{"class":397},[90,1966,110],{"class":99},[90,1968,1969],{"class":92,"line":998},[90,1970,528],{"emptyLinePlaceholder":527},[90,1972,1973],{"class":92,"line":1003},[90,1974,746],{"class":604},[90,1976,1977,1979,1981],{"class":92,"line":1015},[90,1978,752],{"class":96},[90,1980,755],{"class":106},[90,1982,110],{"class":99},[90,1984,1985],{"class":92,"line":1020},[90,1986,763],{"class":99},[16,1988,1989,769],{},[409,1990,1991],{},"运行结果示例",[81,1993,1996],{"className":1994,"code":1995,"language":775,"meta":86},[773],"value = 42\np = 0x7ffd60a576d4\nraw = 140726224910036\nraw(hex) = 0x7ffd60a576d4\nagain = 0x7ffd60a576d4\n*again = 42\nsame pointer = true\n",[27,1997,1995],{"__ignoreMap":86},[16,1999,2000],{},"其中，具体的地址值每次运行都可能不同，所以你的运行结果不一定和上面完全一样。",[16,2002,2003],{},"这段代码里：",[81,2005,2007],{"className":83,"code":2006,"language":85,"meta":86,"style":86},"int value = 42;\nint* p = &value;\n",[27,2008,2009,2021],{"__ignoreMap":86},[90,2010,2011,2013,2015,2017,2019],{"class":92,"line":93},[90,2012,33],{"class":96},[90,2014,1235],{"class":99},[90,2016,103],{"class":96},[90,2018,1672],{"class":106},[90,2020,110],{"class":99},[90,2022,2023,2026,2028,2030,2032],{"class":92,"line":113},[90,2024,2025],{"class":96},"int*",[90,2027,1682],{"class":99},[90,2029,103],{"class":96},[90,2031,1687],{"class":96},[90,2033,1690],{"class":99},[16,2035,2036,2038,2039,2041,2042,34],{},[27,2037,1354],{}," 是一个普通的 ",[27,2040,33],{}," 变量，里面保存的值是 ",[27,2043,2044],{},"42",[16,2046,2047,2049,2050,2052,2053,2055,2056,2058],{},[27,2048,16],{}," 是一个 ",[27,2051,2025],{}," 指针，里面保存的是 ",[27,2054,1354],{}," 的地址，而不是 ",[27,2057,1354],{}," 的值。",[16,2060,2061,2062,2064],{},"也就是说，",[27,2063,16],{}," 里面存的不是：",[81,2066,2069],{"className":2067,"code":2068,"language":775,"meta":86},[773],"42\n",[27,2070,2068],{"__ignoreMap":86},[16,2072,2073],{},"而是类似这样的地址：",[81,2075,2078],{"className":2076,"code":2077,"language":775,"meta":86},[773],"0x7ffd60a576d4\n",[27,2079,2077],{"__ignoreMap":86},[16,2081,2082],{},"接着：",[81,2084,2086],{"className":83,"code":2085,"language":85,"meta":86,"style":86},"std::uintptr_t raw = reinterpret_cast\u003Cstd::uintptr_t>(p);\n",[27,2087,2088],{"__ignoreMap":86},[90,2089,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108],{"class":92,"line":93},[90,2091,1714],{"class":539},[90,2093,1701],{"class":99},[90,2095,1704],{"class":96},[90,2097,1707],{"class":99},[90,2099,103],{"class":96},[90,2101,484],{"class":96},[90,2103,1714],{"class":539},[90,2105,1701],{"class":99},[90,2107,1719],{"class":96},[90,2109,1722],{"class":99},[16,2111,2112,2113,2115],{},"这行代码把指针 ",[27,2114,16],{}," 转换成了一个整数。",[16,2117,2118,2121],{},[27,2119,2120],{},"std::uintptr_t"," 是一种无符号整数类型，它的作用是尽可能安全地保存一个指针地址。",[16,2123,2124],{},"所以如果：",[81,2126,2129],{"className":2127,"code":2128,"language":775,"meta":86},[773],"p = 0x7ffd60a576d4\n",[27,2130,2128],{"__ignoreMap":86},[16,2132,2133,2134,2137],{},"那么 ",[27,2135,2136],{},"raw"," 保存的就是这个地址对应的整数形式。",[16,2139,2140],{},"例如：",[81,2142,2145],{"className":2143,"code":2144,"language":775,"meta":86},[773],"raw = 140726224910036\n",[27,2146,2144],{"__ignoreMap":86},[16,2148,2149],{},"这只是同一个地址的十进制写法。",[16,2151,2152],{},"下面这行代码：",[81,2154,2156],{"className":83,"code":2155,"language":85,"meta":86,"style":86},"std::cout \u003C\u003C \"raw(hex) = 0x\" \u003C\u003C std::hex \u003C\u003C raw \u003C\u003C std::dec \u003C\u003C \"\\n\";\n",[27,2157,2158],{"__ignoreMap":86},[90,2159,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192],{"class":92,"line":93},[90,2161,1714],{"class":539},[90,2163,685],{"class":99},[90,2165,688],{"class":96},[90,2167,1830],{"class":397},[90,2169,694],{"class":96},[90,2171,1835],{"class":539},[90,2173,1838],{"class":99},[90,2175,688],{"class":96},[90,2177,1707],{"class":99},[90,2179,688],{"class":96},[90,2181,1835],{"class":539},[90,2183,1849],{"class":99},[90,2185,688],{"class":96},[90,2187,701],{"class":397},[90,2189,704],{"class":106},[90,2191,707],{"class":397},[90,2193,110],{"class":99},[16,2195,2196,2197,2199,2200,2202,2203,2205],{},"是把 ",[27,2198,2136],{}," 按十六进制打印出来。这样就可以看到，",[27,2201,2136],{}," 的十六进制形式和指针 ",[27,2204,16],{}," 打印出来的地址基本是一样的。",[16,2207,2208],{},"然后：",[81,2210,2212],{"className":83,"code":2211,"language":85,"meta":86,"style":86},"int* again = reinterpret_cast\u003Cint*>(raw);\n",[27,2213,2214],{"__ignoreMap":86},[90,2215,2216,2218,2220,2222,2224],{"class":92,"line":93},[90,2217,2025],{"class":96},[90,2219,1729],{"class":99},[90,2221,103],{"class":96},[90,2223,1734],{"class":96},[90,2225,1737],{"class":99},[16,2227,2228,2229,2231,2232,2234],{},"这行代码又把整数形式的地址 ",[27,2230,2136],{}," 转回了 ",[27,2233,2025],{}," 指针。",[16,2236,1405],{},[81,2238,2241],{"className":2239,"code":2240,"language":775,"meta":86},[773],"p     指向 value\nagain 也指向 value\n",[27,2242,2240],{"__ignoreMap":86},[16,2244,2245],{},"所以：",[81,2247,2249],{"className":83,"code":2248,"language":85,"meta":86,"style":86},"std::cout \u003C\u003C \"*again = \" \u003C\u003C *again \u003C\u003C \"\\n\";\n",[27,2250,2251],{"__ignoreMap":86},[90,2252,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275],{"class":92,"line":93},[90,2254,1714],{"class":539},[90,2256,685],{"class":99},[90,2258,688],{"class":96},[90,2260,1899],{"class":397},[90,2262,694],{"class":96},[90,2264,1904],{"class":96},[90,2266,1907],{"class":99},[90,2268,688],{"class":96},[90,2270,701],{"class":397},[90,2272,704],{"class":106},[90,2274,707],{"class":397},[90,2276,110],{"class":99},[16,2278,232,2279,2282,2283,2286],{},[27,2280,2281],{},"*again"," 就是在访问 ",[27,2284,2285],{},"again"," 指向的变量。",[16,2288,2289,2290,2292,2293,1455],{},"因为 ",[27,2291,2285],{}," 重新指向了原来的 ",[27,2294,1354],{},[81,2296,2298],{"className":83,"code":2297,"language":85,"meta":86,"style":86},"*again\n",[27,2299,2300],{"__ignoreMap":86},[90,2301,2302,2304],{"class":92,"line":93},[90,2303,940],{"class":96},[90,2305,2306],{"class":99},"again\n",[16,2308,2309],{},"等价于：",[81,2311,2313],{"className":83,"code":2312,"language":85,"meta":86,"style":86},"value\n",[27,2314,2315],{"__ignoreMap":86},[90,2316,2317],{"class":92,"line":93},[90,2318,2312],{"class":99},[16,2320,2321],{},"因此输出结果是：",[81,2323,2326],{"className":2324,"code":2325,"language":775,"meta":86},[773],"*again = 42\n",[27,2327,2325],{"__ignoreMap":86},[16,2329,2330],{},"最后：",[81,2332,2334],{"className":83,"code":2333,"language":85,"meta":86,"style":86},"std::cout \u003C\u003C \"same pointer = \" \u003C\u003C (p == again) \u003C\u003C \"\\n\";\n",[27,2335,2336],{"__ignoreMap":86},[90,2337,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362],{"class":92,"line":93},[90,2339,1714],{"class":539},[90,2341,685],{"class":99},[90,2343,688],{"class":96},[90,2345,1945],{"class":397},[90,2347,694],{"class":96},[90,2349,1950],{"class":99},[90,2351,1953],{"class":96},[90,2353,1956],{"class":99},[90,2355,688],{"class":96},[90,2357,701],{"class":397},[90,2359,704],{"class":106},[90,2361,707],{"class":397},[90,2363,110],{"class":99},[16,2365,2366,2367,271,2369,2371],{},"这行代码比较的是 ",[27,2368,16],{},[27,2370,2285],{}," 这两个指针保存的地址是否相同。",[16,2373,2374,2375,2377],{},"由于它们都指向 ",[27,2376,1354],{},"，所以结果是：",[81,2379,2382],{"className":2380,"code":2381,"language":775,"meta":86},[773],"same pointer = true\n",[27,2383,2381],{"__ignoreMap":86},[16,2385,2386],{},"可以把整个过程理解成：",[81,2388,2391],{"className":2389,"code":2390,"language":775,"meta":86},[773],"value 是一个变量，值是 42\n\np 保存 value 的地址\n\nraw 把这个地址用整数形式保存下来\n\nagain 又把这个整数地址转换回指针\n\n所以 again 重新指向 value\n",[27,2392,2390],{"__ignoreMap":86},[16,2394,2395,2396,2398,2399,2401,2402,2404],{},"所以这段代码的重点不是把 ",[27,2397,2044],{}," 转成整数，而是把 ",[27,2400,1354],{}," 的",[409,2403,1616],{},"转成整数。",[16,2406,2407],{},"简单记忆：",[81,2409,2411],{"className":83,"code":2410,"language":85,"meta":86,"style":86},"int* p = &value;\n",[27,2412,2413],{"__ignoreMap":86},[90,2414,2415,2417,2419,2421,2423],{"class":92,"line":93},[90,2416,2025],{"class":96},[90,2418,1682],{"class":99},[90,2420,103],{"class":96},[90,2422,1687],{"class":96},[90,2424,1690],{"class":99},[16,2426,2427],{},"表示：",[81,2429,2432],{"className":2430,"code":2431,"language":775,"meta":86},[773],"拿到 value 的地址\n",[27,2433,2431],{"__ignoreMap":86},[81,2435,2436],{"className":83,"code":2085,"language":85,"meta":86,"style":86},[27,2437,2438],{"__ignoreMap":86},[90,2439,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458],{"class":92,"line":93},[90,2441,1714],{"class":539},[90,2443,1701],{"class":99},[90,2445,1704],{"class":96},[90,2447,1707],{"class":99},[90,2449,103],{"class":96},[90,2451,484],{"class":96},[90,2453,1714],{"class":539},[90,2455,1701],{"class":99},[90,2457,1719],{"class":96},[90,2459,1722],{"class":99},[16,2461,2427],{},[81,2463,2466],{"className":2464,"code":2465,"language":775,"meta":86},[773],"把地址当成整数保存\n",[27,2467,2465],{"__ignoreMap":86},[81,2469,2470],{"className":83,"code":2211,"language":85,"meta":86,"style":86},[27,2471,2472],{"__ignoreMap":86},[90,2473,2474,2476,2478,2480,2482],{"class":92,"line":93},[90,2475,2025],{"class":96},[90,2477,1729],{"class":99},[90,2479,103],{"class":96},[90,2481,1734],{"class":96},[90,2483,1737],{"class":99},[16,2485,2427],{},[81,2487,2490],{"className":2488,"code":2489,"language":775,"meta":86},[773],"把整数地址再变回指针\n",[27,2491,2489],{"__ignoreMap":86},[81,2493,2494],{"className":83,"code":2297,"language":85,"meta":86,"style":86},[27,2495,2496],{"__ignoreMap":86},[90,2497,2498,2500],{"class":92,"line":93},[90,2499,940],{"class":96},[90,2501,2306],{"class":99},[16,2503,2427],{},[81,2505,2508],{"className":2506,"code":2507,"language":775,"meta":86},[773],"通过这个地址找到原来的 value\n",[27,2509,2507],{"__ignoreMap":86},[16,2511,2512],{},"一句话总结：",[16,2514,2515,2517,2518,2520,2521,133,2523,2525,2526,2528],{},[27,2516,274],{}," 在这个例子里转换的是“地址的表示形式”，不是变量里面的值。",[27,2519,1354],{}," 的值是 ",[27,2522,2044],{},[27,2524,2136],{}," 保存的是 ",[27,2527,1354],{}," 的地址。",[12,2530,2531],{"id":2531},"四种转换怎么选",[283,2533,2534,2547],{},[286,2535,2536],{},[289,2537,2538,2541,2544],{},[292,2539,2540],{"align":294},"需求",[292,2542,2543],{"align":294},"推荐写法",[292,2545,2546],{"align":294},"说明",[303,2548,2549,2566,2581,2596,2612],{},[289,2550,2551,2558,2563],{},[308,2552,2553,2555,2556],{"align":294},[27,2554,29],{}," 转 ",[27,2557,33],{},[308,2559,2560],{"align":294},[27,2561,2562],{},"static_cast\u003Cint>(x)",[308,2564,2565],{"align":294},"明确可能丢失小数",[289,2567,2568,2573,2578],{},[308,2569,2570,2572],{"align":294},[27,2571,39],{}," 转整数",[308,2574,2575],{"align":294},[27,2576,2577],{},"static_cast\u003Cint>(e)",[308,2579,2580],{"align":294},"枚举类不会隐式转整数",[289,2582,2583,2586,2591],{},[308,2584,2585],{"align":294},"基类指针转派生类指针，并且不确定真实类型",[308,2587,2588],{"align":294},[27,2589,2590],{},"dynamic_cast\u003CDerived*>(p)",[308,2592,2593,2594],{"align":294},"转换失败可判断 ",[27,2595,334],{},[289,2597,2598,2604,2609],{},[308,2599,2600,2601,2603],{"align":294},"去掉 ",[27,2602,49],{}," 适配旧接口",[308,2605,2606],{"align":294},[27,2607,2608],{},"const_cast\u003CT*>(p)",[308,2610,2611],{"align":294},"前提是旧接口不会修改真正的 const 对象",[289,2613,2614,2617,2622],{},[308,2615,2616],{"align":294},"指针和整数互转、底层字节解释",[308,2618,2619],{"align":294},[27,2620,2621],{},"reinterpret_cast\u003CT>(x)",[308,2623,2624],{"align":294},"非常底层，优先避免",[12,2626,2628],{"id":2627},"类型转换-对比-c风格强转-会增加运行开销吗","类型转换 对比 C风格强转 会增加运行开销吗",[16,2630,2631],{},[409,2632,2633,2635,2636,2639],{},[27,2634,312],{}," 中虽然使用了尖括号，看起来有些像模板，但它不是模板，而是 C++ 语言内置的类型转换运算符。这里的 ",[27,2637,2638],{},"T"," 表示要转换成的目标类型。",[16,2641,2642],{},"与功能相同的 C 风格强转相比，C++ 的显式类型转换通常不会产生额外的运行开销：",[283,2644,2645,2654],{},[286,2646,2647],{},[289,2648,2649,2651],{},[292,2650,295],{"align":294},[292,2652,2653],{"align":294},"通常的运行开销",[303,2655,2656,2665,2674,2683],{},[289,2657,2658,2662],{},[308,2659,2660],{"align":294},[27,2661,263],{},[308,2663,2664],{"align":294},"不会因为使用这种写法而增加额外开销",[289,2666,2667,2671],{},[308,2668,2669],{"align":294},[27,2670,267],{},[308,2672,2673],{"align":294},"需要在运行时检查对象的真实类型，可能产生时间和程序体积开销",[289,2675,2676,2680],{},[308,2677,2678],{"align":294},[27,2679,270],{},[308,2681,2682],{"align":294},"通常只改变编译器进行类型检查的方式，没有运行时操作",[289,2684,2685,2689],{},[308,2686,2687],{"align":294},[27,2688,274],{},[308,2690,2691],{"align":294},"通常只改变编译器解释数据的方式，没有额外转换步骤",[16,2693,2694],{},"例如，下面两种写法表达的是同一种数值转换：",[81,2696,2698],{"className":83,"code":2697,"language":85,"meta":86,"style":86},"double value = 3.14;\n\nint a = (int)value;\nint b = static_cast\u003Cint>(value);\n",[27,2699,2700,2713,2717,2734],{"__ignoreMap":86},[90,2701,2702,2704,2706,2708,2711],{"class":92,"line":93},[90,2703,29],{"class":96},[90,2705,1235],{"class":99},[90,2707,103],{"class":96},[90,2709,2710],{"class":106}," 3.14",[90,2712,110],{"class":99},[90,2714,2715],{"class":92,"line":113},[90,2716,528],{"emptyLinePlaceholder":527},[90,2718,2719,2721,2724,2726,2729,2731],{"class":92,"line":461},[90,2720,33],{"class":96},[90,2722,2723],{"class":99}," a ",[90,2725,103],{"class":96},[90,2727,2728],{"class":99}," (",[90,2730,33],{"class":96},[90,2732,2733],{"class":99},")value;\n",[90,2735,2736,2738,2741,2743,2745],{"class":92,"line":477},[90,2737,33],{"class":96},[90,2739,2740],{"class":99}," b ",[90,2742,103],{"class":96},[90,2744,226],{"class":96},[90,2746,2747],{"class":99},"(value);\n",[16,2749,2750,2751,2753],{},"编译器通常会为它们生成相同或等价的机器指令。",[27,2752,263],{}," 的优势不是运行得更快，而是转换意图更加明确，并且能够得到更严格的编译期检查。",[16,2755,2756],{},"不过，需要区分“转换写法的开销”和“转换操作本身的开销”。例如，把浮点数转换成整数可能需要执行实际的处理器指令：",[81,2758,2760],{"className":83,"code":2759,"language":85,"meta":86,"style":86},"double value = 3.14;\nint result = static_cast\u003Cint>(value);\n",[27,2761,2762,2774],{"__ignoreMap":86},[90,2763,2764,2766,2768,2770,2772],{"class":92,"line":93},[90,2765,29],{"class":96},[90,2767,1235],{"class":99},[90,2769,103],{"class":96},[90,2771,2710],{"class":106},[90,2773,110],{"class":99},[90,2775,2776,2778,2780,2782,2784],{"class":92,"line":113},[90,2777,33],{"class":96},[90,2779,118],{"class":99},[90,2781,103],{"class":96},[90,2783,226],{"class":96},[90,2785,2747],{"class":99},[16,2787,2788,2789,2791,2792,2794,2795,2797],{},"这里可能产生的运行开销来自“把 ",[27,2790,29],{}," 转换成 ",[27,2793,33],{},"”这个操作，而不是来自 ",[27,2796,263],{}," 语法。即使改成隐式转换或 C 风格强转，这个转换操作仍然存在。",[16,2799,2800,2801,2803],{},"因此可以简单记住：选择 C++ 的显式类型转换，主要是为了让类型检查更严格、代码意图更清楚；除了需要运行时检查的 ",[27,2802,267],{},"，它通常不会因为写法不同而比 C 风格强转更慢。",[12,2805,2807],{"id":2806},"c风格强转为什么不推荐","C风格强转为什么不推荐",[16,2809,2810],{},"C 风格强转写起来短：",[81,2812,2814],{"className":83,"code":2813,"language":85,"meta":86,"style":86},"int n = (int)3.14;\n",[27,2815,2816],{"__ignoreMap":86},[90,2817,2818,2820,2823,2825,2827,2829,2832,2835],{"class":92,"line":93},[90,2819,33],{"class":96},[90,2821,2822],{"class":99}," n ",[90,2824,103],{"class":96},[90,2826,2728],{"class":99},[90,2828,33],{"class":96},[90,2830,2831],{"class":99},")",[90,2833,2834],{"class":106},"3.14",[90,2836,110],{"class":99},[16,2838,2839,412,2841,416],{},[409,2840,411],{},[27,2842,415],{},[16,2844,2845],{},"更推荐写成：",[81,2847,2849],{"className":83,"code":2848,"language":85,"meta":86,"style":86},"int n = static_cast\u003Cint>(3.14);\n",[27,2850,2851],{"__ignoreMap":86},[90,2852,2853,2855,2857,2859,2861,2863,2865],{"class":92,"line":93},[90,2854,33],{"class":96},[90,2856,2822],{"class":99},[90,2858,103],{"class":96},[90,2860,226],{"class":96},[90,2862,934],{"class":99},[90,2864,2834],{"class":106},[90,2866,2867],{"class":99},");\n",[16,2869,2870,412,2872,416],{},[409,2871,411],{},[27,2873,415],{},[16,2875,2876,2877,2879,2880,2882,2883,2885],{},"C 风格强转可能在背后组合多种转换能力，既可能像 ",[27,2878,263],{},"，也可能像 ",[27,2881,270],{},"，甚至接近 ",[27,2884,274],{},"。代码越底层、类型越复杂，这种“不说明白”的风险就越大。",[12,2887,2888],{"id":2888},"常见错误",[74,2890,2892],{"id":2891},"用-static_cast-做不安全向下转换","用 static_cast 做不安全向下转换",[81,2894,2896],{"className":83,"code":2895,"language":85,"meta":86,"style":86},"Animal* animal = new Dog;\nCat* cat = static_cast\u003CCat*>(animal);  \u002F\u002F 危险：编译可能通过，但真实对象不是 Cat\n",[27,2897,2898,2915],{"__ignoreMap":86},[90,2899,2900,2902,2904,2907,2909,2912],{"class":92,"line":93},[90,2901,937],{"class":99},[90,2903,940],{"class":96},[90,2905,2906],{"class":99}," animal ",[90,2908,103],{"class":96},[90,2910,2911],{"class":96}," new",[90,2913,2914],{"class":99}," Dog;\n",[90,2916,2917,2919,2921,2923,2925,2927,2929,2931,2934],{"class":92,"line":113},[90,2918,968],{"class":99},[90,2920,940],{"class":96},[90,2922,961],{"class":99},[90,2924,103],{"class":96},[90,2926,434],{"class":96},[90,2928,968],{"class":99},[90,2930,971],{"class":96},[90,2932,2933],{"class":99},"(animal);",[90,2935,2936],{"class":604},"  \u002F\u002F 危险：编译可能通过，但真实对象不是 Cat\n",[16,2938,2939,412,2941,416],{},[409,2940,411],{},[27,2942,415],{},[16,2944,2945,2946,34],{},"如果不确定真实类型，应该使用 ",[27,2947,267],{},[74,2949,2951],{"id":2950},"修改真正的-const-对象","修改真正的 const 对象",[81,2953,2955],{"className":83,"code":2954,"language":85,"meta":86,"style":86},"const int value = 10;\nint& ref = const_cast\u003Cint&>(value);\nref = 20;  \u002F\u002F 未定义行为\n",[27,2956,2957,2971,2984],{"__ignoreMap":86},[90,2958,2959,2961,2963,2965,2967,2969],{"class":92,"line":93},[90,2960,49],{"class":96},[90,2962,1532],{"class":96},[90,2964,1235],{"class":99},[90,2966,103],{"class":96},[90,2968,107],{"class":106},[90,2970,110],{"class":99},[90,2972,2973,2975,2978,2980,2982],{"class":92,"line":113},[90,2974,1432],{"class":96},[90,2976,2977],{"class":99}," ref ",[90,2979,103],{"class":96},[90,2981,1274],{"class":96},[90,2983,2747],{"class":99},[90,2985,2986,2989,2991,2993,2995],{"class":92,"line":461},[90,2987,2988],{"class":99},"ref ",[90,2990,103],{"class":96},[90,2992,1287],{"class":106},[90,2994,1579],{"class":99},[90,2996,2997],{"class":604},"  \u002F\u002F 未定义行为\n",[16,2999,3000,412,3002,416],{},[409,3001,411],{},[27,3003,415],{},[74,3005,3007],{"id":3006},"滥用-reinterpret_cast","滥用 reinterpret_cast",[81,3009,3011],{"className":83,"code":3010,"language":85,"meta":86,"style":86},"double d = 3.14;\nint* p = reinterpret_cast\u003Cint*>(&d);  \u002F\u002F 危险：把 double 对象当 int 对象访问\n",[27,3012,3013,3026],{"__ignoreMap":86},[90,3014,3015,3017,3020,3022,3024],{"class":92,"line":93},[90,3016,29],{"class":96},[90,3018,3019],{"class":99}," d ",[90,3021,103],{"class":96},[90,3023,2710],{"class":106},[90,3025,110],{"class":99},[90,3027,3028,3030,3032,3034,3036,3038,3040,3043],{"class":92,"line":113},[90,3029,2025],{"class":96},[90,3031,1682],{"class":99},[90,3033,103],{"class":96},[90,3035,1734],{"class":96},[90,3037,934],{"class":99},[90,3039,1108],{"class":96},[90,3041,3042],{"class":99},"d);",[90,3044,3045],{"class":604},"  \u002F\u002F 危险：把 double 对象当 int 对象访问\n",[16,3047,3048,412,3050,416],{},[409,3049,411],{},[27,3051,415],{},[12,3053,3054],{"id":3054},"使用建议",[3056,3057,3058,3063,3069,3077,3082],"ol",{},[23,3059,3060,3061,34],{},"普通转换优先用 ",[27,3062,263],{},[23,3064,3065,3066,3068],{},"多态向下转换优先用 ",[27,3067,267],{},"，并检查失败情况。",[23,3070,3071,3073,3074,3076],{},[27,3072,270],{}," 只用于适配旧接口，不要用它修改真正的 ",[27,3075,49],{}," 对象。",[23,3078,3079,3081],{},[27,3080,274],{}," 只放在非常底层、边界清晰的代码里，并集中封装。",[23,3083,3084],{},"不要为了少打几个字使用 C 风格强转。",[12,3086,3087],{"id":3087},"小结",[20,3089,3090,3095,3100,3110],{},[23,3091,3092,3094],{},[27,3093,263],{},"：常规转换，最常用。",[23,3096,3097,3099],{},[27,3098,267],{},"：多态类型安全向下转换。",[23,3101,3102,3104,3105,348,3107,3109],{},[27,3103,270],{},"：只改变 ",[27,3106,49],{},[27,3108,351],{}," 限定。",[23,3111,3112,3114],{},[27,3113,274],{},"：底层重解释，风险最高。",[16,3116,3117],{},"一句话记忆：能不用就不用；必须用时，把转换意图写清楚。",[3119,3120,3121],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":86,"searchDepth":113,"depth":113,"links":3123},[3124,3125,3129,3130,3131,3132,3133,3141,3142,3143,3144,3149,3150],{"id":14,"depth":113,"text":14},{"id":69,"depth":113,"text":69,"children":3126},[3127,3128],{"id":76,"depth":461,"text":76},{"id":195,"depth":461,"text":195},{"id":278,"depth":113,"text":278},{"id":374,"depth":113,"text":375},{"id":381,"depth":113,"text":381},{"id":419,"depth":113,"text":419},{"id":499,"depth":113,"text":499,"children":3134},[3135,3136,3137,3139],{"id":502,"depth":461,"text":503},{"id":780,"depth":461,"text":781},{"id":1176,"depth":461,"text":3138},"示例 3：const_cast 只改变 const 限定",{"id":1593,"depth":461,"text":3140},"示例 4：reinterpret_cast 做底层重解释",{"id":2531,"depth":113,"text":2531},{"id":2627,"depth":113,"text":2628},{"id":2806,"depth":113,"text":2807},{"id":2888,"depth":113,"text":2888,"children":3145},[3146,3147,3148],{"id":2891,"depth":461,"text":2892},{"id":2950,"depth":461,"text":2951},{"id":3006,"depth":461,"text":3007},{"id":3054,"depth":113,"text":3054},{"id":3087,"depth":113,"text":3087},0,"1900","2023-10-05","2023-10-05-cplusplus-jiao-xue","\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue","Cplusplus教学","md",false,{},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan",{"title":5,"description":86},"wiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","FUXl1FfDv1BFaemGhuHNoMQtWDZv5Oj_pHhLG6hiAOc",[3165,3171,3177,3183,3189,3195,3201,3207,3213,3219,3225,3231,3237,3243,3249,3255,3261,3267,3273,3279,3285,3291,3297,3303,3309,3315,3321,3327,3333,3339,3345,3351,3357,3363,3369,3375,3381,3387,3393,3395,3401,3406,3412,3417,3423,3429,3435,3441,3447,3453,3459,3465,3471,3477,3483,3489,3495,3501,3507,3513,3519,3525,3531,3537,3543,3549,3555,3561,3567,3573,3579,3585,3591,3597,3603,3609,3615,3621,3627,3633,3639,3645,3651,3657,3663,3669,3675,3681,3687,3693,3699,3705],{"path":3166,"stem":3167,"title":3168,"authors":3169,"date":3153,"chapterOrder":3170,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0100-c-kai-fa-huan-jing-da-jian-yu-ce-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0100-C++开发环境搭建与测试","C++开发环境搭建与测试",[7],"0100",{"path":3172,"stem":3173,"title":3174,"authors":3175,"date":3153,"chapterOrder":3176,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0200-c-ji-chu-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F0200-C++基础初识","C++基础初识",[7],"0200",{"path":3178,"stem":3179,"title":3180,"authors":3181,"date":3153,"chapterOrder":3182,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0300-shu-ju-lei-xing-yu-shu-ju-cun-fang","wiki\u002F2023-10-05-Cplusplus教学\u002F0300-数据类型与数据存放","数据类型与数据存放",[7],"0300",{"path":3184,"stem":3185,"title":3186,"authors":3187,"date":3153,"chapterOrder":3188,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0400-shu-ru-shu-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F0400-输入输出","输入输出",[7],"0400",{"path":3190,"stem":3191,"title":3192,"authors":3193,"date":3153,"chapterOrder":3194,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0500-yun-suan-fu","wiki\u002F2023-10-05-Cplusplus教学\u002F0500-运算符","运算符",[7],"0500",{"path":3196,"stem":3197,"title":3198,"authors":3199,"date":3153,"chapterOrder":3200,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0600-cheng-xu-liu-cheng-jie-gou","wiki\u002F2023-10-05-Cplusplus教学\u002F0600-程序流程结构","程序流程结构",[7],"0600",{"path":3202,"stem":3203,"title":3204,"authors":3205,"date":3153,"chapterOrder":3206,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","wiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","数组",[7],"0700",{"path":3208,"stem":3209,"title":3210,"authors":3211,"date":3153,"chapterOrder":3212,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0800-han-shu-yu-tou-wen-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F0800-函数与头文件","函数与头文件",[7],"0800",{"path":3214,"stem":3215,"title":3216,"authors":3217,"date":3153,"chapterOrder":3218,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","指针",[7],"0900",{"path":3220,"stem":3221,"title":3222,"authors":3223,"date":3153,"chapterOrder":3224,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1000-jie-gou-ti-yu-gong-yong-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F1000-结构体与共用体","结构体与共用体",[7],"1000",{"path":3226,"stem":3227,"title":3228,"authors":3229,"date":3153,"chapterOrder":3230,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1100-nei-cun-fen-qu-yu-sheng-ming-zhou-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1100-内存分区与生命周期","内存分区与生命周期",[7],"1100",{"path":3232,"stem":3233,"title":3234,"authors":3235,"date":3153,"chapterOrder":3236,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","wiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","引用",[7],"1200",{"path":3238,"stem":3239,"title":3240,"authors":3241,"date":3153,"chapterOrder":3242,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","wiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","函数提高",[7],"1300",{"path":3244,"stem":3245,"title":3246,"authors":3247,"date":3153,"chapterOrder":3248,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","wiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间",[7],"1350",{"path":3250,"stem":3251,"title":3252,"authors":3253,"date":3153,"chapterOrder":3254,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0100-feng-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0100-封装","封装",[7],"1400-0100",{"path":3256,"stem":3257,"title":3258,"authors":3259,"date":3153,"chapterOrder":3260,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0200-dui-xiang-chu-shi-hua-he-qing-li","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0200-对象初始化和清理","对象初始化和清理",[7],"1400-0200",{"path":3262,"stem":3263,"title":3264,"authors":3265,"date":3153,"chapterOrder":3266,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0300-dui-xiang-mo-xing-yu-this-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0300-对象模型与this指针","对象模型与this指针",[7],"1400-0300",{"path":3268,"stem":3269,"title":3270,"authors":3271,"date":3153,"chapterOrder":3272,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0400-you-yuan-yu-yun-suan-fu-zhong-zai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0400-友元与运算符重载","友元与运算符重载",[7],"1400-0400",{"path":3274,"stem":3275,"title":3276,"authors":3277,"date":3153,"chapterOrder":3278,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0500-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0500-继承","继承",[7],"1400-0500",{"path":3280,"stem":3281,"title":3282,"authors":3283,"date":3153,"chapterOrder":3284,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-0600-duo-tai","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-0600-多态","多态",[7],"1400-0600",{"path":3286,"stem":3287,"title":3288,"authors":3289,"date":3153,"chapterOrder":3290,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1400-lei-he-dui-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F1400-类和对象","类和对象",[7],"1400",{"path":3292,"stem":3293,"title":3294,"authors":3295,"date":3153,"chapterOrder":3296,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","函数指针",[7],"1450",{"path":3298,"stem":3299,"title":3300,"authors":3301,"date":3153,"chapterOrder":3302,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1500-wen-jian-cao-zuo","wiki\u002F2023-10-05-Cplusplus教学\u002F1500-文件操作","文件操作",[7],"1500",{"path":3304,"stem":3305,"title":3306,"authors":3307,"date":3153,"chapterOrder":3308,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1600-yi-chang-chu-li-yu-cuo-wu-ma","wiki\u002F2023-10-05-Cplusplus教学\u002F1600-异常处理与错误码","异常处理",[7],"1600",{"path":3310,"stem":3311,"title":3312,"authors":3313,"date":3153,"chapterOrder":3314,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","模板",[7],"1700",{"path":3316,"stem":3317,"title":3318,"authors":3319,"date":3153,"chapterOrder":3320,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0100-stl-chu-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0100-STL初识","STL初识",[7],"1800-0100",{"path":3322,"stem":3323,"title":3324,"authors":3325,"date":3153,"chapterOrder":3326,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0200-std-array","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0200-std-array","std::array",[7],"1800-0200",{"path":3328,"stem":3329,"title":3330,"authors":3331,"date":3153,"chapterOrder":3332,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0300-string-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0300-string容器","string容器",[7],"1800-0300",{"path":3334,"stem":3335,"title":3336,"authors":3337,"date":3153,"chapterOrder":3338,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0400-vector-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0400-vector容器","vector 容器",[7],"1800-0400",{"path":3340,"stem":3341,"title":3342,"authors":3343,"date":3153,"chapterOrder":3344,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0500-deque-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0500-deque容器","deque 容器",[7],"1800-0500",{"path":3346,"stem":3347,"title":3348,"authors":3349,"date":3153,"chapterOrder":3350,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0600-stack-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0600-stack容器","stack 容器",[7],"1800-0600",{"path":3352,"stem":3353,"title":3354,"authors":3355,"date":3153,"chapterOrder":3356,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0700-queue-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0700-queue容器","queue 容器",[7],"1800-0700",{"path":3358,"stem":3359,"title":3360,"authors":3361,"date":3153,"chapterOrder":3362,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0800-list-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0800-list容器","list 容器",[7],"1800-0800",{"path":3364,"stem":3365,"title":3366,"authors":3367,"date":3153,"chapterOrder":3368,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-0900-set-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-0900-set容器","set \u002F multiset 容器",[7],"1800-0900",{"path":3370,"stem":3371,"title":3372,"authors":3373,"date":3153,"chapterOrder":3374,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1000-map-rong-qi","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1000-map容器","map \u002F multimap 容器",[7],"1800-1000",{"path":3376,"stem":3377,"title":3378,"authors":3379,"date":3153,"chapterOrder":3380,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1100-han-shu-dui-xiang-yu-wei-ci","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1100-函数对象与谓词","函数对象与谓词",[7],"1800-1100",{"path":3382,"stem":3383,"title":3384,"authors":3385,"date":3153,"chapterOrder":3386,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-1200-chang-yong-suan-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-1200-常用算法","常用算法",[7],"1800-1200",{"path":3388,"stem":3389,"title":3390,"authors":3391,"date":3153,"chapterOrder":3392,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1800-stl-ti-gao-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F1800-STL提高编程","STL提高编程",[7],"1800",{"path":3160,"stem":3162,"title":5,"authors":3394,"date":3153,"chapterOrder":3152,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},[7],{"path":3396,"stem":3397,"title":3398,"authors":3399,"date":3153,"chapterOrder":3400,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","auto",[7],"2000-0100",{"path":3402,"stem":3403,"title":334,"authors":3404,"date":3153,"chapterOrder":3405,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0200-nullptr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0200-nullptr",[7],"2000-0200",{"path":3407,"stem":3408,"title":3409,"authors":3410,"date":3153,"chapterOrder":3411,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","using",[7],"2000-0300",{"path":3413,"stem":3414,"title":39,"authors":3415,"date":3153,"chapterOrder":3416,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0400-enum-class","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0400-enum-class",[7],"2000-0400",{"path":3418,"stem":3419,"title":3420,"authors":3421,"date":3153,"chapterOrder":3422,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0500-fan-wei-for-xun-huan","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0500-范围for循环","范围 for 循环",[7],"2000-0500",{"path":3424,"stem":3425,"title":3426,"authors":3427,"date":3153,"chapterOrder":3428,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0600-jie-gou-hua-bang-ding","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0600-结构化绑定","结构化绑定",[7],"2000-0600",{"path":3430,"stem":3431,"title":3432,"authors":3433,"date":3153,"chapterOrder":3434,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0700-constexpr","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0700-constexpr","constexpr",[7],"2000-0700",{"path":3436,"stem":3437,"title":3438,"authors":3439,"date":3153,"chapterOrder":3440,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0800-raii","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0800-RAII","RAII",[7],"2000-0800",{"path":3442,"stem":3443,"title":3444,"authors":3445,"date":3153,"chapterOrder":3446,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0900-zhi-neng-zhi-zhen","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-0900-智能指针","智能指针",[7],"2000-0900",{"path":3448,"stem":3449,"title":3450,"authors":3451,"date":3153,"chapterOrder":3452,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1000-you-zhi-yin-yong-he-yi-dong-yu-yi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1000-右值引用和移动语义","右值引用和移动语义",[7],"2000-1000",{"path":3454,"stem":3455,"title":3456,"authors":3457,"date":3153,"chapterOrder":3458,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1100-lambda-biao-da-shi","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1100-Lambda表达式","Lambda 表达式",[7],"2000-1100",{"path":3460,"stem":3461,"title":3462,"authors":3463,"date":3153,"chapterOrder":3464,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1200-std-function","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1200-std-function","std::function",[7],"2000-1200",{"path":3466,"stem":3467,"title":3468,"authors":3469,"date":3153,"chapterOrder":3470,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1300-std-bind","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1300-std-bind","std::bind",[7],"2000-1300",{"path":3472,"stem":3473,"title":3474,"authors":3475,"date":3153,"chapterOrder":3476,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1400-std-optional","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1400-std-optional","std::optional",[7],"2000-1400",{"path":3478,"stem":3479,"title":3480,"authors":3481,"date":3153,"chapterOrder":3482,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1500-std-variant","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1500-std-variant","std::variant",[7],"2000-1500",{"path":3484,"stem":3485,"title":3486,"authors":3487,"date":3153,"chapterOrder":3488,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1600-std-span","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1600-std-span","std::span",[7],"2000-1600",{"path":3490,"stem":3491,"title":3492,"authors":3493,"date":3153,"chapterOrder":3494,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1700-std-format-print","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1700-std-format-print","std::format \u002F std::print",[7],"2000-1700",{"path":3496,"stem":3497,"title":3498,"authors":3499,"date":3153,"chapterOrder":3500,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1800-std-chrono","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1800-std-chrono","std::chrono",[7],"2000-1800",{"path":3502,"stem":3503,"title":3504,"authors":3505,"date":3153,"chapterOrder":3506,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0100-bing-fa-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0100-并发是什么","并发是什么",[7],"2000-1900-0100",{"path":3508,"stem":3509,"title":3510,"authors":3511,"date":3153,"chapterOrder":3512,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0200-bing-xing-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0200-并行是什么","并行是什么",[7],"2000-1900-0200",{"path":3514,"stem":3515,"title":3516,"authors":3517,"date":3153,"chapterOrder":3518,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-0300-xie-cheng-shi-shen-me","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-0300-协程是什么","协程是什么",[7],"2000-1900-0300",{"path":3520,"stem":3521,"title":3522,"authors":3523,"date":3153,"chapterOrder":3524,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1000-bing-fa-bian-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1000-并发编程","并发编程",[7],"2000-1900-1000",{"path":3526,"stem":3527,"title":3528,"authors":3529,"date":3153,"chapterOrder":3530,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1100-std-thread","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1100-std-thread","std::thread",[7],"2000-1900-1100",{"path":3532,"stem":3533,"title":3534,"authors":3535,"date":3153,"chapterOrder":3536,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1200-mutex-lock-guard","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1200-mutex-lock-guard","mutex 与 RAII 锁",[7],"2000-1900-1200",{"path":3538,"stem":3539,"title":3540,"authors":3541,"date":3153,"chapterOrder":3542,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1300-std-atomic","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1300-std-atomic","std::atomic",[7],"2000-1900-1300",{"path":3544,"stem":3545,"title":3546,"authors":3547,"date":3153,"chapterOrder":3548,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1400-condition-variable","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1400-condition-variable","condition_variable",[7],"2000-1900-1400",{"path":3550,"stem":3551,"title":3552,"authors":3553,"date":3153,"chapterOrder":3554,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1500-future-async-promise","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1500-future-async-promise","future、async、promise 与 packaged_task",[7],"2000-1900-1500",{"path":3556,"stem":3557,"title":3558,"authors":3559,"date":3153,"chapterOrder":3560,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1600-jthread-stop-token","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1600-jthread-stop-token","jthread 与 stop_token",[7],"2000-1900-1600",{"path":3562,"stem":3563,"title":3564,"authors":3565,"date":3153,"chapterOrder":3566,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-1700-semaphore-latch-barrier","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-1700-semaphore-latch-barrier","semaphore、latch 与 barrier",[7],"2000-1900-1700",{"path":3568,"stem":3569,"title":3570,"authors":3571,"date":3153,"chapterOrder":3572,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-1900-bing-fa-bing-xing-yu-xie-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-1900-并发并行与协程","并发、并行与协程",[7],"2000-1900",{"path":3574,"stem":3575,"title":3576,"authors":3577,"date":3153,"chapterOrder":3578,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2000-std-filesystem","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2000-std-filesystem","std::filesystem",[7],"2000-2000",{"path":3580,"stem":3581,"title":3582,"authors":3583,"date":3153,"chapterOrder":3584,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-2100-modules-jian-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-2100-modules简介","modules 简介",[7],"2000-2100",{"path":3586,"stem":3587,"title":3588,"authors":3589,"date":3153,"chapterOrder":3590,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-xian-dai-c","wiki\u002F2023-10-05-Cplusplus教学\u002F2000-现代C++","现代C++",[7],"2000",{"path":3592,"stem":3593,"title":3594,"authors":3595,"date":3153,"chapterOrder":3596,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0100-ding-shi-qi-yu-yi-bu-io","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0100-定时器与异步IO","定时器与异步 IO",[7],"2100-0100-0100",{"path":3598,"stem":3599,"title":3600,"authors":3601,"date":3153,"chapterOrder":3602,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0200-boost-asio-ji-chu","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0200-Boost.Asio基础","Boost.Asio 基础",[7],"2100-0100-0200",{"path":3604,"stem":3605,"title":3606,"authors":3607,"date":3153,"chapterOrder":3608,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0300-chuan-kou-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0300-串口通信","串口通信教学",[7],"2100-0100-0300",{"path":3610,"stem":3611,"title":3612,"authors":3613,"date":3153,"chapterOrder":3614,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0350-chuan-kou-tong-xin-chuan-kou-bao-xie-yi-shi-li","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0350-串口通信串口包协议实例","串口通信串口包协议实例",[7],"2100-0100-0350",{"path":3616,"stem":3617,"title":3618,"authors":3619,"date":3153,"chapterOrder":3620,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0400-tcp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0400-TCP通信","TCP 通信",[7],"2100-0100-0400",{"path":3622,"stem":3623,"title":3624,"authors":3625,"date":3153,"chapterOrder":3626,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0500-udp-tong-xin","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0500-UDP通信","UDP 通信",[7],"2100-0100-0500",{"path":3628,"stem":3629,"title":3630,"authors":3631,"date":3153,"chapterOrder":3632,"chapterDepth":113,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-0600-ji-qi-ren-gong-cheng-xie-fa-yu-ros2-ji-cheng","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-0600-机器人工程写法与ROS2集成","机器人工程写法与 ROS2 集成",[7],"2100-0100-0600",{"path":3634,"stem":3635,"title":3636,"authors":3637,"date":3153,"chapterOrder":3638,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0100-boost-asio-yi-bu-io-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0100-Boost.Asio异步IO库","Boost.Asio异步IO库",[7],"2100-0100",{"path":3640,"stem":3641,"title":3642,"authors":3643,"date":3153,"chapterOrder":3644,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0200-eigen-xian-xing-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0200-Eigen线性代数库","Eigen线性代数库",[7],"2100-0200",{"path":3646,"stem":3647,"title":3648,"authors":3649,"date":3153,"chapterOrder":3650,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0300-opencv-ji-suan-ji-shi-jue-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0300-OpenCV计算机视觉库","OpenCV计算机视觉库",[7],"2100-0300",{"path":3652,"stem":3653,"title":3654,"authors":3655,"date":3153,"chapterOrder":3656,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0400-pcl-dian-yun-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0400-PCL点云库","PCL点云库",[7],"2100-0400",{"path":3658,"stem":3659,"title":3660,"authors":3661,"date":3153,"chapterOrder":3662,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-0500-sophus-li-qun-li-dai-shu-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-0500-Sophus李群李代数库","Sophus 李群李代数库",[7],"2100-0500",{"path":3664,"stem":3665,"title":3666,"authors":3667,"date":3153,"chapterOrder":3668,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2100-chang-yong-ku","wiki\u002F2023-10-05-Cplusplus教学\u002F2100-常用库","常用库学习",[7],"2100",{"path":3670,"stem":3671,"title":3672,"authors":3673,"date":3153,"chapterOrder":3674,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0100-cmakepresets-yu-gou-jian-an-zhuang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0100-CMakePresets与构建安装","CMakePresets与构建安装",[7],"2200-0100",{"path":3676,"stem":3677,"title":3678,"authors":3679,"date":3153,"chapterOrder":3680,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0200-ding-ceng-cmake-yu-gong-gong-bian-yi-xuan-xiang","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0200-顶层CMake与公共编译选项","顶层CMake与公共编译选项",[7],"2200-0200",{"path":3682,"stem":3683,"title":3684,"authors":3685,"date":3153,"chapterOrder":3686,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0300-src-yu-lib-mo-kuai-cmake-xiang-jie","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0300-src与lib模块CMake详解","src与lib模块CMake详解",[7],"2200-0300",{"path":3688,"stem":3689,"title":3690,"authors":3691,"date":3153,"chapterOrder":3692,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0400-di-san-fang-ku-yi-lai-xie-fa","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0400-第三方库依赖写法","第三方库依赖写法",[7],"2200-0400",{"path":3694,"stem":3695,"title":3696,"authors":3697,"date":3153,"chapterOrder":3698,"chapterDepth":93,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-0500-mu-ban-kuo-zhan-yu-chang-jian-wen-ti","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-0500-模板扩展与常见问题","模板扩展与常见问题",[7],"2200-0500",{"path":3700,"stem":3701,"title":3702,"authors":3703,"date":3153,"chapterOrder":3704,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":3158},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2200-cmake-gong-cheng-mu-ban","wiki\u002F2023-10-05-Cplusplus教学\u002F2200-CMake工程模板","CMake工程模板",[7],"2200",{"path":3155,"stem":3706,"title":3707,"authors":3708,"date":3153,"chapterOrder":3709,"chapterDepth":3151,"docKey":3154,"docRoot":3155,"docTitle":3156,"isWikiDoc":527,"isWikiIndex":527},"wiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++教程",[7],null,[3711,3713,3716,3719],{"name":7,"image":3712},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":3714,"image":3715},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":3717,"image":3718},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":3720,"image":3721},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431897892]