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