[{"data":1,"prerenderedAt":6520},["ShallowReactive",2],{"wiki-page-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen":3,"wiki-doc-items-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen":6093,"language-switcher-data-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen":6504,"wiki-i18n-paths-\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen":6519},{"id":4,"title":5,"body":6,"canonicalPath":6074,"chapterDepth":6075,"chapterOrder":6076,"date":6077,"description":85,"docI18nKey":6078,"docKey":6079,"docRoot":6080,"docTitle":6081,"extension":6082,"i18nKey":6083,"isBlogPost":6084,"isWikiDoc":337,"isWikiIndex":6084,"layout":6085,"legacyPath":6085,"locale":6086,"localeSlug":6087,"meta":6088,"navigation":337,"path":6074,"seo":6089,"sourcePath":6090,"sourceStem":6083,"stem":6091,"wikiDepth":92,"__hash__":6092},"content\u002F_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针.md","function pointer",{"type":7,"value":8,"toc":6031},"minimark",[9,13,37,41,44,51,54,61,66,71,76,79,122,125,145,148,157,166,178,190,193,209,212,260,265,269,284,287,314,319,586,591,599,608,612,615,619,879,883,889,894,898,901,905,1138,1142,1148,1152,1158,1161,1173,1177,1428,1432,1438,1446,1450,1453,1456,1527,1530,1534,1690,1694,1700,1704,1707,1710,1724,1737,1741,2039,2043,2049,2064,2068,2071,2074,2078,2285,2289,2295,2298,2302,2305,2315,2318,2333,2340,2365,2369,2375,2379,2548,2552,2558,2562,2576,2589,2593,2862,2866,2872,2875,2879,2885,2898,2902,3188,3192,3198,3208,3216,3225,3235,3239,3449,3453,3459,3462,3508,3512,3517,3524,3530,3542,3560,3564,3764,3768,3774,3788,3795,3799,3805,3822,3833,3863,3868,3872,4156,4160,4166,4173,4220,4228,4232,4241,4245,4600,4604,4610,4618,4622,4626,4629,4655,4662,4669,4673,4943,4947,4953,4956,4997,5000,5008,5014,5027,5031,5241,5245,5250,5258,5265,5269,5278,5299,5311,5315,5561,5565,5571,5580,5585,5592,5595,5598,5604,5607,5613,5616,5619,5623,5627,5670,5674,5706,5710,5768,5772,5845,5849,5901,5905,5963,5966,5971,5976,5981,5986,5991,6000,6007,6012,6020,6027],[10,11,5],"h2",{"id":12},"function-pointer",[14,15,16],"blockquote",{},[17,18,19,23,24,28,29,32,33,36],"p",{},[20,21,22],"strong",{},"阅读提示："," 本章前半部分只使用已经学过的函数、指针和类，需要按顺序掌握。后半部分会扩展到 ",[25,26,27],"code",{},"nullptr","、",[25,30,31],{},"using","、Lambda 和 ",[25,34,35],{},"std::function"," 等现代 C++ 特性。扩展部分会提前解释新语法和 API 的基本用法，但需要学完后面的“现代 C++”章节才能完全看懂。初次学习时可以先了解结论，暂时跳过扩展部分。",[38,39,40],"h3",{"id":40},"函数指针的基本概念",[17,42,43],{},"前面已经学习过：普通指针可以保存变量的地址，通过指针能够间接访问变量。",[17,45,46,47,50],{},"函数编译后也存放在内存中，因此函数同样有地址。",[20,48,49],{},"函数指针就是保存函数地址的指针变量","。通过函数指针，可以间接调用它所指向的函数。",[17,52,53],{},"函数指针常用于：",[55,56,57],"ul",{},[58,59,60],"li",{},"把一个函数传给另一个函数，也就是回调函数",[55,62,63],{},[58,64,65],{},"在程序运行过程中选择不同的处理函数",[55,67,68],{},[58,69,70],{},"把多个形式相同的函数放进表中统一管理",[55,72,73],{},[58,74,75],{},"保存并调用类的成员函数",[17,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 add(int a, int b);\n","cpp","",[25,87,88],{"__ignoreMap":85},[89,90,93,97,101,105,107,111,114,116,119],"span",{"class":91,"line":92},"line",1,[89,94,96],{"class":95},"szBVR","int",[89,98,100],{"class":99},"sScJk"," add",[89,102,104],{"class":103},"sVt8B","(",[89,106,96],{"class":95},[89,108,110],{"class":109},"s4XuR"," a",[89,112,113],{"class":103},", ",[89,115,96],{"class":95},[89,117,118],{"class":109}," b",[89,120,121],{"class":103},");\n",[17,123,124],{},"指向它的函数指针可以声明为：",[80,126,128],{"className":82,"code":127,"language":84,"meta":85,"style":85},"int (*function_pointer)(int, int);\n",[25,129,130],{"__ignoreMap":85},[89,131,132,134,137,139,141,143],{"class":91,"line":92},[89,133,96],{"class":95},[89,135,136],{"class":103}," (*function_pointer)(",[89,138,96],{"class":95},[89,140,113],{"class":103},[89,142,96],{"class":95},[89,144,121],{"class":103},[17,146,147],{},"这条声明可以从变量名向外阅读：",[149,150,151],"ol",{},[58,152,153,156],{},[25,154,155],{},"function_pointer"," 是变量名。",[149,158,160],{"start":159},2,[58,161,162,165],{},[25,163,164],{},"*function_pointer"," 说明它是一个指针。",[149,167,169],{"start":168},3,[58,170,171,174,175,177],{},[25,172,173],{},"(int, int)"," 说明它指向的函数接收两个 ",[25,176,96],{}," 参数。",[149,179,181],{"start":180},4,[58,182,183,184,186,187,189],{},"最前面的 ",[25,185,96],{}," 说明该函数返回一个 ",[25,188,96],{},"。",[17,191,192],{},"函数指针的基本语法为：",[80,194,196],{"className":82,"code":195,"language":84,"meta":85,"style":85},"返回值类型 (*函数指针变量名)(参数类型列表);\n",[25,197,198],{"__ignoreMap":85},[89,199,200,203,206],{"class":91,"line":92},[89,201,202],{"class":103},"返回值类型 (",[89,204,205],{"class":95},"*",[89,207,208],{"class":103},"函数指针变量名)(参数类型列表);\n",[17,210,211],{},"变量名两侧的括号不能省略：",[80,213,215],{"className":82,"code":214,"language":84,"meta":85,"style":85},"int (*operation)(int, int); \u002F\u002F operation 是函数指针\nint *operation(int, int);   \u002F\u002F operation 是函数，返回值是 int*\n",[25,216,217,237],{"__ignoreMap":85},[89,218,219,221,224,226,228,230,233],{"class":91,"line":92},[89,220,96],{"class":95},[89,222,223],{"class":103}," (*operation)(",[89,225,96],{"class":95},[89,227,113],{"class":103},[89,229,96],{"class":95},[89,231,232],{"class":103},");",[89,234,236],{"class":235},"sJ8bj"," \u002F\u002F operation 是函数指针\n",[89,238,239,241,244,247,249,251,253,255,257],{"class":91,"line":159},[89,240,96],{"class":95},[89,242,243],{"class":95}," *",[89,245,246],{"class":99},"operation",[89,248,104],{"class":103},[89,250,96],{"class":95},[89,252,113],{"class":103},[89,254,96],{"class":95},[89,256,232],{"class":103},[89,258,259],{"class":235},"   \u002F\u002F operation 是函数，返回值是 int*\n",[14,261,262],{},[17,263,264],{},"总结：函数指针类型不仅包含返回值类型，还包含完整的参数类型列表。",[38,266,268],{"id":267},"示例1保存函数地址并调用函数","示例1：保存函数地址并调用函数",[17,270,271,272,275,276,279,280,283],{},"函数名在大多数表达式中会自动转换为函数地址，因此可以直接把 ",[25,273,274],{},"add"," 赋给函数指针。也可以写成 ",[25,277,278],{},"&add","，其中 ",[25,281,282],{},"&"," 表示获取函数地址，两种写法效果相同。",[17,285,286],{},"通过函数指针调用函数也有两种写法：",[80,288,290],{"className":82,"code":289,"language":84,"meta":85,"style":85},"function_pointer(参数);    \u002F\u002F 推荐写法\n(*function_pointer)(参数); \u002F\u002F 先解引用再调用\n",[25,291,292,302],{"__ignoreMap":85},[89,293,294,296,299],{"class":91,"line":92},[89,295,155],{"class":99},[89,297,298],{"class":103},"(参数);",[89,300,301],{"class":235},"    \u002F\u002F 推荐写法\n",[89,303,304,306,308,311],{"class":91,"line":159},[89,305,104],{"class":103},[89,307,205],{"class":95},[89,309,310],{"class":103},"function_pointer)(参数);",[89,312,313],{"class":235}," \u002F\u002F 先解引用再调用\n",[17,315,316],{},[20,317,318],{},"Example:",[80,320,322],{"className":82,"code":321,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    int (*function_pointer)(int, int) = add;\n\n    std::cout \u003C\u003C function_pointer(3, 5) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C (*function_pointer)(10, 20) \u003C\u003C \"\\n\";\n\n    function_pointer = &add;\n    std::cout \u003C\u003C function_pointer(7, 8) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,323,324,333,339,360,365,380,386,391,402,407,430,435,477,514,519,533,566,571,581],{"__ignoreMap":85},[89,325,326,329],{"class":91,"line":92},[89,327,328],{"class":95},"#include",[89,330,332],{"class":331},"sZZnC"," \u003Ciostream>\n",[89,334,335],{"class":91,"line":159},[89,336,338],{"emptyLinePlaceholder":337},true,"\n",[89,340,341,343,345,347,349,351,353,355,357],{"class":91,"line":168},[89,342,96],{"class":95},[89,344,100],{"class":99},[89,346,104],{"class":103},[89,348,96],{"class":95},[89,350,110],{"class":109},[89,352,113],{"class":103},[89,354,96],{"class":95},[89,356,118],{"class":109},[89,358,359],{"class":103},")\n",[89,361,362],{"class":91,"line":180},[89,363,364],{"class":103},"{\n",[89,366,368,371,374,377],{"class":91,"line":367},5,[89,369,370],{"class":95},"    return",[89,372,373],{"class":103}," a ",[89,375,376],{"class":95},"+",[89,378,379],{"class":103}," b;\n",[89,381,383],{"class":91,"line":382},6,[89,384,385],{"class":103},"}\n",[89,387,389],{"class":91,"line":388},7,[89,390,338],{"emptyLinePlaceholder":337},[89,392,394,396,399],{"class":91,"line":393},8,[89,395,96],{"class":95},[89,397,398],{"class":99}," main",[89,400,401],{"class":103},"()\n",[89,403,405],{"class":91,"line":404},9,[89,406,364],{"class":103},[89,408,410,413,415,417,419,421,424,427],{"class":91,"line":409},10,[89,411,412],{"class":95},"    int",[89,414,136],{"class":103},[89,416,96],{"class":95},[89,418,113],{"class":103},[89,420,96],{"class":95},[89,422,423],{"class":103},") ",[89,425,426],{"class":95},"=",[89,428,429],{"class":103}," add;\n",[89,431,433],{"class":91,"line":432},11,[89,434,338],{"emptyLinePlaceholder":337},[89,436,438,441,444,447,450,452,456,458,461,463,465,468,471,474],{"class":91,"line":437},12,[89,439,440],{"class":99},"    std",[89,442,443],{"class":103},"::cout ",[89,445,446],{"class":95},"\u003C\u003C",[89,448,449],{"class":99}," function_pointer",[89,451,104],{"class":103},[89,453,455],{"class":454},"sj4cs","3",[89,457,113],{"class":103},[89,459,460],{"class":454},"5",[89,462,423],{"class":103},[89,464,446],{"class":95},[89,466,467],{"class":331}," \"",[89,469,470],{"class":454},"\\n",[89,472,473],{"class":331},"\"",[89,475,476],{"class":103},";\n",[89,478,480,482,484,486,489,491,494,497,499,502,504,506,508,510,512],{"class":91,"line":479},13,[89,481,440],{"class":99},[89,483,443],{"class":103},[89,485,446],{"class":95},[89,487,488],{"class":103}," (",[89,490,205],{"class":95},[89,492,493],{"class":103},"function_pointer)(",[89,495,496],{"class":454},"10",[89,498,113],{"class":103},[89,500,501],{"class":454},"20",[89,503,423],{"class":103},[89,505,446],{"class":95},[89,507,467],{"class":331},[89,509,470],{"class":454},[89,511,473],{"class":331},[89,513,476],{"class":103},[89,515,517],{"class":91,"line":516},14,[89,518,338],{"emptyLinePlaceholder":337},[89,520,522,525,527,530],{"class":91,"line":521},15,[89,523,524],{"class":103},"    function_pointer ",[89,526,426],{"class":95},[89,528,529],{"class":95}," &",[89,531,532],{"class":103},"add;\n",[89,534,536,538,540,542,544,546,549,551,554,556,558,560,562,564],{"class":91,"line":535},16,[89,537,440],{"class":99},[89,539,443],{"class":103},[89,541,446],{"class":95},[89,543,449],{"class":99},[89,545,104],{"class":103},[89,547,548],{"class":454},"7",[89,550,113],{"class":103},[89,552,553],{"class":454},"8",[89,555,423],{"class":103},[89,557,446],{"class":95},[89,559,467],{"class":331},[89,561,470],{"class":454},[89,563,473],{"class":331},[89,565,476],{"class":103},[89,567,569],{"class":91,"line":568},17,[89,570,338],{"emptyLinePlaceholder":337},[89,572,574,576,579],{"class":91,"line":573},18,[89,575,370],{"class":95},[89,577,578],{"class":454}," 0",[89,580,476],{"class":103},[89,582,584],{"class":91,"line":583},19,[89,585,385],{"class":103},[17,587,588],{},[20,589,590],{},"运行结果：",[80,592,597],{"className":593,"code":595,"language":596,"meta":85},[594],"language-text","8\n30\n15\n","text",[25,598,595],{"__ignoreMap":85},[14,600,601],{},[17,602,603,604,607],{},"总结：通常直接用函数名赋值，并使用 ",[25,605,606],{},"function_pointer(...)"," 调用，代码更简洁。",[38,609,611],{"id":610},"示例2函数指针类型必须匹配","示例2：函数指针类型必须匹配",[17,613,614],{},"函数指针只能指向类型兼容的函数。返回值类型和每个参数的类型都要匹配。",[17,616,617],{},[20,618,318],{},[80,620,622],{"className":82,"code":621,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\ndouble divide(double a, double b)\n{\n    return a \u002F b;\n}\n\nint main()\n{\n    int (*integer_operation)(int, int) = add;\n    double (*decimal_operation)(double, double) = divide;\n\n    std::cout \u003C\u003C integer_operation(4, 6) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C decimal_operation(7.0, 2.0) \u003C\u003C \"\\n\";\n\n    \u002F\u002F integer_operation = divide;\n    \u002F\u002F 错误：divide 的类型是 double(double, double)，类型不匹配\n\n    return 0;\n}\n",[25,623,624,630,634,654,658,668,672,676,698,702,713,717,721,729,733,752,773,777,810,843,848,854,860,865,874],{"__ignoreMap":85},[89,625,626,628],{"class":91,"line":92},[89,627,328],{"class":95},[89,629,332],{"class":331},[89,631,632],{"class":91,"line":159},[89,633,338],{"emptyLinePlaceholder":337},[89,635,636,638,640,642,644,646,648,650,652],{"class":91,"line":168},[89,637,96],{"class":95},[89,639,100],{"class":99},[89,641,104],{"class":103},[89,643,96],{"class":95},[89,645,110],{"class":109},[89,647,113],{"class":103},[89,649,96],{"class":95},[89,651,118],{"class":109},[89,653,359],{"class":103},[89,655,656],{"class":91,"line":180},[89,657,364],{"class":103},[89,659,660,662,664,666],{"class":91,"line":367},[89,661,370],{"class":95},[89,663,373],{"class":103},[89,665,376],{"class":95},[89,667,379],{"class":103},[89,669,670],{"class":91,"line":382},[89,671,385],{"class":103},[89,673,674],{"class":91,"line":388},[89,675,338],{"emptyLinePlaceholder":337},[89,677,678,681,684,686,688,690,692,694,696],{"class":91,"line":393},[89,679,680],{"class":95},"double",[89,682,683],{"class":99}," divide",[89,685,104],{"class":103},[89,687,680],{"class":95},[89,689,110],{"class":109},[89,691,113],{"class":103},[89,693,680],{"class":95},[89,695,118],{"class":109},[89,697,359],{"class":103},[89,699,700],{"class":91,"line":404},[89,701,364],{"class":103},[89,703,704,706,708,711],{"class":91,"line":409},[89,705,370],{"class":95},[89,707,373],{"class":103},[89,709,710],{"class":95},"\u002F",[89,712,379],{"class":103},[89,714,715],{"class":91,"line":432},[89,716,385],{"class":103},[89,718,719],{"class":91,"line":437},[89,720,338],{"emptyLinePlaceholder":337},[89,722,723,725,727],{"class":91,"line":479},[89,724,96],{"class":95},[89,726,398],{"class":99},[89,728,401],{"class":103},[89,730,731],{"class":91,"line":516},[89,732,364],{"class":103},[89,734,735,737,740,742,744,746,748,750],{"class":91,"line":521},[89,736,412],{"class":95},[89,738,739],{"class":103}," (*integer_operation)(",[89,741,96],{"class":95},[89,743,113],{"class":103},[89,745,96],{"class":95},[89,747,423],{"class":103},[89,749,426],{"class":95},[89,751,429],{"class":103},[89,753,754,757,760,762,764,766,768,770],{"class":91,"line":535},[89,755,756],{"class":95},"    double",[89,758,759],{"class":103}," (*decimal_operation)(",[89,761,680],{"class":95},[89,763,113],{"class":103},[89,765,680],{"class":95},[89,767,423],{"class":103},[89,769,426],{"class":95},[89,771,772],{"class":103}," divide;\n",[89,774,775],{"class":91,"line":568},[89,776,338],{"emptyLinePlaceholder":337},[89,778,779,781,783,785,788,790,793,795,798,800,802,804,806,808],{"class":91,"line":573},[89,780,440],{"class":99},[89,782,443],{"class":103},[89,784,446],{"class":95},[89,786,787],{"class":99}," integer_operation",[89,789,104],{"class":103},[89,791,792],{"class":454},"4",[89,794,113],{"class":103},[89,796,797],{"class":454},"6",[89,799,423],{"class":103},[89,801,446],{"class":95},[89,803,467],{"class":331},[89,805,470],{"class":454},[89,807,473],{"class":331},[89,809,476],{"class":103},[89,811,812,814,816,818,821,823,826,828,831,833,835,837,839,841],{"class":91,"line":583},[89,813,440],{"class":99},[89,815,443],{"class":103},[89,817,446],{"class":95},[89,819,820],{"class":99}," decimal_operation",[89,822,104],{"class":103},[89,824,825],{"class":454},"7.0",[89,827,113],{"class":103},[89,829,830],{"class":454},"2.0",[89,832,423],{"class":103},[89,834,446],{"class":95},[89,836,467],{"class":331},[89,838,470],{"class":454},[89,840,473],{"class":331},[89,842,476],{"class":103},[89,844,846],{"class":91,"line":845},20,[89,847,338],{"emptyLinePlaceholder":337},[89,849,851],{"class":91,"line":850},21,[89,852,853],{"class":235},"    \u002F\u002F integer_operation = divide;\n",[89,855,857],{"class":91,"line":856},22,[89,858,859],{"class":235},"    \u002F\u002F 错误：divide 的类型是 double(double, double)，类型不匹配\n",[89,861,863],{"class":91,"line":862},23,[89,864,338],{"emptyLinePlaceholder":337},[89,866,868,870,872],{"class":91,"line":867},24,[89,869,370],{"class":95},[89,871,578],{"class":454},[89,873,476],{"class":103},[89,875,877],{"class":91,"line":876},25,[89,878,385],{"class":103},[17,880,881],{},[20,882,590],{},[80,884,887],{"className":885,"code":886,"language":596,"meta":85},[594],"10\n3.5\n",[25,888,886],{"__ignoreMap":85},[14,890,891],{},[17,892,893],{},"注意：不要依赖参数调用时可能发生的隐式类型转换。函数本身的类型必须与函数指针类型兼容。",[38,895,897],{"id":896},"示例3运行时切换不同的函数","示例3：运行时切换不同的函数",[17,899,900],{},"只要函数类型相同，一个函数指针就可以在不同时间指向不同函数。这可以把“选择执行哪个操作”和“执行操作”分开。",[17,902,903],{},[20,904,318],{},[80,906,908],{"className":82,"code":907,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint subtract(int a, int b)\n{\n    return a - b;\n}\n\nint main()\n{\n    int (*operation)(int, int) = add;\n    std::cout \u003C\u003C \"add: \" \u003C\u003C operation(10, 4) \u003C\u003C \"\\n\";\n\n    operation = subtract;\n    std::cout \u003C\u003C \"subtract: \" \u003C\u003C operation(10, 4) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,909,910,916,920,940,944,954,958,962,983,987,998,1002,1006,1014,1018,1036,1073,1077,1087,1122,1126,1134],{"__ignoreMap":85},[89,911,912,914],{"class":91,"line":92},[89,913,328],{"class":95},[89,915,332],{"class":331},[89,917,918],{"class":91,"line":159},[89,919,338],{"emptyLinePlaceholder":337},[89,921,922,924,926,928,930,932,934,936,938],{"class":91,"line":168},[89,923,96],{"class":95},[89,925,100],{"class":99},[89,927,104],{"class":103},[89,929,96],{"class":95},[89,931,110],{"class":109},[89,933,113],{"class":103},[89,935,96],{"class":95},[89,937,118],{"class":109},[89,939,359],{"class":103},[89,941,942],{"class":91,"line":180},[89,943,364],{"class":103},[89,945,946,948,950,952],{"class":91,"line":367},[89,947,370],{"class":95},[89,949,373],{"class":103},[89,951,376],{"class":95},[89,953,379],{"class":103},[89,955,956],{"class":91,"line":382},[89,957,385],{"class":103},[89,959,960],{"class":91,"line":388},[89,961,338],{"emptyLinePlaceholder":337},[89,963,964,966,969,971,973,975,977,979,981],{"class":91,"line":393},[89,965,96],{"class":95},[89,967,968],{"class":99}," subtract",[89,970,104],{"class":103},[89,972,96],{"class":95},[89,974,110],{"class":109},[89,976,113],{"class":103},[89,978,96],{"class":95},[89,980,118],{"class":109},[89,982,359],{"class":103},[89,984,985],{"class":91,"line":404},[89,986,364],{"class":103},[89,988,989,991,993,996],{"class":91,"line":409},[89,990,370],{"class":95},[89,992,373],{"class":103},[89,994,995],{"class":95},"-",[89,997,379],{"class":103},[89,999,1000],{"class":91,"line":432},[89,1001,385],{"class":103},[89,1003,1004],{"class":91,"line":437},[89,1005,338],{"emptyLinePlaceholder":337},[89,1007,1008,1010,1012],{"class":91,"line":479},[89,1009,96],{"class":95},[89,1011,398],{"class":99},[89,1013,401],{"class":103},[89,1015,1016],{"class":91,"line":516},[89,1017,364],{"class":103},[89,1019,1020,1022,1024,1026,1028,1030,1032,1034],{"class":91,"line":521},[89,1021,412],{"class":95},[89,1023,223],{"class":103},[89,1025,96],{"class":95},[89,1027,113],{"class":103},[89,1029,96],{"class":95},[89,1031,423],{"class":103},[89,1033,426],{"class":95},[89,1035,429],{"class":103},[89,1037,1038,1040,1042,1044,1047,1050,1053,1055,1057,1059,1061,1063,1065,1067,1069,1071],{"class":91,"line":535},[89,1039,440],{"class":99},[89,1041,443],{"class":103},[89,1043,446],{"class":95},[89,1045,1046],{"class":331}," \"add: \"",[89,1048,1049],{"class":95}," \u003C\u003C",[89,1051,1052],{"class":99}," operation",[89,1054,104],{"class":103},[89,1056,496],{"class":454},[89,1058,113],{"class":103},[89,1060,792],{"class":454},[89,1062,423],{"class":103},[89,1064,446],{"class":95},[89,1066,467],{"class":331},[89,1068,470],{"class":454},[89,1070,473],{"class":331},[89,1072,476],{"class":103},[89,1074,1075],{"class":91,"line":568},[89,1076,338],{"emptyLinePlaceholder":337},[89,1078,1079,1082,1084],{"class":91,"line":573},[89,1080,1081],{"class":103},"    operation ",[89,1083,426],{"class":95},[89,1085,1086],{"class":103}," subtract;\n",[89,1088,1089,1091,1093,1095,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120],{"class":91,"line":583},[89,1090,440],{"class":99},[89,1092,443],{"class":103},[89,1094,446],{"class":95},[89,1096,1097],{"class":331}," \"subtract: \"",[89,1099,1049],{"class":95},[89,1101,1052],{"class":99},[89,1103,104],{"class":103},[89,1105,496],{"class":454},[89,1107,113],{"class":103},[89,1109,792],{"class":454},[89,1111,423],{"class":103},[89,1113,446],{"class":95},[89,1115,467],{"class":331},[89,1117,470],{"class":454},[89,1119,473],{"class":331},[89,1121,476],{"class":103},[89,1123,1124],{"class":91,"line":845},[89,1125,338],{"emptyLinePlaceholder":337},[89,1127,1128,1130,1132],{"class":91,"line":850},[89,1129,370],{"class":95},[89,1131,578],{"class":454},[89,1133,476],{"class":103},[89,1135,1136],{"class":91,"line":856},[89,1137,385],{"class":103},[17,1139,1140],{},[20,1141,590],{},[80,1143,1146],{"className":1144,"code":1145,"language":596,"meta":85},[594],"add: 14\nsubtract: 6\n",[25,1147,1145],{"__ignoreMap":85},[38,1149,1151],{"id":1150},"示例4把函数指针作为参数回调函数","示例4：把函数指针作为参数——回调函数",[17,1153,1154,1155,189],{},"函数指针也可以作为另一个函数的参数。被传入并由其他代码调用的函数通常称为",[20,1156,1157],{},"回调函数",[17,1159,1160],{},"回调函数不是一种新的函数类型。“回调”描述的是函数的使用方式：调用者把函数地址交给另一段代码，另一段代码在需要时调用这个函数。",[17,1162,1163,1164,1167,1168,1170,1171,189],{},"下面的 ",[25,1165,1166],{},"calculate"," 不关心具体执行加法还是乘法，只要求传入的函数能够接收两个 ",[25,1169,96],{}," 并返回 ",[25,1172,96],{},[17,1174,1175],{},[20,1176,318],{},[80,1178,1180],{"className":82,"code":1179,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint multiply(int a, int b)\n{\n    return a * b;\n}\n\nint calculate(int a, int b, int (*operation)(int, int))\n{\n    return operation(a, b);\n}\n\nint main()\n{\n    std::cout \u003C\u003C calculate(6, 4, add) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C calculate(6, 4, multiply) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,1181,1182,1188,1192,1212,1216,1226,1230,1234,1255,1259,1269,1273,1277,1317,1321,1330,1334,1338,1346,1350,1381,1412,1416,1424],{"__ignoreMap":85},[89,1183,1184,1186],{"class":91,"line":92},[89,1185,328],{"class":95},[89,1187,332],{"class":331},[89,1189,1190],{"class":91,"line":159},[89,1191,338],{"emptyLinePlaceholder":337},[89,1193,1194,1196,1198,1200,1202,1204,1206,1208,1210],{"class":91,"line":168},[89,1195,96],{"class":95},[89,1197,100],{"class":99},[89,1199,104],{"class":103},[89,1201,96],{"class":95},[89,1203,110],{"class":109},[89,1205,113],{"class":103},[89,1207,96],{"class":95},[89,1209,118],{"class":109},[89,1211,359],{"class":103},[89,1213,1214],{"class":91,"line":180},[89,1215,364],{"class":103},[89,1217,1218,1220,1222,1224],{"class":91,"line":367},[89,1219,370],{"class":95},[89,1221,373],{"class":103},[89,1223,376],{"class":95},[89,1225,379],{"class":103},[89,1227,1228],{"class":91,"line":382},[89,1229,385],{"class":103},[89,1231,1232],{"class":91,"line":388},[89,1233,338],{"emptyLinePlaceholder":337},[89,1235,1236,1238,1241,1243,1245,1247,1249,1251,1253],{"class":91,"line":393},[89,1237,96],{"class":95},[89,1239,1240],{"class":99}," multiply",[89,1242,104],{"class":103},[89,1244,96],{"class":95},[89,1246,110],{"class":109},[89,1248,113],{"class":103},[89,1250,96],{"class":95},[89,1252,118],{"class":109},[89,1254,359],{"class":103},[89,1256,1257],{"class":91,"line":404},[89,1258,364],{"class":103},[89,1260,1261,1263,1265,1267],{"class":91,"line":409},[89,1262,370],{"class":95},[89,1264,373],{"class":103},[89,1266,205],{"class":95},[89,1268,379],{"class":103},[89,1270,1271],{"class":91,"line":432},[89,1272,385],{"class":103},[89,1274,1275],{"class":91,"line":437},[89,1276,338],{"emptyLinePlaceholder":337},[89,1278,1279,1281,1284,1286,1288,1290,1292,1294,1296,1298,1300,1303,1305,1308,1310,1312,1314],{"class":91,"line":479},[89,1280,96],{"class":95},[89,1282,1283],{"class":99}," calculate",[89,1285,104],{"class":103},[89,1287,96],{"class":95},[89,1289,110],{"class":109},[89,1291,113],{"class":103},[89,1293,96],{"class":95},[89,1295,118],{"class":109},[89,1297,113],{"class":103},[89,1299,96],{"class":95},[89,1301,1302],{"class":103}," (*",[89,1304,246],{"class":109},[89,1306,1307],{"class":103},")(",[89,1309,96],{"class":95},[89,1311,113],{"class":103},[89,1313,96],{"class":95},[89,1315,1316],{"class":103},"))\n",[89,1318,1319],{"class":91,"line":516},[89,1320,364],{"class":103},[89,1322,1323,1325,1327],{"class":91,"line":521},[89,1324,370],{"class":95},[89,1326,1052],{"class":99},[89,1328,1329],{"class":103},"(a, b);\n",[89,1331,1332],{"class":91,"line":535},[89,1333,385],{"class":103},[89,1335,1336],{"class":91,"line":568},[89,1337,338],{"emptyLinePlaceholder":337},[89,1339,1340,1342,1344],{"class":91,"line":573},[89,1341,96],{"class":95},[89,1343,398],{"class":99},[89,1345,401],{"class":103},[89,1347,1348],{"class":91,"line":583},[89,1349,364],{"class":103},[89,1351,1352,1354,1356,1358,1360,1362,1364,1366,1368,1371,1373,1375,1377,1379],{"class":91,"line":845},[89,1353,440],{"class":99},[89,1355,443],{"class":103},[89,1357,446],{"class":95},[89,1359,1283],{"class":99},[89,1361,104],{"class":103},[89,1363,797],{"class":454},[89,1365,113],{"class":103},[89,1367,792],{"class":454},[89,1369,1370],{"class":103},", add) ",[89,1372,446],{"class":95},[89,1374,467],{"class":331},[89,1376,470],{"class":454},[89,1378,473],{"class":331},[89,1380,476],{"class":103},[89,1382,1383,1385,1387,1389,1391,1393,1395,1397,1399,1402,1404,1406,1408,1410],{"class":91,"line":850},[89,1384,440],{"class":99},[89,1386,443],{"class":103},[89,1388,446],{"class":95},[89,1390,1283],{"class":99},[89,1392,104],{"class":103},[89,1394,797],{"class":454},[89,1396,113],{"class":103},[89,1398,792],{"class":454},[89,1400,1401],{"class":103},", multiply) ",[89,1403,446],{"class":95},[89,1405,467],{"class":331},[89,1407,470],{"class":454},[89,1409,473],{"class":331},[89,1411,476],{"class":103},[89,1413,1414],{"class":91,"line":856},[89,1415,338],{"emptyLinePlaceholder":337},[89,1417,1418,1420,1422],{"class":91,"line":862},[89,1419,370],{"class":95},[89,1421,578],{"class":454},[89,1423,476],{"class":103},[89,1425,1426],{"class":91,"line":867},[89,1427,385],{"class":103},[17,1429,1430],{},[20,1431,590],{},[80,1433,1436],{"className":1434,"code":1435,"language":596,"meta":85},[594],"10\n24\n",[25,1437,1435],{"__ignoreMap":85},[14,1439,1440],{},[17,1441,1442,1443,1445],{},"总结：回调可以让 ",[25,1444,1166],{}," 保持不变，只通过传入不同函数来改变计算行为。",[38,1447,1449],{"id":1448},"示例5函数指针作为参数时也可以省略参数名","示例5：函数指针作为参数时也可以省略参数名",[17,1451,1452],{},"函数声明只需要告诉编译器参数类型，不一定要写参数名。函数指针参数也遵守这个规则。",[17,1454,1455],{},"下面两条函数声明含义相同：",[80,1457,1459],{"className":82,"code":1458,"language":84,"meta":85,"style":85},"int calculate(int a, int b, int (*operation)(int, int));\nint calculate(int, int, int (*)(int, int));\n",[25,1460,1461,1498],{"__ignoreMap":85},[89,1462,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495],{"class":91,"line":92},[89,1464,96],{"class":95},[89,1466,1283],{"class":99},[89,1468,104],{"class":103},[89,1470,96],{"class":95},[89,1472,110],{"class":109},[89,1474,113],{"class":103},[89,1476,96],{"class":95},[89,1478,118],{"class":109},[89,1480,113],{"class":103},[89,1482,96],{"class":95},[89,1484,1302],{"class":103},[89,1486,246],{"class":109},[89,1488,1307],{"class":103},[89,1490,96],{"class":95},[89,1492,113],{"class":103},[89,1494,96],{"class":95},[89,1496,1497],{"class":103},"));\n",[89,1499,1500,1502,1504,1506,1508,1510,1512,1514,1516,1519,1521,1523,1525],{"class":91,"line":159},[89,1501,96],{"class":95},[89,1503,1283],{"class":99},[89,1505,104],{"class":103},[89,1507,96],{"class":95},[89,1509,113],{"class":103},[89,1511,96],{"class":95},[89,1513,113],{"class":103},[89,1515,96],{"class":95},[89,1517,1518],{"class":103}," (*)(",[89,1520,96],{"class":95},[89,1522,113],{"class":103},[89,1524,96],{"class":95},[89,1526,1497],{"class":103},[17,1528,1529],{},"第一种写法更容易阅读，通常建议在教程、头文件和函数定义中保留有意义的参数名。",[17,1531,1532],{},[20,1533,318],{},[80,1535,1537],{"className":82,"code":1536,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nvoid print_number(int value)\n{\n    std::cout \u003C\u003C value \u003C\u003C \"\\n\";\n}\n\nvoid run_twice(int value, void (*callback)(int))\n{\n    callback(value);\n    callback(value);\n}\n\nint main()\n{\n    run_twice(42, print_number);\n    return 0;\n}\n",[25,1538,1539,1545,1549,1566,1570,1591,1595,1599,1627,1631,1639,1645,1649,1653,1661,1665,1678,1686],{"__ignoreMap":85},[89,1540,1541,1543],{"class":91,"line":92},[89,1542,328],{"class":95},[89,1544,332],{"class":331},[89,1546,1547],{"class":91,"line":159},[89,1548,338],{"emptyLinePlaceholder":337},[89,1550,1551,1554,1557,1559,1561,1564],{"class":91,"line":168},[89,1552,1553],{"class":95},"void",[89,1555,1556],{"class":99}," print_number",[89,1558,104],{"class":103},[89,1560,96],{"class":95},[89,1562,1563],{"class":109}," value",[89,1565,359],{"class":103},[89,1567,1568],{"class":91,"line":180},[89,1569,364],{"class":103},[89,1571,1572,1574,1576,1578,1581,1583,1585,1587,1589],{"class":91,"line":367},[89,1573,440],{"class":99},[89,1575,443],{"class":103},[89,1577,446],{"class":95},[89,1579,1580],{"class":103}," value ",[89,1582,446],{"class":95},[89,1584,467],{"class":331},[89,1586,470],{"class":454},[89,1588,473],{"class":331},[89,1590,476],{"class":103},[89,1592,1593],{"class":91,"line":382},[89,1594,385],{"class":103},[89,1596,1597],{"class":91,"line":388},[89,1598,338],{"emptyLinePlaceholder":337},[89,1600,1601,1603,1606,1608,1610,1612,1614,1616,1618,1621,1623,1625],{"class":91,"line":393},[89,1602,1553],{"class":95},[89,1604,1605],{"class":99}," run_twice",[89,1607,104],{"class":103},[89,1609,96],{"class":95},[89,1611,1563],{"class":109},[89,1613,113],{"class":103},[89,1615,1553],{"class":95},[89,1617,1302],{"class":103},[89,1619,1620],{"class":109},"callback",[89,1622,1307],{"class":103},[89,1624,96],{"class":95},[89,1626,1316],{"class":103},[89,1628,1629],{"class":91,"line":404},[89,1630,364],{"class":103},[89,1632,1633,1636],{"class":91,"line":409},[89,1634,1635],{"class":99},"    callback",[89,1637,1638],{"class":103},"(value);\n",[89,1640,1641,1643],{"class":91,"line":432},[89,1642,1635],{"class":99},[89,1644,1638],{"class":103},[89,1646,1647],{"class":91,"line":437},[89,1648,385],{"class":103},[89,1650,1651],{"class":91,"line":479},[89,1652,338],{"emptyLinePlaceholder":337},[89,1654,1655,1657,1659],{"class":91,"line":516},[89,1656,96],{"class":95},[89,1658,398],{"class":99},[89,1660,401],{"class":103},[89,1662,1663],{"class":91,"line":521},[89,1664,364],{"class":103},[89,1666,1667,1670,1672,1675],{"class":91,"line":535},[89,1668,1669],{"class":99},"    run_twice",[89,1671,104],{"class":103},[89,1673,1674],{"class":454},"42",[89,1676,1677],{"class":103},", print_number);\n",[89,1679,1680,1682,1684],{"class":91,"line":568},[89,1681,370],{"class":95},[89,1683,578],{"class":454},[89,1685,476],{"class":103},[89,1687,1688],{"class":91,"line":573},[89,1689,385],{"class":103},[17,1691,1692],{},[20,1693,590],{},[80,1695,1698],{"className":1696,"code":1697,"language":596,"meta":85},[594],"42\n42\n",[25,1699,1697],{"__ignoreMap":85},[38,1701,1703],{"id":1702},"示例6函数指针数组","示例6：函数指针数组",[17,1705,1706],{},"如果多个函数拥有相同类型，就可以把它们的地址保存在同一个数组中，再通过数组下标选择函数。",[17,1708,1709],{},"函数指针数组的基本语法为：",[80,1711,1713],{"className":82,"code":1712,"language":84,"meta":85,"style":85},"返回值类型 (*数组名[元素个数])(参数类型列表);\n",[25,1714,1715],{"__ignoreMap":85},[89,1716,1717,1719,1721],{"class":91,"line":92},[89,1718,202],{"class":103},[89,1720,205],{"class":95},[89,1722,1723],{"class":103},"数组名[元素个数])(参数类型列表);\n",[17,1725,1726,1727,28,1730,1733,1734,189],{},"数组下标必须在有效范围内。下面的数组有 3 个元素，因此有效下标是 ",[25,1728,1729],{},"0",[25,1731,1732],{},"1"," 和 ",[25,1735,1736],{},"2",[17,1738,1739],{},[20,1740,318],{},[80,1742,1744],{"className":82,"code":1743,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint subtract(int a, int b)\n{\n    return a - b;\n}\n\nint multiply(int a, int b)\n{\n    return a * b;\n}\n\nint main()\n{\n    int (*operations[3])(int, int) = {add, subtract, multiply};\n\n    std::cout \u003C\u003C operations[0](8, 2) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C operations[1](8, 2) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C operations[2](8, 2) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,1745,1746,1752,1756,1776,1780,1790,1794,1798,1818,1822,1832,1836,1840,1860,1864,1874,1878,1882,1890,1894,1919,1923,1957,1989,2021,2025,2034],{"__ignoreMap":85},[89,1747,1748,1750],{"class":91,"line":92},[89,1749,328],{"class":95},[89,1751,332],{"class":331},[89,1753,1754],{"class":91,"line":159},[89,1755,338],{"emptyLinePlaceholder":337},[89,1757,1758,1760,1762,1764,1766,1768,1770,1772,1774],{"class":91,"line":168},[89,1759,96],{"class":95},[89,1761,100],{"class":99},[89,1763,104],{"class":103},[89,1765,96],{"class":95},[89,1767,110],{"class":109},[89,1769,113],{"class":103},[89,1771,96],{"class":95},[89,1773,118],{"class":109},[89,1775,359],{"class":103},[89,1777,1778],{"class":91,"line":180},[89,1779,364],{"class":103},[89,1781,1782,1784,1786,1788],{"class":91,"line":367},[89,1783,370],{"class":95},[89,1785,373],{"class":103},[89,1787,376],{"class":95},[89,1789,379],{"class":103},[89,1791,1792],{"class":91,"line":382},[89,1793,385],{"class":103},[89,1795,1796],{"class":91,"line":388},[89,1797,338],{"emptyLinePlaceholder":337},[89,1799,1800,1802,1804,1806,1808,1810,1812,1814,1816],{"class":91,"line":393},[89,1801,96],{"class":95},[89,1803,968],{"class":99},[89,1805,104],{"class":103},[89,1807,96],{"class":95},[89,1809,110],{"class":109},[89,1811,113],{"class":103},[89,1813,96],{"class":95},[89,1815,118],{"class":109},[89,1817,359],{"class":103},[89,1819,1820],{"class":91,"line":404},[89,1821,364],{"class":103},[89,1823,1824,1826,1828,1830],{"class":91,"line":409},[89,1825,370],{"class":95},[89,1827,373],{"class":103},[89,1829,995],{"class":95},[89,1831,379],{"class":103},[89,1833,1834],{"class":91,"line":432},[89,1835,385],{"class":103},[89,1837,1838],{"class":91,"line":437},[89,1839,338],{"emptyLinePlaceholder":337},[89,1841,1842,1844,1846,1848,1850,1852,1854,1856,1858],{"class":91,"line":479},[89,1843,96],{"class":95},[89,1845,1240],{"class":99},[89,1847,104],{"class":103},[89,1849,96],{"class":95},[89,1851,110],{"class":109},[89,1853,113],{"class":103},[89,1855,96],{"class":95},[89,1857,118],{"class":109},[89,1859,359],{"class":103},[89,1861,1862],{"class":91,"line":516},[89,1863,364],{"class":103},[89,1865,1866,1868,1870,1872],{"class":91,"line":521},[89,1867,370],{"class":95},[89,1869,373],{"class":103},[89,1871,205],{"class":95},[89,1873,379],{"class":103},[89,1875,1876],{"class":91,"line":535},[89,1877,385],{"class":103},[89,1879,1880],{"class":91,"line":568},[89,1881,338],{"emptyLinePlaceholder":337},[89,1883,1884,1886,1888],{"class":91,"line":573},[89,1885,96],{"class":95},[89,1887,398],{"class":99},[89,1889,401],{"class":103},[89,1891,1892],{"class":91,"line":583},[89,1893,364],{"class":103},[89,1895,1896,1898,1901,1903,1906,1908,1910,1912,1914,1916],{"class":91,"line":845},[89,1897,412],{"class":95},[89,1899,1900],{"class":103}," (*operations[",[89,1902,455],{"class":454},[89,1904,1905],{"class":103},"])(",[89,1907,96],{"class":95},[89,1909,113],{"class":103},[89,1911,96],{"class":95},[89,1913,423],{"class":103},[89,1915,426],{"class":95},[89,1917,1918],{"class":103}," {add, subtract, multiply};\n",[89,1920,1921],{"class":91,"line":850},[89,1922,338],{"emptyLinePlaceholder":337},[89,1924,1925,1927,1929,1931,1934,1936,1939,1941,1943,1945,1947,1949,1951,1953,1955],{"class":91,"line":856},[89,1926,440],{"class":99},[89,1928,443],{"class":103},[89,1930,446],{"class":95},[89,1932,1933],{"class":103}," operations[",[89,1935,1729],{"class":454},[89,1937,1938],{"class":103},"](",[89,1940,553],{"class":454},[89,1942,113],{"class":103},[89,1944,1736],{"class":454},[89,1946,423],{"class":103},[89,1948,446],{"class":95},[89,1950,467],{"class":331},[89,1952,470],{"class":454},[89,1954,473],{"class":331},[89,1956,476],{"class":103},[89,1958,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987],{"class":91,"line":862},[89,1960,440],{"class":99},[89,1962,443],{"class":103},[89,1964,446],{"class":95},[89,1966,1933],{"class":103},[89,1968,1732],{"class":454},[89,1970,1938],{"class":103},[89,1972,553],{"class":454},[89,1974,113],{"class":103},[89,1976,1736],{"class":454},[89,1978,423],{"class":103},[89,1980,446],{"class":95},[89,1982,467],{"class":331},[89,1984,470],{"class":454},[89,1986,473],{"class":331},[89,1988,476],{"class":103},[89,1990,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019],{"class":91,"line":867},[89,1992,440],{"class":99},[89,1994,443],{"class":103},[89,1996,446],{"class":95},[89,1998,1933],{"class":103},[89,2000,1736],{"class":454},[89,2002,1938],{"class":103},[89,2004,553],{"class":454},[89,2006,113],{"class":103},[89,2008,1736],{"class":454},[89,2010,423],{"class":103},[89,2012,446],{"class":95},[89,2014,467],{"class":331},[89,2016,470],{"class":454},[89,2018,473],{"class":331},[89,2020,476],{"class":103},[89,2022,2023],{"class":91,"line":876},[89,2024,338],{"emptyLinePlaceholder":337},[89,2026,2028,2030,2032],{"class":91,"line":2027},26,[89,2029,370],{"class":95},[89,2031,578],{"class":454},[89,2033,476],{"class":103},[89,2035,2037],{"class":91,"line":2036},27,[89,2038,385],{"class":103},[17,2040,2041],{},[20,2042,590],{},[80,2044,2047],{"className":2045,"code":2046,"language":596,"meta":85},[594],"10\n6\n16\n",[25,2048,2046],{"__ignoreMap":85},[17,2050,2051,2052,2055,2056,2059,2060,2063],{},"这种根据下标选择行为的写法称为",[20,2053,2054],{},"表驱动","。它可以减少很长的 ",[25,2057,2058],{},"if...else"," 或 ",[25,2061,2062],{},"switch","，但使用下标前必须检查范围。",[38,2065,2067],{"id":2066},"示例7函数重载与函数指针","示例7：函数重载与函数指针",[17,2069,2070],{},"前面已经学习过函数重载：多个函数可以使用同一个名字，只要参数列表不同。",[17,2072,2073],{},"当重载函数名赋给类型明确的函数指针时，编译器会根据函数指针的类型选择匹配的重载版本。",[17,2075,2076],{},[20,2077,318],{},[80,2079,2081],{"className":82,"code":2080,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint square(int value)\n{\n    return value * value;\n}\n\ndouble square(double value)\n{\n    return value * value;\n}\n\nint main()\n{\n    int (*integer_square)(int) = square;\n    double (*decimal_square)(double) = square;\n\n    std::cout \u003C\u003C integer_square(5) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C decimal_square(1.5) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,2082,2083,2089,2093,2108,2112,2123,2127,2131,2145,2149,2159,2163,2167,2175,2179,2195,2210,2214,2241,2269,2273,2281],{"__ignoreMap":85},[89,2084,2085,2087],{"class":91,"line":92},[89,2086,328],{"class":95},[89,2088,332],{"class":331},[89,2090,2091],{"class":91,"line":159},[89,2092,338],{"emptyLinePlaceholder":337},[89,2094,2095,2097,2100,2102,2104,2106],{"class":91,"line":168},[89,2096,96],{"class":95},[89,2098,2099],{"class":99}," square",[89,2101,104],{"class":103},[89,2103,96],{"class":95},[89,2105,1563],{"class":109},[89,2107,359],{"class":103},[89,2109,2110],{"class":91,"line":180},[89,2111,364],{"class":103},[89,2113,2114,2116,2118,2120],{"class":91,"line":367},[89,2115,370],{"class":95},[89,2117,1580],{"class":103},[89,2119,205],{"class":95},[89,2121,2122],{"class":103}," value;\n",[89,2124,2125],{"class":91,"line":382},[89,2126,385],{"class":103},[89,2128,2129],{"class":91,"line":388},[89,2130,338],{"emptyLinePlaceholder":337},[89,2132,2133,2135,2137,2139,2141,2143],{"class":91,"line":393},[89,2134,680],{"class":95},[89,2136,2099],{"class":99},[89,2138,104],{"class":103},[89,2140,680],{"class":95},[89,2142,1563],{"class":109},[89,2144,359],{"class":103},[89,2146,2147],{"class":91,"line":404},[89,2148,364],{"class":103},[89,2150,2151,2153,2155,2157],{"class":91,"line":409},[89,2152,370],{"class":95},[89,2154,1580],{"class":103},[89,2156,205],{"class":95},[89,2158,2122],{"class":103},[89,2160,2161],{"class":91,"line":432},[89,2162,385],{"class":103},[89,2164,2165],{"class":91,"line":437},[89,2166,338],{"emptyLinePlaceholder":337},[89,2168,2169,2171,2173],{"class":91,"line":479},[89,2170,96],{"class":95},[89,2172,398],{"class":99},[89,2174,401],{"class":103},[89,2176,2177],{"class":91,"line":516},[89,2178,364],{"class":103},[89,2180,2181,2183,2186,2188,2190,2192],{"class":91,"line":521},[89,2182,412],{"class":95},[89,2184,2185],{"class":103}," (*integer_square)(",[89,2187,96],{"class":95},[89,2189,423],{"class":103},[89,2191,426],{"class":95},[89,2193,2194],{"class":103}," square;\n",[89,2196,2197,2199,2202,2204,2206,2208],{"class":91,"line":535},[89,2198,756],{"class":95},[89,2200,2201],{"class":103}," (*decimal_square)(",[89,2203,680],{"class":95},[89,2205,423],{"class":103},[89,2207,426],{"class":95},[89,2209,2194],{"class":103},[89,2211,2212],{"class":91,"line":568},[89,2213,338],{"emptyLinePlaceholder":337},[89,2215,2216,2218,2220,2222,2225,2227,2229,2231,2233,2235,2237,2239],{"class":91,"line":573},[89,2217,440],{"class":99},[89,2219,443],{"class":103},[89,2221,446],{"class":95},[89,2223,2224],{"class":99}," integer_square",[89,2226,104],{"class":103},[89,2228,460],{"class":454},[89,2230,423],{"class":103},[89,2232,446],{"class":95},[89,2234,467],{"class":331},[89,2236,470],{"class":454},[89,2238,473],{"class":331},[89,2240,476],{"class":103},[89,2242,2243,2245,2247,2249,2252,2254,2257,2259,2261,2263,2265,2267],{"class":91,"line":583},[89,2244,440],{"class":99},[89,2246,443],{"class":103},[89,2248,446],{"class":95},[89,2250,2251],{"class":99}," decimal_square",[89,2253,104],{"class":103},[89,2255,2256],{"class":454},"1.5",[89,2258,423],{"class":103},[89,2260,446],{"class":95},[89,2262,467],{"class":331},[89,2264,470],{"class":454},[89,2266,473],{"class":331},[89,2268,476],{"class":103},[89,2270,2271],{"class":91,"line":845},[89,2272,338],{"emptyLinePlaceholder":337},[89,2274,2275,2277,2279],{"class":91,"line":850},[89,2276,370],{"class":95},[89,2278,578],{"class":454},[89,2280,476],{"class":103},[89,2282,2283],{"class":91,"line":856},[89,2284,385],{"class":103},[17,2286,2287],{},[20,2288,590],{},[80,2290,2293],{"className":2291,"code":2292,"language":596,"meta":85},[594],"25\n2.25\n",[25,2294,2292],{"__ignoreMap":85},[17,2296,2297],{},"如果没有足够的类型信息，单独写一个重载函数名可能产生二义性。现代 C++ 扩展部分会介绍如何使用显式类型转换进一步指定重载版本。",[10,2299,2301],{"id":2300},"pointer-to-member-function","pointer to member function",[38,2303,2304],{"id":2304},"普通函数指针与成员函数指针的区别",[17,2306,2307,2308,2311,2312,189],{},"非静态成员函数必须依附某个对象调用，因为函数内部可能访问该对象的数据成员和 ",[25,2309,2310],{},"this"," 指针。因此，非静态成员函数不能保存在普通函数指针中，需要使用",[20,2313,2314],{},"成员函数指针",[17,2316,2317],{},"成员函数指针的类型中必须写出它所属的类：",[80,2319,2321],{"className":82,"code":2320,"language":84,"meta":85,"style":85},"返回值类型 (类名::*指针变量名)(参数类型列表);\n",[25,2322,2323],{"__ignoreMap":85},[89,2324,2325,2328,2330],{"class":91,"line":92},[89,2326,2327],{"class":103},"返回值类型 (类名::",[89,2329,205],{"class":95},[89,2331,2332],{"class":103},"指针变量名)(参数类型列表);\n",[17,2334,2335,2336,2339],{},"取得成员函数地址时必须写 ",[25,2337,2338],{},"&类名::函数名","。调用时还需要提供一个对象：",[80,2341,2343],{"className":82,"code":2342,"language":84,"meta":85,"style":85},"(对象.*成员函数指针)(参数);\n(对象指针->*成员函数指针)(参数);\n",[25,2344,2345,2355],{"__ignoreMap":85},[89,2346,2347,2350,2352],{"class":91,"line":92},[89,2348,2349],{"class":103},"(对象.",[89,2351,205],{"class":95},[89,2353,2354],{"class":103},"成员函数指针)(参数);\n",[89,2356,2357,2360,2363],{"class":91,"line":159},[89,2358,2359],{"class":103},"(对象指针",[89,2361,2362],{"class":95},"->*",[89,2364,2354],{"class":103},[38,2366,2368],{"id":2367},"示例8静态成员函数使用普通函数指针","示例8：静态成员函数使用普通函数指针",[17,2370,2371,2372,2374],{},"静态成员函数属于类，但不依附某个具体对象，也没有 ",[25,2373,2310],{}," 指针。因此，可以使用普通函数指针保存静态成员函数的地址。",[17,2376,2377],{},[20,2378,318],{},[80,2380,2382],{"className":82,"code":2381,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nclass Calculator\n{\npublic:\n    static int add(int a, int b)\n    {\n        return a + b;\n    }\n};\n\nint main()\n{\n    int (*operation)(int, int) = &Calculator::add;\n    std::cout \u003C\u003C operation(6, 9) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,2383,2384,2390,2394,2402,2406,2411,2435,2440,2451,2456,2461,2465,2473,2477,2501,2532,2536,2544],{"__ignoreMap":85},[89,2385,2386,2388],{"class":91,"line":92},[89,2387,328],{"class":95},[89,2389,332],{"class":331},[89,2391,2392],{"class":91,"line":159},[89,2393,338],{"emptyLinePlaceholder":337},[89,2395,2396,2399],{"class":91,"line":168},[89,2397,2398],{"class":95},"class",[89,2400,2401],{"class":99}," Calculator\n",[89,2403,2404],{"class":91,"line":180},[89,2405,364],{"class":103},[89,2407,2408],{"class":91,"line":367},[89,2409,2410],{"class":95},"public:\n",[89,2412,2413,2416,2419,2421,2423,2425,2427,2429,2431,2433],{"class":91,"line":382},[89,2414,2415],{"class":95},"    static",[89,2417,2418],{"class":95}," int",[89,2420,100],{"class":99},[89,2422,104],{"class":103},[89,2424,96],{"class":95},[89,2426,110],{"class":109},[89,2428,113],{"class":103},[89,2430,96],{"class":95},[89,2432,118],{"class":109},[89,2434,359],{"class":103},[89,2436,2437],{"class":91,"line":388},[89,2438,2439],{"class":103},"    {\n",[89,2441,2442,2445,2447,2449],{"class":91,"line":393},[89,2443,2444],{"class":95},"        return",[89,2446,373],{"class":103},[89,2448,376],{"class":95},[89,2450,379],{"class":103},[89,2452,2453],{"class":91,"line":404},[89,2454,2455],{"class":103},"    }\n",[89,2457,2458],{"class":91,"line":409},[89,2459,2460],{"class":103},"};\n",[89,2462,2463],{"class":91,"line":432},[89,2464,338],{"emptyLinePlaceholder":337},[89,2466,2467,2469,2471],{"class":91,"line":437},[89,2468,96],{"class":95},[89,2470,398],{"class":99},[89,2472,401],{"class":103},[89,2474,2475],{"class":91,"line":479},[89,2476,364],{"class":103},[89,2478,2479,2481,2483,2485,2487,2489,2491,2493,2495,2498],{"class":91,"line":516},[89,2480,412],{"class":95},[89,2482,223],{"class":103},[89,2484,96],{"class":95},[89,2486,113],{"class":103},[89,2488,96],{"class":95},[89,2490,423],{"class":103},[89,2492,426],{"class":95},[89,2494,529],{"class":95},[89,2496,2497],{"class":99},"Calculator",[89,2499,2500],{"class":103},"::add;\n",[89,2502,2503,2505,2507,2509,2511,2513,2515,2517,2520,2522,2524,2526,2528,2530],{"class":91,"line":521},[89,2504,440],{"class":99},[89,2506,443],{"class":103},[89,2508,446],{"class":95},[89,2510,1052],{"class":99},[89,2512,104],{"class":103},[89,2514,797],{"class":454},[89,2516,113],{"class":103},[89,2518,2519],{"class":454},"9",[89,2521,423],{"class":103},[89,2523,446],{"class":95},[89,2525,467],{"class":331},[89,2527,470],{"class":454},[89,2529,473],{"class":331},[89,2531,476],{"class":103},[89,2533,2534],{"class":91,"line":535},[89,2535,338],{"emptyLinePlaceholder":337},[89,2537,2538,2540,2542],{"class":91,"line":568},[89,2539,370],{"class":95},[89,2541,578],{"class":454},[89,2543,476],{"class":103},[89,2545,2546],{"class":91,"line":573},[89,2547,385],{"class":103},[17,2549,2550],{},[20,2551,590],{},[80,2553,2556],{"className":2554,"code":2555,"language":596,"meta":85},[594],"15\n",[25,2557,2555],{"__ignoreMap":85},[38,2559,2561],{"id":2560},"示例9通过对象调用非静态成员函数指针","示例9：通过对象调用非静态成员函数指针",[17,2563,1163,2564,2567,2568,2571,2572,2575],{},[25,2565,2566],{},"scale"," 是非静态成员函数，会访问当前对象的 ",[25,2569,2570],{},"factor_","，因此调用时必须指定一个 ",[25,2573,2574],{},"Multiplier"," 对象。",[17,2577,2578,2579,2582,2583,2586,2587,189],{},"运算符 ",[25,2580,2581],{},".*"," 表示“通过对象使用成员指针”。调用表达式外层的括号不能省略，因为函数调用运算符 ",[25,2584,2585],{},"()"," 的优先级高于 ",[25,2588,2581],{},[17,2590,2591],{},[20,2592,318],{},[80,2594,2596],{"className":82,"code":2595,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nclass Multiplier\n{\nprivate:\n    int factor_;\n\npublic:\n    Multiplier(int factor)\n        : factor_(factor)\n    {\n    }\n\n    int scale(int value)\n    {\n        return value * factor_;\n    }\n};\n\nint main()\n{\n    int (Multiplier::*operation)(int) = &Multiplier::scale;\n\n    Multiplier twice(2);\n    Multiplier triple(3);\n\n    std::cout \u003C\u003C (twice.*operation)(5) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C (triple.*operation)(5) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,2597,2598,2604,2608,2615,2619,2624,2631,2635,2639,2653,2663,2667,2671,2675,2690,2694,2704,2708,2712,2716,2724,2728,2757,2761,2775,2788,2792,2817,2843,2848,2857],{"__ignoreMap":85},[89,2599,2600,2602],{"class":91,"line":92},[89,2601,328],{"class":95},[89,2603,332],{"class":331},[89,2605,2606],{"class":91,"line":159},[89,2607,338],{"emptyLinePlaceholder":337},[89,2609,2610,2612],{"class":91,"line":168},[89,2611,2398],{"class":95},[89,2613,2614],{"class":99}," Multiplier\n",[89,2616,2617],{"class":91,"line":180},[89,2618,364],{"class":103},[89,2620,2621],{"class":91,"line":367},[89,2622,2623],{"class":95},"private:\n",[89,2625,2626,2628],{"class":91,"line":382},[89,2627,412],{"class":95},[89,2629,2630],{"class":103}," factor_;\n",[89,2632,2633],{"class":91,"line":388},[89,2634,338],{"emptyLinePlaceholder":337},[89,2636,2637],{"class":91,"line":393},[89,2638,2410],{"class":95},[89,2640,2641,2644,2646,2648,2651],{"class":91,"line":404},[89,2642,2643],{"class":99},"    Multiplier",[89,2645,104],{"class":103},[89,2647,96],{"class":95},[89,2649,2650],{"class":109}," factor",[89,2652,359],{"class":103},[89,2654,2655,2658,2660],{"class":91,"line":409},[89,2656,2657],{"class":103},"        : ",[89,2659,2570],{"class":99},[89,2661,2662],{"class":103},"(factor)\n",[89,2664,2665],{"class":91,"line":432},[89,2666,2439],{"class":103},[89,2668,2669],{"class":91,"line":437},[89,2670,2455],{"class":103},[89,2672,2673],{"class":91,"line":479},[89,2674,338],{"emptyLinePlaceholder":337},[89,2676,2677,2679,2682,2684,2686,2688],{"class":91,"line":516},[89,2678,412],{"class":95},[89,2680,2681],{"class":99}," scale",[89,2683,104],{"class":103},[89,2685,96],{"class":95},[89,2687,1563],{"class":109},[89,2689,359],{"class":103},[89,2691,2692],{"class":91,"line":521},[89,2693,2439],{"class":103},[89,2695,2696,2698,2700,2702],{"class":91,"line":535},[89,2697,2444],{"class":95},[89,2699,1580],{"class":103},[89,2701,205],{"class":95},[89,2703,2630],{"class":103},[89,2705,2706],{"class":91,"line":568},[89,2707,2455],{"class":103},[89,2709,2710],{"class":91,"line":573},[89,2711,2460],{"class":103},[89,2713,2714],{"class":91,"line":583},[89,2715,338],{"emptyLinePlaceholder":337},[89,2717,2718,2720,2722],{"class":91,"line":845},[89,2719,96],{"class":95},[89,2721,398],{"class":99},[89,2723,401],{"class":103},[89,2725,2726],{"class":91,"line":850},[89,2727,364],{"class":103},[89,2729,2730,2732,2734,2736,2739,2741,2744,2746,2748,2750,2752,2754],{"class":91,"line":856},[89,2731,412],{"class":95},[89,2733,488],{"class":103},[89,2735,2574],{"class":99},[89,2737,2738],{"class":103},"::",[89,2740,205],{"class":95},[89,2742,2743],{"class":103},"operation)(",[89,2745,96],{"class":95},[89,2747,423],{"class":103},[89,2749,426],{"class":95},[89,2751,529],{"class":95},[89,2753,2574],{"class":99},[89,2755,2756],{"class":103},"::scale;\n",[89,2758,2759],{"class":91,"line":862},[89,2760,338],{"emptyLinePlaceholder":337},[89,2762,2763,2766,2769,2771,2773],{"class":91,"line":867},[89,2764,2765],{"class":103},"    Multiplier ",[89,2767,2768],{"class":99},"twice",[89,2770,104],{"class":103},[89,2772,1736],{"class":454},[89,2774,121],{"class":103},[89,2776,2777,2779,2782,2784,2786],{"class":91,"line":876},[89,2778,2765],{"class":103},[89,2780,2781],{"class":99},"triple",[89,2783,104],{"class":103},[89,2785,455],{"class":454},[89,2787,121],{"class":103},[89,2789,2790],{"class":91,"line":2027},[89,2791,338],{"emptyLinePlaceholder":337},[89,2793,2794,2796,2798,2800,2803,2805,2807,2809,2811,2813,2815],{"class":91,"line":2036},[89,2795,440],{"class":99},[89,2797,443],{"class":103},[89,2799,446],{"class":95},[89,2801,2802],{"class":103}," (twice.*operation)(",[89,2804,460],{"class":454},[89,2806,423],{"class":103},[89,2808,446],{"class":95},[89,2810,467],{"class":331},[89,2812,470],{"class":454},[89,2814,473],{"class":331},[89,2816,476],{"class":103},[89,2818,2820,2822,2824,2826,2829,2831,2833,2835,2837,2839,2841],{"class":91,"line":2819},28,[89,2821,440],{"class":99},[89,2823,443],{"class":103},[89,2825,446],{"class":95},[89,2827,2828],{"class":103}," (triple.*operation)(",[89,2830,460],{"class":454},[89,2832,423],{"class":103},[89,2834,446],{"class":95},[89,2836,467],{"class":331},[89,2838,470],{"class":454},[89,2840,473],{"class":331},[89,2842,476],{"class":103},[89,2844,2846],{"class":91,"line":2845},29,[89,2847,338],{"emptyLinePlaceholder":337},[89,2849,2851,2853,2855],{"class":91,"line":2850},30,[89,2852,370],{"class":95},[89,2854,578],{"class":454},[89,2856,476],{"class":103},[89,2858,2860],{"class":91,"line":2859},31,[89,2861,385],{"class":103},[17,2863,2864],{},[20,2865,590],{},[80,2867,2870],{"className":2868,"code":2869,"language":596,"meta":85},[594],"10\n15\n",[25,2871,2869],{"__ignoreMap":85},[17,2873,2874],{},"同一个成员函数指针配合不同对象调用时，会访问各个对象自己的数据。",[38,2876,2878],{"id":2877},"示例10通过对象指针调用成员函数指针","示例10：通过对象指针调用成员函数指针",[17,2880,2881,2882,2884],{},"如果手中保存的是对象指针，需要使用 ",[25,2883,2362],{}," 运算符。",[80,2886,2888],{"className":82,"code":2887,"language":84,"meta":85,"style":85},"(对象指针->*成员函数指针)(参数);\n",[25,2889,2890],{"__ignoreMap":85},[89,2891,2892,2894,2896],{"class":91,"line":92},[89,2893,2359],{"class":103},[89,2895,2362],{"class":95},[89,2897,2354],{"class":103},[17,2899,2900],{},[20,2901,318],{},[80,2903,2905],{"className":82,"code":2904,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nclass Counter\n{\nprivate:\n    int value_;\n\npublic:\n    Counter()\n        : value_(0)\n    {\n    }\n\n    void add(int amount)\n    {\n        value_ += amount;\n    }\n\n    int value()\n    {\n        return value_;\n    }\n};\n\nint main()\n{\n    void (Counter::*action)(int) = &Counter::add;\n\n    Counter counter;\n    Counter* object_pointer = &counter;\n\n    (object_pointer->*action)(5);\n    (object_pointer->*action)(7);\n\n    std::cout \u003C\u003C counter.value() \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,2906,2907,2913,2917,2924,2928,2932,2939,2943,2947,2954,2967,2971,2975,2979,2995,2999,3010,3014,3018,3026,3030,3036,3040,3044,3048,3056,3060,3088,3092,3097,3113,3117,3127,3136,3141,3169,3174,3183],{"__ignoreMap":85},[89,2908,2909,2911],{"class":91,"line":92},[89,2910,328],{"class":95},[89,2912,332],{"class":331},[89,2914,2915],{"class":91,"line":159},[89,2916,338],{"emptyLinePlaceholder":337},[89,2918,2919,2921],{"class":91,"line":168},[89,2920,2398],{"class":95},[89,2922,2923],{"class":99}," Counter\n",[89,2925,2926],{"class":91,"line":180},[89,2927,364],{"class":103},[89,2929,2930],{"class":91,"line":367},[89,2931,2623],{"class":95},[89,2933,2934,2936],{"class":91,"line":382},[89,2935,412],{"class":95},[89,2937,2938],{"class":103}," value_;\n",[89,2940,2941],{"class":91,"line":388},[89,2942,338],{"emptyLinePlaceholder":337},[89,2944,2945],{"class":91,"line":393},[89,2946,2410],{"class":95},[89,2948,2949,2952],{"class":91,"line":404},[89,2950,2951],{"class":99},"    Counter",[89,2953,401],{"class":103},[89,2955,2956,2958,2961,2963,2965],{"class":91,"line":409},[89,2957,2657],{"class":103},[89,2959,2960],{"class":99},"value_",[89,2962,104],{"class":103},[89,2964,1729],{"class":454},[89,2966,359],{"class":103},[89,2968,2969],{"class":91,"line":432},[89,2970,2439],{"class":103},[89,2972,2973],{"class":91,"line":437},[89,2974,2455],{"class":103},[89,2976,2977],{"class":91,"line":479},[89,2978,338],{"emptyLinePlaceholder":337},[89,2980,2981,2984,2986,2988,2990,2993],{"class":91,"line":516},[89,2982,2983],{"class":95},"    void",[89,2985,100],{"class":99},[89,2987,104],{"class":103},[89,2989,96],{"class":95},[89,2991,2992],{"class":109}," amount",[89,2994,359],{"class":103},[89,2996,2997],{"class":91,"line":521},[89,2998,2439],{"class":103},[89,3000,3001,3004,3007],{"class":91,"line":535},[89,3002,3003],{"class":103},"        value_ ",[89,3005,3006],{"class":95},"+=",[89,3008,3009],{"class":103}," amount;\n",[89,3011,3012],{"class":91,"line":568},[89,3013,2455],{"class":103},[89,3015,3016],{"class":91,"line":573},[89,3017,338],{"emptyLinePlaceholder":337},[89,3019,3020,3022,3024],{"class":91,"line":583},[89,3021,412],{"class":95},[89,3023,1563],{"class":99},[89,3025,401],{"class":103},[89,3027,3028],{"class":91,"line":845},[89,3029,2439],{"class":103},[89,3031,3032,3034],{"class":91,"line":850},[89,3033,2444],{"class":95},[89,3035,2938],{"class":103},[89,3037,3038],{"class":91,"line":856},[89,3039,2455],{"class":103},[89,3041,3042],{"class":91,"line":862},[89,3043,2460],{"class":103},[89,3045,3046],{"class":91,"line":867},[89,3047,338],{"emptyLinePlaceholder":337},[89,3049,3050,3052,3054],{"class":91,"line":876},[89,3051,96],{"class":95},[89,3053,398],{"class":99},[89,3055,401],{"class":103},[89,3057,3058],{"class":91,"line":2027},[89,3059,364],{"class":103},[89,3061,3062,3064,3066,3069,3071,3073,3076,3078,3080,3082,3084,3086],{"class":91,"line":2036},[89,3063,2983],{"class":95},[89,3065,488],{"class":103},[89,3067,3068],{"class":99},"Counter",[89,3070,2738],{"class":103},[89,3072,205],{"class":95},[89,3074,3075],{"class":103},"action)(",[89,3077,96],{"class":95},[89,3079,423],{"class":103},[89,3081,426],{"class":95},[89,3083,529],{"class":95},[89,3085,3068],{"class":99},[89,3087,2500],{"class":103},[89,3089,3090],{"class":91,"line":2819},[89,3091,338],{"emptyLinePlaceholder":337},[89,3093,3094],{"class":91,"line":2845},[89,3095,3096],{"class":103},"    Counter counter;\n",[89,3098,3099,3101,3103,3106,3108,3110],{"class":91,"line":2850},[89,3100,2951],{"class":103},[89,3102,205],{"class":95},[89,3104,3105],{"class":103}," object_pointer ",[89,3107,426],{"class":95},[89,3109,529],{"class":95},[89,3111,3112],{"class":103},"counter;\n",[89,3114,3115],{"class":91,"line":2859},[89,3116,338],{"emptyLinePlaceholder":337},[89,3118,3120,3123,3125],{"class":91,"line":3119},32,[89,3121,3122],{"class":103},"    (object_pointer->*action)(",[89,3124,460],{"class":454},[89,3126,121],{"class":103},[89,3128,3130,3132,3134],{"class":91,"line":3129},33,[89,3131,3122],{"class":103},[89,3133,548],{"class":454},[89,3135,121],{"class":103},[89,3137,3139],{"class":91,"line":3138},34,[89,3140,338],{"emptyLinePlaceholder":337},[89,3142,3144,3146,3148,3150,3153,3156,3159,3161,3163,3165,3167],{"class":91,"line":3143},35,[89,3145,440],{"class":99},[89,3147,443],{"class":103},[89,3149,446],{"class":95},[89,3151,3152],{"class":103}," counter.",[89,3154,3155],{"class":99},"value",[89,3157,3158],{"class":103},"() ",[89,3160,446],{"class":95},[89,3162,467],{"class":331},[89,3164,470],{"class":454},[89,3166,473],{"class":331},[89,3168,476],{"class":103},[89,3170,3172],{"class":91,"line":3171},36,[89,3173,338],{"emptyLinePlaceholder":337},[89,3175,3177,3179,3181],{"class":91,"line":3176},37,[89,3178,370],{"class":95},[89,3180,578],{"class":454},[89,3182,476],{"class":103},[89,3184,3186],{"class":91,"line":3185},38,[89,3187,385],{"class":103},[17,3189,3190],{},[20,3191,590],{},[80,3193,3196],{"className":3194,"code":3195,"language":596,"meta":85},[594],"12\n",[25,3197,3195],{"__ignoreMap":85},[14,3199,3200],{},[17,3201,3202,3203,3205,3206,189],{},"总结：对象使用 ",[25,3204,2581],{},"，对象指针使用 ",[25,3207,2362],{},[38,3209,3211,3212,3215],{"id":3210},"示例11const-成员函数指针","示例11：",[25,3213,3214],{},"const"," 成员函数指针",[17,3217,3218,3219,3221,3222,3224],{},"成员函数参数列表后的 ",[25,3220,3214],{}," 表示该成员函数不会修改对象的普通数据成员，可以在 ",[25,3223,3214],{}," 对象上调用。",[17,3226,3227,3229,3230,3232,3233,189],{},[25,3228,3214],{}," 是成员函数类型的一部分。因此，指向 ",[25,3231,3214],{}," 成员函数时，函数指针声明中也必须带有 ",[25,3234,3214],{},[17,3236,3237],{},[20,3238,318],{},[80,3240,3242],{"className":82,"code":3241,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nclass Sensor\n{\nprivate:\n    int value_;\n\npublic:\n    Sensor(int value)\n        : value_(value)\n    {\n    }\n\n    int read() const\n    {\n        return value_;\n    }\n};\n\nint main()\n{\n    int (Sensor::*reader)() const = &Sensor::read;\n\n    const Sensor sensor(42);\n    std::cout \u003C\u003C (sensor.*reader)() \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,3243,3244,3250,3254,3261,3265,3269,3275,3279,3283,3296,3305,3309,3313,3317,3329,3333,3339,3343,3347,3351,3359,3363,3391,3395,3412,3433,3437,3445],{"__ignoreMap":85},[89,3245,3246,3248],{"class":91,"line":92},[89,3247,328],{"class":95},[89,3249,332],{"class":331},[89,3251,3252],{"class":91,"line":159},[89,3253,338],{"emptyLinePlaceholder":337},[89,3255,3256,3258],{"class":91,"line":168},[89,3257,2398],{"class":95},[89,3259,3260],{"class":99}," Sensor\n",[89,3262,3263],{"class":91,"line":180},[89,3264,364],{"class":103},[89,3266,3267],{"class":91,"line":367},[89,3268,2623],{"class":95},[89,3270,3271,3273],{"class":91,"line":382},[89,3272,412],{"class":95},[89,3274,2938],{"class":103},[89,3276,3277],{"class":91,"line":388},[89,3278,338],{"emptyLinePlaceholder":337},[89,3280,3281],{"class":91,"line":393},[89,3282,2410],{"class":95},[89,3284,3285,3288,3290,3292,3294],{"class":91,"line":404},[89,3286,3287],{"class":99},"    Sensor",[89,3289,104],{"class":103},[89,3291,96],{"class":95},[89,3293,1563],{"class":109},[89,3295,359],{"class":103},[89,3297,3298,3300,3302],{"class":91,"line":409},[89,3299,2657],{"class":103},[89,3301,2960],{"class":99},[89,3303,3304],{"class":103},"(value)\n",[89,3306,3307],{"class":91,"line":432},[89,3308,2439],{"class":103},[89,3310,3311],{"class":91,"line":437},[89,3312,2455],{"class":103},[89,3314,3315],{"class":91,"line":479},[89,3316,338],{"emptyLinePlaceholder":337},[89,3318,3319,3321,3324,3326],{"class":91,"line":516},[89,3320,412],{"class":95},[89,3322,3323],{"class":99}," read",[89,3325,3158],{"class":103},[89,3327,3328],{"class":95},"const\n",[89,3330,3331],{"class":91,"line":521},[89,3332,2439],{"class":103},[89,3334,3335,3337],{"class":91,"line":535},[89,3336,2444],{"class":95},[89,3338,2938],{"class":103},[89,3340,3341],{"class":91,"line":568},[89,3342,2455],{"class":103},[89,3344,3345],{"class":91,"line":573},[89,3346,2460],{"class":103},[89,3348,3349],{"class":91,"line":583},[89,3350,338],{"emptyLinePlaceholder":337},[89,3352,3353,3355,3357],{"class":91,"line":845},[89,3354,96],{"class":95},[89,3356,398],{"class":99},[89,3358,401],{"class":103},[89,3360,3361],{"class":91,"line":850},[89,3362,364],{"class":103},[89,3364,3365,3367,3369,3372,3374,3376,3379,3381,3384,3386,3388],{"class":91,"line":856},[89,3366,412],{"class":95},[89,3368,488],{"class":103},[89,3370,3371],{"class":99},"Sensor",[89,3373,2738],{"class":103},[89,3375,205],{"class":95},[89,3377,3378],{"class":103},"reader)() ",[89,3380,3214],{"class":95},[89,3382,3383],{"class":95}," =",[89,3385,529],{"class":95},[89,3387,3371],{"class":99},[89,3389,3390],{"class":103},"::read;\n",[89,3392,3393],{"class":91,"line":862},[89,3394,338],{"emptyLinePlaceholder":337},[89,3396,3397,3400,3403,3406,3408,3410],{"class":91,"line":867},[89,3398,3399],{"class":95},"    const",[89,3401,3402],{"class":103}," Sensor ",[89,3404,3405],{"class":99},"sensor",[89,3407,104],{"class":103},[89,3409,1674],{"class":454},[89,3411,121],{"class":103},[89,3413,3414,3416,3418,3420,3423,3425,3427,3429,3431],{"class":91,"line":876},[89,3415,440],{"class":99},[89,3417,443],{"class":103},[89,3419,446],{"class":95},[89,3421,3422],{"class":103}," (sensor.*reader)() ",[89,3424,446],{"class":95},[89,3426,467],{"class":331},[89,3428,470],{"class":454},[89,3430,473],{"class":331},[89,3432,476],{"class":103},[89,3434,3435],{"class":91,"line":2027},[89,3436,338],{"emptyLinePlaceholder":337},[89,3438,3439,3441,3443],{"class":91,"line":2036},[89,3440,370],{"class":95},[89,3442,578],{"class":454},[89,3444,476],{"class":103},[89,3446,3447],{"class":91,"line":2819},[89,3448,385],{"class":103},[17,3450,3451],{},[20,3452,590],{},[80,3454,3457],{"className":3455,"code":3456,"language":596,"meta":85},[594],"42\n",[25,3458,3456],{"__ignoreMap":85},[17,3460,3461],{},"下面两个成员函数指针类型并不相同：",[80,3463,3465],{"className":82,"code":3464,"language":84,"meta":85,"style":85},"int (Sensor::*reader1)();       \u002F\u002F 指向非 const 成员函数\nint (Sensor::*reader2)() const; \u002F\u002F 指向 const 成员函数\n",[25,3466,3467,3485],{"__ignoreMap":85},[89,3468,3469,3471,3473,3475,3477,3479,3482],{"class":91,"line":92},[89,3470,96],{"class":95},[89,3472,488],{"class":103},[89,3474,3371],{"class":99},[89,3476,2738],{"class":103},[89,3478,205],{"class":95},[89,3480,3481],{"class":103},"reader1)();",[89,3483,3484],{"class":235},"       \u002F\u002F 指向非 const 成员函数\n",[89,3486,3487,3489,3491,3493,3495,3497,3500,3502,3505],{"class":91,"line":159},[89,3488,96],{"class":95},[89,3490,488],{"class":103},[89,3492,3371],{"class":99},[89,3494,2738],{"class":103},[89,3496,205],{"class":95},[89,3498,3499],{"class":103},"reader2)() ",[89,3501,3214],{"class":95},[89,3503,3504],{"class":103},";",[89,3506,3507],{"class":235}," \u002F\u002F 指向 const 成员函数\n",[10,3509,3511],{"id":3510},"现代-c-扩展可选读","现代 C++ 扩展（可选读）",[14,3513,3514],{},[17,3515,3516],{},"以下内容用于说明函数指针与现代 C++ 特性的联系。这里会解释示例所需的基本语法，但完整理解仍需要学习后面的“现代 C++”章节。初次学习可以先阅读结论，以后再回来复习。",[38,3518,3520,3521,3523],{"id":3519},"扩展示例1使用-nullptr-表示空函数指针","扩展示例1：使用 ",[25,3522,27],{}," 表示空函数指针",[17,3525,3526,3529],{},[20,3527,3528],{},"需要的标准版本："," C++11。",[17,3531,3532,3534,3535,3538,3539,3541],{},[25,3533,27],{}," 是 C++11 引入的空指针字面量，表示“没有指向任何对象或函数”。它比旧式的 ",[25,3536,3537],{},"NULL"," 和数字 ",[25,3540,1729],{}," 类型更明确。",[17,3543,3544,3545,3548,3549,3552,3553,189,3556,3559],{},"函数指针可以放进 ",[25,3546,3547],{},"if"," 条件中检查：非空指针转换为 ",[25,3550,3551],{},"true","，空指针转换为 ",[25,3554,3555],{},"false",[20,3557,3558],{},"调用空函数指针会产生未定义行为","，因此可能为空时必须先检查。",[17,3561,3562],{},[20,3563,318],{},[80,3565,3567],{"className":82,"code":3566,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nvoid greet()\n{\n    std::cout \u003C\u003C \"hello\\n\";\n}\n\nint main()\n{\n    void (*task)() = nullptr;\n\n    if (task)\n    {\n        task();\n    }\n    else\n    {\n        std::cout \u003C\u003C \"task is empty\\n\";\n    }\n\n    task = greet;\n\n    if (task != nullptr)\n    {\n        task();\n    }\n\n    return 0;\n}\n",[25,3568,3569,3575,3579,3588,3592,3609,3613,3617,3625,3629,3643,3647,3655,3659,3667,3671,3676,3680,3698,3702,3706,3716,3720,3734,3738,3744,3748,3752,3760],{"__ignoreMap":85},[89,3570,3571,3573],{"class":91,"line":92},[89,3572,328],{"class":95},[89,3574,332],{"class":331},[89,3576,3577],{"class":91,"line":159},[89,3578,338],{"emptyLinePlaceholder":337},[89,3580,3581,3583,3586],{"class":91,"line":168},[89,3582,1553],{"class":95},[89,3584,3585],{"class":99}," greet",[89,3587,401],{"class":103},[89,3589,3590],{"class":91,"line":180},[89,3591,364],{"class":103},[89,3593,3594,3596,3598,3600,3603,3605,3607],{"class":91,"line":367},[89,3595,440],{"class":99},[89,3597,443],{"class":103},[89,3599,446],{"class":95},[89,3601,3602],{"class":331}," \"hello",[89,3604,470],{"class":454},[89,3606,473],{"class":331},[89,3608,476],{"class":103},[89,3610,3611],{"class":91,"line":382},[89,3612,385],{"class":103},[89,3614,3615],{"class":91,"line":388},[89,3616,338],{"emptyLinePlaceholder":337},[89,3618,3619,3621,3623],{"class":91,"line":393},[89,3620,96],{"class":95},[89,3622,398],{"class":99},[89,3624,401],{"class":103},[89,3626,3627],{"class":91,"line":404},[89,3628,364],{"class":103},[89,3630,3631,3633,3636,3638,3641],{"class":91,"line":409},[89,3632,2983],{"class":95},[89,3634,3635],{"class":103}," (*task)() ",[89,3637,426],{"class":95},[89,3639,3640],{"class":454}," nullptr",[89,3642,476],{"class":103},[89,3644,3645],{"class":91,"line":432},[89,3646,338],{"emptyLinePlaceholder":337},[89,3648,3649,3652],{"class":91,"line":437},[89,3650,3651],{"class":95},"    if",[89,3653,3654],{"class":103}," (task)\n",[89,3656,3657],{"class":91,"line":479},[89,3658,2439],{"class":103},[89,3660,3661,3664],{"class":91,"line":516},[89,3662,3663],{"class":99},"        task",[89,3665,3666],{"class":103},"();\n",[89,3668,3669],{"class":91,"line":521},[89,3670,2455],{"class":103},[89,3672,3673],{"class":91,"line":535},[89,3674,3675],{"class":95},"    else\n",[89,3677,3678],{"class":91,"line":568},[89,3679,2439],{"class":103},[89,3681,3682,3685,3687,3689,3692,3694,3696],{"class":91,"line":573},[89,3683,3684],{"class":99},"        std",[89,3686,443],{"class":103},[89,3688,446],{"class":95},[89,3690,3691],{"class":331}," \"task is empty",[89,3693,470],{"class":454},[89,3695,473],{"class":331},[89,3697,476],{"class":103},[89,3699,3700],{"class":91,"line":583},[89,3701,2455],{"class":103},[89,3703,3704],{"class":91,"line":845},[89,3705,338],{"emptyLinePlaceholder":337},[89,3707,3708,3711,3713],{"class":91,"line":850},[89,3709,3710],{"class":103},"    task ",[89,3712,426],{"class":95},[89,3714,3715],{"class":103}," greet;\n",[89,3717,3718],{"class":91,"line":856},[89,3719,338],{"emptyLinePlaceholder":337},[89,3721,3722,3724,3727,3730,3732],{"class":91,"line":862},[89,3723,3651],{"class":95},[89,3725,3726],{"class":103}," (task ",[89,3728,3729],{"class":95},"!=",[89,3731,3640],{"class":454},[89,3733,359],{"class":103},[89,3735,3736],{"class":91,"line":867},[89,3737,2439],{"class":103},[89,3739,3740,3742],{"class":91,"line":876},[89,3741,3663],{"class":99},[89,3743,3666],{"class":103},[89,3745,3746],{"class":91,"line":2027},[89,3747,2455],{"class":103},[89,3749,3750],{"class":91,"line":2036},[89,3751,338],{"emptyLinePlaceholder":337},[89,3753,3754,3756,3758],{"class":91,"line":2819},[89,3755,370],{"class":95},[89,3757,578],{"class":454},[89,3759,476],{"class":103},[89,3761,3762],{"class":91,"line":2845},[89,3763,385],{"class":103},[17,3765,3766],{},[20,3767,590],{},[80,3769,3772],{"className":3770,"code":3771,"language":596,"meta":85},[594],"task is empty\nhello\n",[25,3773,3771],{"__ignoreMap":85},[14,3775,3776],{},[17,3777,3778,3779,189,3782,3784,3785,3787],{},"注意：函数指针只保存函数地址，不负责管理内存，不需要也不能对它使用 ",[25,3780,3781],{},"delete",[25,3783,27],{}," 的完整用法见后面的 ",[25,3786,27],{}," 章节。",[38,3789,3791,3792,3794],{"id":3790},"扩展示例2使用-using-给函数指针类型起别名","扩展示例2：使用 ",[25,3793,31],{}," 给函数指针类型起别名",[17,3796,3797,3529],{},[20,3798,3528],{},[17,3800,3801,3802,3804],{},"直接书写函数指针类型比较困难。C++11 可以使用 ",[25,3803,31],{}," 给已有类型起别名：",[80,3806,3808],{"className":82,"code":3807,"language":84,"meta":85,"style":85},"using 新名字 = 已有类型;\n",[25,3809,3810],{"__ignoreMap":85},[89,3811,3812,3814,3817,3819],{"class":91,"line":92},[89,3813,31],{"class":95},[89,3815,3816],{"class":103}," 新名字 ",[89,3818,426],{"class":95},[89,3820,3821],{"class":103}," 已有类型;\n",[17,3823,3824,3825,3828,3829,3832],{},"下面的语句表示 ",[25,3826,3827],{},"Operation"," 是 ",[25,3830,3831],{},"int (*)(int, int)"," 的别名：",[80,3834,3836],{"className":82,"code":3835,"language":84,"meta":85,"style":85},"using Operation = int (*)(int, int);\n",[25,3837,3838],{"__ignoreMap":85},[89,3839,3840,3842,3845,3847,3849,3851,3853,3855,3857,3859,3861],{"class":91,"line":92},[89,3841,31],{"class":95},[89,3843,3844],{"class":99}," Operation",[89,3846,3383],{"class":95},[89,3848,2418],{"class":95},[89,3850,488],{"class":103},[89,3852,205],{"class":95},[89,3854,1307],{"class":103},[89,3856,96],{"class":95},[89,3858,113],{"class":103},[89,3860,96],{"class":95},[89,3862,121],{"class":103},[17,3864,3865,3867],{},[25,3866,31],{}," 不会创建新的类型，也没有运行时开销，只是让类型更容易阅读。",[17,3869,3870],{},[20,3871,318],{},[80,3873,3875],{"className":82,"code":3874,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nusing Operation = int (*)(int, int);\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint multiply(int a, int b)\n{\n    return a * b;\n}\n\nint calculate(int a, int b, Operation operation)\n{\n    return operation(a, b);\n}\n\nint main()\n{\n    Operation operation = add;\n    std::cout \u003C\u003C calculate(3, 8, operation) \u003C\u003C \"\\n\";\n\n    operation = multiply;\n    std::cout \u003C\u003C calculate(3, 8, operation) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,3876,3877,3883,3887,3911,3915,3935,3939,3949,3953,3957,3977,3981,3991,3995,3999,4025,4029,4037,4041,4045,4053,4057,4066,4097,4101,4110,4140,4144,4152],{"__ignoreMap":85},[89,3878,3879,3881],{"class":91,"line":92},[89,3880,328],{"class":95},[89,3882,332],{"class":331},[89,3884,3885],{"class":91,"line":159},[89,3886,338],{"emptyLinePlaceholder":337},[89,3888,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909],{"class":91,"line":168},[89,3890,31],{"class":95},[89,3892,3844],{"class":99},[89,3894,3383],{"class":95},[89,3896,2418],{"class":95},[89,3898,488],{"class":103},[89,3900,205],{"class":95},[89,3902,1307],{"class":103},[89,3904,96],{"class":95},[89,3906,113],{"class":103},[89,3908,96],{"class":95},[89,3910,121],{"class":103},[89,3912,3913],{"class":91,"line":180},[89,3914,338],{"emptyLinePlaceholder":337},[89,3916,3917,3919,3921,3923,3925,3927,3929,3931,3933],{"class":91,"line":367},[89,3918,96],{"class":95},[89,3920,100],{"class":99},[89,3922,104],{"class":103},[89,3924,96],{"class":95},[89,3926,110],{"class":109},[89,3928,113],{"class":103},[89,3930,96],{"class":95},[89,3932,118],{"class":109},[89,3934,359],{"class":103},[89,3936,3937],{"class":91,"line":382},[89,3938,364],{"class":103},[89,3940,3941,3943,3945,3947],{"class":91,"line":388},[89,3942,370],{"class":95},[89,3944,373],{"class":103},[89,3946,376],{"class":95},[89,3948,379],{"class":103},[89,3950,3951],{"class":91,"line":393},[89,3952,385],{"class":103},[89,3954,3955],{"class":91,"line":404},[89,3956,338],{"emptyLinePlaceholder":337},[89,3958,3959,3961,3963,3965,3967,3969,3971,3973,3975],{"class":91,"line":409},[89,3960,96],{"class":95},[89,3962,1240],{"class":99},[89,3964,104],{"class":103},[89,3966,96],{"class":95},[89,3968,110],{"class":109},[89,3970,113],{"class":103},[89,3972,96],{"class":95},[89,3974,118],{"class":109},[89,3976,359],{"class":103},[89,3978,3979],{"class":91,"line":432},[89,3980,364],{"class":103},[89,3982,3983,3985,3987,3989],{"class":91,"line":437},[89,3984,370],{"class":95},[89,3986,373],{"class":103},[89,3988,205],{"class":95},[89,3990,379],{"class":103},[89,3992,3993],{"class":91,"line":479},[89,3994,385],{"class":103},[89,3996,3997],{"class":91,"line":516},[89,3998,338],{"emptyLinePlaceholder":337},[89,4000,4001,4003,4005,4007,4009,4011,4013,4015,4017,4019,4021,4023],{"class":91,"line":521},[89,4002,96],{"class":95},[89,4004,1283],{"class":99},[89,4006,104],{"class":103},[89,4008,96],{"class":95},[89,4010,110],{"class":109},[89,4012,113],{"class":103},[89,4014,96],{"class":95},[89,4016,118],{"class":109},[89,4018,113],{"class":103},[89,4020,3827],{"class":99},[89,4022,1052],{"class":109},[89,4024,359],{"class":103},[89,4026,4027],{"class":91,"line":535},[89,4028,364],{"class":103},[89,4030,4031,4033,4035],{"class":91,"line":568},[89,4032,370],{"class":95},[89,4034,1052],{"class":99},[89,4036,1329],{"class":103},[89,4038,4039],{"class":91,"line":573},[89,4040,385],{"class":103},[89,4042,4043],{"class":91,"line":583},[89,4044,338],{"emptyLinePlaceholder":337},[89,4046,4047,4049,4051],{"class":91,"line":845},[89,4048,96],{"class":95},[89,4050,398],{"class":99},[89,4052,401],{"class":103},[89,4054,4055],{"class":91,"line":850},[89,4056,364],{"class":103},[89,4058,4059,4062,4064],{"class":91,"line":856},[89,4060,4061],{"class":103},"    Operation operation ",[89,4063,426],{"class":95},[89,4065,429],{"class":103},[89,4067,4068,4070,4072,4074,4076,4078,4080,4082,4084,4087,4089,4091,4093,4095],{"class":91,"line":862},[89,4069,440],{"class":99},[89,4071,443],{"class":103},[89,4073,446],{"class":95},[89,4075,1283],{"class":99},[89,4077,104],{"class":103},[89,4079,455],{"class":454},[89,4081,113],{"class":103},[89,4083,553],{"class":454},[89,4085,4086],{"class":103},", operation) ",[89,4088,446],{"class":95},[89,4090,467],{"class":331},[89,4092,470],{"class":454},[89,4094,473],{"class":331},[89,4096,476],{"class":103},[89,4098,4099],{"class":91,"line":867},[89,4100,338],{"emptyLinePlaceholder":337},[89,4102,4103,4105,4107],{"class":91,"line":876},[89,4104,1081],{"class":103},[89,4106,426],{"class":95},[89,4108,4109],{"class":103}," multiply;\n",[89,4111,4112,4114,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136,4138],{"class":91,"line":2027},[89,4113,440],{"class":99},[89,4115,443],{"class":103},[89,4117,446],{"class":95},[89,4119,1283],{"class":99},[89,4121,104],{"class":103},[89,4123,455],{"class":454},[89,4125,113],{"class":103},[89,4127,553],{"class":454},[89,4129,4086],{"class":103},[89,4131,446],{"class":95},[89,4133,467],{"class":331},[89,4135,470],{"class":454},[89,4137,473],{"class":331},[89,4139,476],{"class":103},[89,4141,4142],{"class":91,"line":2036},[89,4143,338],{"emptyLinePlaceholder":337},[89,4145,4146,4148,4150],{"class":91,"line":2819},[89,4147,370],{"class":95},[89,4149,578],{"class":454},[89,4151,476],{"class":103},[89,4153,4154],{"class":91,"line":2845},[89,4155,385],{"class":103},[17,4157,4158],{},[20,4159,590],{},[80,4161,4164],{"className":4162,"code":4163,"language":596,"meta":85},[594],"11\n24\n",[25,4165,4163],{"__ignoreMap":85},[17,4167,4168,4169,4172],{},"旧代码中也可能看到 ",[25,4170,4171],{},"typedef"," 写法，两者含义相同：",[80,4174,4176],{"className":82,"code":4175,"language":84,"meta":85,"style":85},"typedef int (*Operation1)(int, int);\nusing Operation2 = int (*)(int, int);\n",[25,4177,4178,4195],{"__ignoreMap":85},[89,4179,4180,4182,4184,4187,4189,4191,4193],{"class":91,"line":92},[89,4181,4171],{"class":95},[89,4183,2418],{"class":95},[89,4185,4186],{"class":103}," (*Operation1)(",[89,4188,96],{"class":95},[89,4190,113],{"class":103},[89,4192,96],{"class":95},[89,4194,121],{"class":103},[89,4196,4197,4199,4202,4204,4206,4208,4210,4212,4214,4216,4218],{"class":91,"line":159},[89,4198,31],{"class":95},[89,4200,4201],{"class":99}," Operation2",[89,4203,3383],{"class":95},[89,4205,2418],{"class":95},[89,4207,488],{"class":103},[89,4209,205],{"class":95},[89,4211,1307],{"class":103},[89,4213,96],{"class":95},[89,4215,113],{"class":103},[89,4217,96],{"class":95},[89,4219,121],{"class":103},[17,4221,4222,4223,4225,4226,3787],{},"现代 C++ 通常优先使用更容易阅读的 ",[25,4224,31],{},"。完整用法见后面的 ",[25,4227,31],{},[38,4229,4231],{"id":4230},"扩展示例3从函数返回函数指针","扩展示例3：从函数返回函数指针",[17,4233,4234,4235,4238,4239,189],{},"有了类型别名，函数也可以方便地返回一个函数指针。下面的 ",[25,4236,4237],{},"select_operation"," 根据字符返回对应函数的地址。如果字符无法识别，则返回 ",[25,4240,27],{},[17,4242,4243],{},[20,4244,318],{},[80,4246,4248],{"className":82,"code":4247,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nusing Operation = int (*)(int, int);\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint subtract(int a, int b)\n{\n    return a - b;\n}\n\nOperation select_operation(char symbol)\n{\n    if (symbol == '+')\n    {\n        return add;\n    }\n\n    if (symbol == '-')\n    {\n        return subtract;\n    }\n\n    return nullptr;\n}\n\nint main()\n{\n    Operation operation = select_operation('-');\n\n    if (operation)\n    {\n        std::cout \u003C\u003C operation(20, 7) \u003C\u003C \"\\n\";\n    }\n    else\n    {\n        std::cout \u003C\u003C \"unknown operation\\n\";\n    }\n\n    return 0;\n}\n",[25,4249,4250,4256,4260,4284,4288,4308,4312,4322,4326,4330,4350,4354,4364,4368,4372,4389,4393,4408,4412,4418,4422,4426,4439,4443,4449,4453,4457,4465,4469,4473,4481,4485,4500,4504,4511,4515,4545,4549,4553,4558,4576,4581,4586,4595],{"__ignoreMap":85},[89,4251,4252,4254],{"class":91,"line":92},[89,4253,328],{"class":95},[89,4255,332],{"class":331},[89,4257,4258],{"class":91,"line":159},[89,4259,338],{"emptyLinePlaceholder":337},[89,4261,4262,4264,4266,4268,4270,4272,4274,4276,4278,4280,4282],{"class":91,"line":168},[89,4263,31],{"class":95},[89,4265,3844],{"class":99},[89,4267,3383],{"class":95},[89,4269,2418],{"class":95},[89,4271,488],{"class":103},[89,4273,205],{"class":95},[89,4275,1307],{"class":103},[89,4277,96],{"class":95},[89,4279,113],{"class":103},[89,4281,96],{"class":95},[89,4283,121],{"class":103},[89,4285,4286],{"class":91,"line":180},[89,4287,338],{"emptyLinePlaceholder":337},[89,4289,4290,4292,4294,4296,4298,4300,4302,4304,4306],{"class":91,"line":367},[89,4291,96],{"class":95},[89,4293,100],{"class":99},[89,4295,104],{"class":103},[89,4297,96],{"class":95},[89,4299,110],{"class":109},[89,4301,113],{"class":103},[89,4303,96],{"class":95},[89,4305,118],{"class":109},[89,4307,359],{"class":103},[89,4309,4310],{"class":91,"line":382},[89,4311,364],{"class":103},[89,4313,4314,4316,4318,4320],{"class":91,"line":388},[89,4315,370],{"class":95},[89,4317,373],{"class":103},[89,4319,376],{"class":95},[89,4321,379],{"class":103},[89,4323,4324],{"class":91,"line":393},[89,4325,385],{"class":103},[89,4327,4328],{"class":91,"line":404},[89,4329,338],{"emptyLinePlaceholder":337},[89,4331,4332,4334,4336,4338,4340,4342,4344,4346,4348],{"class":91,"line":409},[89,4333,96],{"class":95},[89,4335,968],{"class":99},[89,4337,104],{"class":103},[89,4339,96],{"class":95},[89,4341,110],{"class":109},[89,4343,113],{"class":103},[89,4345,96],{"class":95},[89,4347,118],{"class":109},[89,4349,359],{"class":103},[89,4351,4352],{"class":91,"line":432},[89,4353,364],{"class":103},[89,4355,4356,4358,4360,4362],{"class":91,"line":437},[89,4357,370],{"class":95},[89,4359,373],{"class":103},[89,4361,995],{"class":95},[89,4363,379],{"class":103},[89,4365,4366],{"class":91,"line":479},[89,4367,385],{"class":103},[89,4369,4370],{"class":91,"line":516},[89,4371,338],{"emptyLinePlaceholder":337},[89,4373,4374,4376,4379,4381,4384,4387],{"class":91,"line":521},[89,4375,3827],{"class":99},[89,4377,4378],{"class":99}," select_operation",[89,4380,104],{"class":103},[89,4382,4383],{"class":95},"char",[89,4385,4386],{"class":109}," symbol",[89,4388,359],{"class":103},[89,4390,4391],{"class":91,"line":535},[89,4392,364],{"class":103},[89,4394,4395,4397,4400,4403,4406],{"class":91,"line":568},[89,4396,3651],{"class":95},[89,4398,4399],{"class":103}," (symbol ",[89,4401,4402],{"class":95},"==",[89,4404,4405],{"class":331}," '+'",[89,4407,359],{"class":103},[89,4409,4410],{"class":91,"line":573},[89,4411,2439],{"class":103},[89,4413,4414,4416],{"class":91,"line":583},[89,4415,2444],{"class":95},[89,4417,429],{"class":103},[89,4419,4420],{"class":91,"line":845},[89,4421,2455],{"class":103},[89,4423,4424],{"class":91,"line":850},[89,4425,338],{"emptyLinePlaceholder":337},[89,4427,4428,4430,4432,4434,4437],{"class":91,"line":856},[89,4429,3651],{"class":95},[89,4431,4399],{"class":103},[89,4433,4402],{"class":95},[89,4435,4436],{"class":331}," '-'",[89,4438,359],{"class":103},[89,4440,4441],{"class":91,"line":862},[89,4442,2439],{"class":103},[89,4444,4445,4447],{"class":91,"line":867},[89,4446,2444],{"class":95},[89,4448,1086],{"class":103},[89,4450,4451],{"class":91,"line":876},[89,4452,2455],{"class":103},[89,4454,4455],{"class":91,"line":2027},[89,4456,338],{"emptyLinePlaceholder":337},[89,4458,4459,4461,4463],{"class":91,"line":2036},[89,4460,370],{"class":95},[89,4462,3640],{"class":454},[89,4464,476],{"class":103},[89,4466,4467],{"class":91,"line":2819},[89,4468,385],{"class":103},[89,4470,4471],{"class":91,"line":2845},[89,4472,338],{"emptyLinePlaceholder":337},[89,4474,4475,4477,4479],{"class":91,"line":2850},[89,4476,96],{"class":95},[89,4478,398],{"class":99},[89,4480,401],{"class":103},[89,4482,4483],{"class":91,"line":2859},[89,4484,364],{"class":103},[89,4486,4487,4489,4491,4493,4495,4498],{"class":91,"line":3119},[89,4488,4061],{"class":103},[89,4490,426],{"class":95},[89,4492,4378],{"class":99},[89,4494,104],{"class":103},[89,4496,4497],{"class":331},"'-'",[89,4499,121],{"class":103},[89,4501,4502],{"class":91,"line":3129},[89,4503,338],{"emptyLinePlaceholder":337},[89,4505,4506,4508],{"class":91,"line":3138},[89,4507,3651],{"class":95},[89,4509,4510],{"class":103}," (operation)\n",[89,4512,4513],{"class":91,"line":3143},[89,4514,2439],{"class":103},[89,4516,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4543],{"class":91,"line":3171},[89,4518,3684],{"class":99},[89,4520,443],{"class":103},[89,4522,446],{"class":95},[89,4524,1052],{"class":99},[89,4526,104],{"class":103},[89,4528,501],{"class":454},[89,4530,113],{"class":103},[89,4532,548],{"class":454},[89,4534,423],{"class":103},[89,4536,446],{"class":95},[89,4538,467],{"class":331},[89,4540,470],{"class":454},[89,4542,473],{"class":331},[89,4544,476],{"class":103},[89,4546,4547],{"class":91,"line":3176},[89,4548,2455],{"class":103},[89,4550,4551],{"class":91,"line":3185},[89,4552,3675],{"class":95},[89,4554,4556],{"class":91,"line":4555},39,[89,4557,2439],{"class":103},[89,4559,4561,4563,4565,4567,4570,4572,4574],{"class":91,"line":4560},40,[89,4562,3684],{"class":99},[89,4564,443],{"class":103},[89,4566,446],{"class":95},[89,4568,4569],{"class":331}," \"unknown operation",[89,4571,470],{"class":454},[89,4573,473],{"class":331},[89,4575,476],{"class":103},[89,4577,4579],{"class":91,"line":4578},41,[89,4580,2455],{"class":103},[89,4582,4584],{"class":91,"line":4583},42,[89,4585,338],{"emptyLinePlaceholder":337},[89,4587,4589,4591,4593],{"class":91,"line":4588},43,[89,4590,370],{"class":95},[89,4592,578],{"class":454},[89,4594,476],{"class":103},[89,4596,4598],{"class":91,"line":4597},44,[89,4599,385],{"class":103},[17,4601,4602],{},[20,4603,590],{},[80,4605,4608],{"className":4606,"code":4607,"language":596,"meta":85},[594],"13\n",[25,4609,4607],{"__ignoreMap":85},[14,4611,4612],{},[17,4613,4614,4615,4617],{},"总结：复杂的函数指针类型应先使用 ",[25,4616,31],{}," 起别名，再作为参数类型或返回值类型。",[38,4619,4621],{"id":4620},"扩展示例4无捕获-lambda-转换为函数指针","扩展示例4：无捕获 Lambda 转换为函数指针",[17,4623,4624,3529],{},[20,4625,3528],{},[17,4627,4628],{},"Lambda 表达式可以在使用位置定义一个小型匿名函数。基本语法如下：",[80,4630,4632],{"className":82,"code":4631,"language":84,"meta":85,"style":85},"[捕获列表](参数列表) -> 返回值类型\n{\n    函数体\n};\n",[25,4633,4634,4642,4646,4651],{"__ignoreMap":85},[89,4635,4636,4639],{"class":91,"line":92},[89,4637,4638],{"class":103},"[捕获列表](参数列表) -> ",[89,4640,4641],{"class":95},"返回值类型\n",[89,4643,4644],{"class":91,"line":159},[89,4645,364],{"class":103},[89,4647,4648],{"class":91,"line":168},[89,4649,4650],{"class":103},"    函数体\n",[89,4652,4653],{"class":91,"line":180},[89,4654,2460],{"class":103},[17,4656,4657,4658,4661],{},"返回值类型通常可以由编译器推导，因此 ",[25,4659,4660],{},"-> 返回值类型"," 经常省略。",[17,4663,4664,4665,4668],{},"当捕获列表为空，也就是写成 ",[25,4666,4667],{},"[]"," 时，Lambda 可以转换为签名兼容的普通函数指针。",[17,4670,4671],{},[20,4672,318],{},[80,4674,4676],{"className":82,"code":4675,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nusing Operation = int (*)(int, int);\n\nint calculate(int a, int b, Operation operation)\n{\n    return operation(a, b);\n}\n\nint main()\n{\n    Operation maximum = [](int a, int b) {\n        return a > b ? a : b;\n    };\n\n    std::cout \u003C\u003C calculate(12, 9, maximum) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C calculate(4, 7, [](int a, int b) {\n        return a \u003C b ? a : b;\n    }) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,4677,4678,4684,4688,4712,4716,4742,4746,4754,4758,4762,4770,4774,4797,4819,4824,4828,4860,4893,4912,4927,4931,4939],{"__ignoreMap":85},[89,4679,4680,4682],{"class":91,"line":92},[89,4681,328],{"class":95},[89,4683,332],{"class":331},[89,4685,4686],{"class":91,"line":159},[89,4687,338],{"emptyLinePlaceholder":337},[89,4689,4690,4692,4694,4696,4698,4700,4702,4704,4706,4708,4710],{"class":91,"line":168},[89,4691,31],{"class":95},[89,4693,3844],{"class":99},[89,4695,3383],{"class":95},[89,4697,2418],{"class":95},[89,4699,488],{"class":103},[89,4701,205],{"class":95},[89,4703,1307],{"class":103},[89,4705,96],{"class":95},[89,4707,113],{"class":103},[89,4709,96],{"class":95},[89,4711,121],{"class":103},[89,4713,4714],{"class":91,"line":180},[89,4715,338],{"emptyLinePlaceholder":337},[89,4717,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740],{"class":91,"line":367},[89,4719,96],{"class":95},[89,4721,1283],{"class":99},[89,4723,104],{"class":103},[89,4725,96],{"class":95},[89,4727,110],{"class":109},[89,4729,113],{"class":103},[89,4731,96],{"class":95},[89,4733,118],{"class":109},[89,4735,113],{"class":103},[89,4737,3827],{"class":99},[89,4739,1052],{"class":109},[89,4741,359],{"class":103},[89,4743,4744],{"class":91,"line":382},[89,4745,364],{"class":103},[89,4747,4748,4750,4752],{"class":91,"line":388},[89,4749,370],{"class":95},[89,4751,1052],{"class":99},[89,4753,1329],{"class":103},[89,4755,4756],{"class":91,"line":393},[89,4757,385],{"class":103},[89,4759,4760],{"class":91,"line":404},[89,4761,338],{"emptyLinePlaceholder":337},[89,4763,4764,4766,4768],{"class":91,"line":409},[89,4765,96],{"class":95},[89,4767,398],{"class":99},[89,4769,401],{"class":103},[89,4771,4772],{"class":91,"line":432},[89,4773,364],{"class":103},[89,4775,4776,4779,4781,4784,4786,4788,4790,4792,4794],{"class":91,"line":437},[89,4777,4778],{"class":103},"    Operation maximum ",[89,4780,426],{"class":95},[89,4782,4783],{"class":103}," [](",[89,4785,96],{"class":95},[89,4787,110],{"class":109},[89,4789,113],{"class":103},[89,4791,96],{"class":95},[89,4793,118],{"class":109},[89,4795,4796],{"class":103},") {\n",[89,4798,4799,4801,4803,4806,4809,4812,4814,4817],{"class":91,"line":479},[89,4800,2444],{"class":95},[89,4802,373],{"class":103},[89,4804,4805],{"class":95},">",[89,4807,4808],{"class":103}," b ",[89,4810,4811],{"class":95},"?",[89,4813,373],{"class":103},[89,4815,4816],{"class":95},":",[89,4818,379],{"class":103},[89,4820,4821],{"class":91,"line":516},[89,4822,4823],{"class":103},"    };\n",[89,4825,4826],{"class":91,"line":521},[89,4827,338],{"emptyLinePlaceholder":337},[89,4829,4830,4832,4834,4836,4838,4840,4843,4845,4847,4850,4852,4854,4856,4858],{"class":91,"line":535},[89,4831,440],{"class":99},[89,4833,443],{"class":103},[89,4835,446],{"class":95},[89,4837,1283],{"class":99},[89,4839,104],{"class":103},[89,4841,4842],{"class":454},"12",[89,4844,113],{"class":103},[89,4846,2519],{"class":454},[89,4848,4849],{"class":103},", maximum) ",[89,4851,446],{"class":95},[89,4853,467],{"class":331},[89,4855,470],{"class":454},[89,4857,473],{"class":331},[89,4859,476],{"class":103},[89,4861,4862,4864,4866,4868,4870,4872,4874,4876,4878,4881,4883,4885,4887,4889,4891],{"class":91,"line":568},[89,4863,440],{"class":99},[89,4865,443],{"class":103},[89,4867,446],{"class":95},[89,4869,1283],{"class":99},[89,4871,104],{"class":103},[89,4873,792],{"class":454},[89,4875,113],{"class":103},[89,4877,548],{"class":454},[89,4879,4880],{"class":103},", [](",[89,4882,96],{"class":95},[89,4884,110],{"class":109},[89,4886,113],{"class":103},[89,4888,96],{"class":95},[89,4890,118],{"class":109},[89,4892,4796],{"class":103},[89,4894,4895,4897,4899,4902,4904,4906,4908,4910],{"class":91,"line":573},[89,4896,2444],{"class":95},[89,4898,373],{"class":103},[89,4900,4901],{"class":95},"\u003C",[89,4903,4808],{"class":103},[89,4905,4811],{"class":95},[89,4907,373],{"class":103},[89,4909,4816],{"class":95},[89,4911,379],{"class":103},[89,4913,4914,4917,4919,4921,4923,4925],{"class":91,"line":583},[89,4915,4916],{"class":103},"    }) ",[89,4918,446],{"class":95},[89,4920,467],{"class":331},[89,4922,470],{"class":454},[89,4924,473],{"class":331},[89,4926,476],{"class":103},[89,4928,4929],{"class":91,"line":845},[89,4930,338],{"emptyLinePlaceholder":337},[89,4932,4933,4935,4937],{"class":91,"line":850},[89,4934,370],{"class":95},[89,4936,578],{"class":454},[89,4938,476],{"class":103},[89,4940,4941],{"class":91,"line":856},[89,4942,385],{"class":103},[17,4944,4945],{},[20,4946,590],{},[80,4948,4951],{"className":4949,"code":4950,"language":596,"meta":85},[594],"12\n4\n",[25,4952,4950],{"__ignoreMap":85},[17,4954,4955],{},"有捕获的 Lambda 需要在自身对象中保存捕获的数据，因此不能转换为普通函数指针：",[80,4957,4959],{"className":82,"code":4958,"language":84,"meta":85,"style":85},"int offset = 10;\n\n\u002F\u002F Operation operation = [offset](int a, int b) {\n\u002F\u002F     return a + b + offset;\n\u002F\u002F }; \u002F\u002F 错误：有捕获的 Lambda 不能转换为普通函数指针\n",[25,4960,4961,4975,4979,4984,4989],{"__ignoreMap":85},[89,4962,4963,4965,4968,4970,4973],{"class":91,"line":92},[89,4964,96],{"class":95},[89,4966,4967],{"class":103}," offset ",[89,4969,426],{"class":95},[89,4971,4972],{"class":454}," 10",[89,4974,476],{"class":103},[89,4976,4977],{"class":91,"line":159},[89,4978,338],{"emptyLinePlaceholder":337},[89,4980,4981],{"class":91,"line":168},[89,4982,4983],{"class":235},"\u002F\u002F Operation operation = [offset](int a, int b) {\n",[89,4985,4986],{"class":91,"line":180},[89,4987,4988],{"class":235},"\u002F\u002F     return a + b + offset;\n",[89,4990,4991,4994],{"class":91,"line":367},[89,4992,4993],{"class":235},"\u002F\u002F };",[89,4995,4996],{"class":235}," \u002F\u002F 错误：有捕获的 Lambda 不能转换为普通函数指针\n",[17,4998,4999],{},"有关捕获列表和 Lambda 类型的完整解释，见后面的 Lambda 表达式章节。",[38,5001,5003,5004,5007],{"id":5002},"扩展示例5使用-static_cast-选择重载函数","扩展示例5：使用 ",[25,5005,5006],{},"static_cast"," 选择重载函数",[17,5009,5010,5013],{},[25,5011,5012],{},"static_cast\u003C目标类型>(表达式)"," 是 C++ 的显式类型转换语法。取得重载函数地址时，可以用它明确告诉编译器需要哪个重载版本。",[17,5015,5016,5019,5020,5023,5024,189],{},[25,5017,5018],{},"auto"," 会让编译器根据右侧表达式推导变量类型。下面的 ",[25,5021,5022],{},"decimal_square"," 实际类型仍然是 ",[25,5025,5026],{},"double (*)(double)",[17,5028,5029],{},[20,5030,318],{},[80,5032,5034],{"className":82,"code":5033,"language":84,"meta":85,"style":85},"#include \u003Ciostream>\n\nint square(int value)\n{\n    return value * value;\n}\n\ndouble square(double value)\n{\n    return value * value;\n}\n\nint main()\n{\n    int (*integer_square)(int) = square;\n    auto decimal_square = static_cast\u003Cdouble (*)(double)>(square);\n\n    std::cout \u003C\u003C integer_square(5) \u003C\u003C \"\\n\";\n    std::cout \u003C\u003C decimal_square(1.5) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,5035,5036,5042,5046,5060,5064,5074,5078,5082,5096,5100,5110,5114,5118,5126,5130,5144,5169,5173,5199,5225,5229,5237],{"__ignoreMap":85},[89,5037,5038,5040],{"class":91,"line":92},[89,5039,328],{"class":95},[89,5041,332],{"class":331},[89,5043,5044],{"class":91,"line":159},[89,5045,338],{"emptyLinePlaceholder":337},[89,5047,5048,5050,5052,5054,5056,5058],{"class":91,"line":168},[89,5049,96],{"class":95},[89,5051,2099],{"class":99},[89,5053,104],{"class":103},[89,5055,96],{"class":95},[89,5057,1563],{"class":109},[89,5059,359],{"class":103},[89,5061,5062],{"class":91,"line":180},[89,5063,364],{"class":103},[89,5065,5066,5068,5070,5072],{"class":91,"line":367},[89,5067,370],{"class":95},[89,5069,1580],{"class":103},[89,5071,205],{"class":95},[89,5073,2122],{"class":103},[89,5075,5076],{"class":91,"line":382},[89,5077,385],{"class":103},[89,5079,5080],{"class":91,"line":388},[89,5081,338],{"emptyLinePlaceholder":337},[89,5083,5084,5086,5088,5090,5092,5094],{"class":91,"line":393},[89,5085,680],{"class":95},[89,5087,2099],{"class":99},[89,5089,104],{"class":103},[89,5091,680],{"class":95},[89,5093,1563],{"class":109},[89,5095,359],{"class":103},[89,5097,5098],{"class":91,"line":404},[89,5099,364],{"class":103},[89,5101,5102,5104,5106,5108],{"class":91,"line":409},[89,5103,370],{"class":95},[89,5105,1580],{"class":103},[89,5107,205],{"class":95},[89,5109,2122],{"class":103},[89,5111,5112],{"class":91,"line":432},[89,5113,385],{"class":103},[89,5115,5116],{"class":91,"line":437},[89,5117,338],{"emptyLinePlaceholder":337},[89,5119,5120,5122,5124],{"class":91,"line":479},[89,5121,96],{"class":95},[89,5123,398],{"class":99},[89,5125,401],{"class":103},[89,5127,5128],{"class":91,"line":516},[89,5129,364],{"class":103},[89,5131,5132,5134,5136,5138,5140,5142],{"class":91,"line":521},[89,5133,412],{"class":95},[89,5135,2185],{"class":103},[89,5137,96],{"class":95},[89,5139,423],{"class":103},[89,5141,426],{"class":95},[89,5143,2194],{"class":103},[89,5145,5146,5149,5152,5154,5157,5159,5161,5164,5166],{"class":91,"line":535},[89,5147,5148],{"class":95},"    auto",[89,5150,5151],{"class":103}," decimal_square ",[89,5153,426],{"class":95},[89,5155,5156],{"class":95}," static_cast\u003Cdouble",[89,5158,1518],{"class":103},[89,5160,680],{"class":95},[89,5162,5163],{"class":103},")",[89,5165,4805],{"class":95},[89,5167,5168],{"class":103},"(square);\n",[89,5170,5171],{"class":91,"line":568},[89,5172,338],{"emptyLinePlaceholder":337},[89,5174,5175,5177,5179,5181,5183,5185,5187,5189,5191,5193,5195,5197],{"class":91,"line":573},[89,5176,440],{"class":99},[89,5178,443],{"class":103},[89,5180,446],{"class":95},[89,5182,2224],{"class":99},[89,5184,104],{"class":103},[89,5186,460],{"class":454},[89,5188,423],{"class":103},[89,5190,446],{"class":95},[89,5192,467],{"class":331},[89,5194,470],{"class":454},[89,5196,473],{"class":331},[89,5198,476],{"class":103},[89,5200,5201,5203,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223],{"class":91,"line":583},[89,5202,440],{"class":99},[89,5204,443],{"class":103},[89,5206,446],{"class":95},[89,5208,2251],{"class":99},[89,5210,104],{"class":103},[89,5212,2256],{"class":454},[89,5214,423],{"class":103},[89,5216,446],{"class":95},[89,5218,467],{"class":331},[89,5220,470],{"class":454},[89,5222,473],{"class":331},[89,5224,476],{"class":103},[89,5226,5227],{"class":91,"line":845},[89,5228,338],{"emptyLinePlaceholder":337},[89,5230,5231,5233,5235],{"class":91,"line":850},[89,5232,370],{"class":95},[89,5234,578],{"class":454},[89,5236,476],{"class":103},[89,5238,5239],{"class":91,"line":856},[89,5240,385],{"class":103},[17,5242,5243],{},[20,5244,590],{},[80,5246,5248],{"className":5247,"code":2292,"language":596,"meta":85},[594],[25,5249,2292],{"__ignoreMap":85},[14,5251,5252],{},[17,5253,5254,5255,5257],{},"总结：优先使用明确的函数指针类型选择重载；上下文仍不明确时，再使用 ",[25,5256,5006],{},"。完整转换规则见后面的 C++ 类型转换章节。",[38,5259,5261,5262,5264],{"id":5260},"扩展示例6使用-stdfunction-保存不同的可调用对象","扩展示例6：使用 ",[25,5263,35],{}," 保存不同的可调用对象",[17,5266,5267,3529],{},[20,5268,3528],{},[17,5270,5271,5273,5274,5277],{},[25,5272,35],{}," 是标准库 ",[25,5275,5276],{},"\u003Cfunctional>"," 头文件提供的通用可调用对象包装器。它的基本语法是：",[80,5279,5281],{"className":82,"code":5280,"language":84,"meta":85,"style":85},"std::function\u003C返回值类型(参数类型列表)>\n",[25,5282,5283],{"__ignoreMap":85},[89,5284,5285,5288,5291,5293,5296],{"class":91,"line":92},[89,5286,5287],{"class":99},"std",[89,5289,5290],{"class":103},"::function",[89,5292,4901],{"class":95},[89,5294,5295],{"class":103},"返回值类型(参数类型列表)",[89,5297,5298],{"class":95},">\n",[17,5300,5301,5302,5305,5306,1170,5308,5310],{},"例如，",[25,5303,5304],{},"std::function\u003Cint(int, int)>"," 可以保存一个“接收两个 ",[25,5307,96],{},[25,5309,96],{},"”的可调用对象，包括普通函数、函数指针、匹配的 Lambda 和函数对象。",[17,5312,5313],{},[20,5314,318],{},[80,5316,5318],{"className":82,"code":5317,"language":84,"meta":85,"style":85},"#include \u003Cfunctional>\n#include \u003Ciostream>\n\nint add(int a, int b)\n{\n    return a + b;\n}\n\nint main()\n{\n    std::function\u003Cint(int, int)> operation = add;\n    std::cout \u003C\u003C operation(3, 4) \u003C\u003C \"\\n\";\n\n    int offset = 100;\n    operation = [offset](int a, int b) {\n        return a + b + offset;\n    };\n\n    std::cout \u003C\u003C operation(3, 4) \u003C\u003C \"\\n\";\n\n    return 0;\n}\n",[25,5319,5320,5327,5333,5337,5357,5361,5371,5375,5379,5387,5391,5419,5449,5453,5466,5492,5507,5511,5515,5545,5549,5557],{"__ignoreMap":85},[89,5321,5322,5324],{"class":91,"line":92},[89,5323,328],{"class":95},[89,5325,5326],{"class":331}," \u003Cfunctional>\n",[89,5328,5329,5331],{"class":91,"line":159},[89,5330,328],{"class":95},[89,5332,332],{"class":331},[89,5334,5335],{"class":91,"line":168},[89,5336,338],{"emptyLinePlaceholder":337},[89,5338,5339,5341,5343,5345,5347,5349,5351,5353,5355],{"class":91,"line":180},[89,5340,96],{"class":95},[89,5342,100],{"class":99},[89,5344,104],{"class":103},[89,5346,96],{"class":95},[89,5348,110],{"class":109},[89,5350,113],{"class":103},[89,5352,96],{"class":95},[89,5354,118],{"class":109},[89,5356,359],{"class":103},[89,5358,5359],{"class":91,"line":367},[89,5360,364],{"class":103},[89,5362,5363,5365,5367,5369],{"class":91,"line":382},[89,5364,370],{"class":95},[89,5366,373],{"class":103},[89,5368,376],{"class":95},[89,5370,379],{"class":103},[89,5372,5373],{"class":91,"line":388},[89,5374,385],{"class":103},[89,5376,5377],{"class":91,"line":393},[89,5378,338],{"emptyLinePlaceholder":337},[89,5380,5381,5383,5385],{"class":91,"line":404},[89,5382,96],{"class":95},[89,5384,398],{"class":99},[89,5386,401],{"class":103},[89,5388,5389],{"class":91,"line":409},[89,5390,364],{"class":103},[89,5392,5393,5395,5397,5400,5402,5404,5406,5408,5410,5412,5415,5417],{"class":91,"line":432},[89,5394,440],{"class":99},[89,5396,5290],{"class":103},[89,5398,5399],{"class":95},"\u003Cint",[89,5401,104],{"class":103},[89,5403,96],{"class":95},[89,5405,113],{"class":103},[89,5407,96],{"class":95},[89,5409,5163],{"class":103},[89,5411,4805],{"class":95},[89,5413,5414],{"class":103}," operation ",[89,5416,426],{"class":95},[89,5418,429],{"class":103},[89,5420,5421,5423,5425,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445,5447],{"class":91,"line":437},[89,5422,440],{"class":99},[89,5424,443],{"class":103},[89,5426,446],{"class":95},[89,5428,1052],{"class":99},[89,5430,104],{"class":103},[89,5432,455],{"class":454},[89,5434,113],{"class":103},[89,5436,792],{"class":454},[89,5438,423],{"class":103},[89,5440,446],{"class":95},[89,5442,467],{"class":331},[89,5444,470],{"class":454},[89,5446,473],{"class":331},[89,5448,476],{"class":103},[89,5450,5451],{"class":91,"line":479},[89,5452,338],{"emptyLinePlaceholder":337},[89,5454,5455,5457,5459,5461,5464],{"class":91,"line":516},[89,5456,412],{"class":95},[89,5458,4967],{"class":103},[89,5460,426],{"class":95},[89,5462,5463],{"class":454}," 100",[89,5465,476],{"class":103},[89,5467,5468,5470,5472,5475,5478,5480,5482,5484,5486,5488,5490],{"class":91,"line":521},[89,5469,1081],{"class":103},[89,5471,426],{"class":95},[89,5473,5474],{"class":103}," [",[89,5476,5477],{"class":109},"offset",[89,5479,1938],{"class":103},[89,5481,96],{"class":95},[89,5483,110],{"class":109},[89,5485,113],{"class":103},[89,5487,96],{"class":95},[89,5489,118],{"class":109},[89,5491,4796],{"class":103},[89,5493,5494,5496,5498,5500,5502,5504],{"class":91,"line":535},[89,5495,2444],{"class":95},[89,5497,373],{"class":103},[89,5499,376],{"class":95},[89,5501,4808],{"class":103},[89,5503,376],{"class":95},[89,5505,5506],{"class":103}," offset;\n",[89,5508,5509],{"class":91,"line":568},[89,5510,4823],{"class":103},[89,5512,5513],{"class":91,"line":573},[89,5514,338],{"emptyLinePlaceholder":337},[89,5516,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543],{"class":91,"line":583},[89,5518,440],{"class":99},[89,5520,443],{"class":103},[89,5522,446],{"class":95},[89,5524,1052],{"class":99},[89,5526,104],{"class":103},[89,5528,455],{"class":454},[89,5530,113],{"class":103},[89,5532,792],{"class":454},[89,5534,423],{"class":103},[89,5536,446],{"class":95},[89,5538,467],{"class":331},[89,5540,470],{"class":454},[89,5542,473],{"class":331},[89,5544,476],{"class":103},[89,5546,5547],{"class":91,"line":845},[89,5548,338],{"emptyLinePlaceholder":337},[89,5550,5551,5553,5555],{"class":91,"line":850},[89,5552,370],{"class":95},[89,5554,578],{"class":454},[89,5556,476],{"class":103},[89,5558,5559],{"class":91,"line":856},[89,5560,385],{"class":103},[17,5562,5563],{},[20,5564,590],{},[80,5566,5569],{"className":5567,"code":5568,"language":596,"meta":85},[594],"7\n107\n",[25,5570,5568],{"__ignoreMap":85},[17,5572,5573,5574,5576,5577,5579],{},"普通函数指针不能保存有捕获的 Lambda，",[25,5575,35],{}," 可以。但 ",[25,5578,35],{}," 使用类型擦除实现统一包装，存在额外的间接调用开销，某些情况下还可能发生动态内存分配。因此，不应在所有场景中无条件用它替代函数指针。",[17,5581,5582,5583,3787],{},"完整用法和更多示例见后面的 ",[25,5584,35],{},[38,5586,5588,5589,5591],{"id":5587},"函数指针lambda-与-stdfunction-的选择","函数指针、Lambda 与 ",[25,5590,35],{}," 的选择",[17,5593,5594],{},"|Requirement|推荐方式|Explanation|",[17,5596,5597],{},"|:---|:---|:---|\n|保存普通函数或无捕获 Lambda|function pointer|类型简单，没有类型擦除开销|",[17,5599,5600,5601,5603],{},"|保存有捕获 Lambda|Lambda 自身类型或 ",[25,5602,35],{},"|普通函数指针无法保存捕获的数据|",[17,5605,5606],{},"|接收任意类型并且只立即调用|模板参数|通常能保留具体类型并被编译器优化|",[17,5608,5609,5610,5612],{},"|在成员变量中统一保存多种回调|",[25,5611,35],{},"|可以统一包装多种可调用对象|",[17,5614,5615],{},"|调用指定对象的非静态成员函数|pointer to member function|调用时必须同时提供对象|",[17,5617,5618],{},"这里的“模板参数”和“Lambda 自身类型”需要结合后面的模板及 Lambda 章节理解。初次学习只需记住：函数指针适合保存普通函数和无捕获 Lambda；需求更复杂时，再考虑其他工具。",[10,5620,5622],{"id":5621},"common-errors","Common Errors",[38,5624,5626],{"id":5625},"错误1忘记变量名两侧的括号","错误1：忘记变量名两侧的括号",[80,5628,5630],{"className":82,"code":5629,"language":84,"meta":85,"style":85},"int (*operation)(int, int); \u002F\u002F 正确：函数指针\nint *operation(int, int);   \u002F\u002F 这是返回 int* 的函数声明\n",[25,5631,5632,5649],{"__ignoreMap":85},[89,5633,5634,5636,5638,5640,5642,5644,5646],{"class":91,"line":92},[89,5635,96],{"class":95},[89,5637,223],{"class":103},[89,5639,96],{"class":95},[89,5641,113],{"class":103},[89,5643,96],{"class":95},[89,5645,232],{"class":103},[89,5647,5648],{"class":235}," \u002F\u002F 正确：函数指针\n",[89,5650,5651,5653,5655,5657,5659,5661,5663,5665,5667],{"class":91,"line":159},[89,5652,96],{"class":95},[89,5654,243],{"class":95},[89,5656,246],{"class":99},[89,5658,104],{"class":103},[89,5660,96],{"class":95},[89,5662,113],{"class":103},[89,5664,96],{"class":95},[89,5666,232],{"class":103},[89,5668,5669],{"class":235},"   \u002F\u002F 这是返回 int* 的函数声明\n",[38,5671,5673],{"id":5672},"错误2函数类型不匹配","错误2：函数类型不匹配",[80,5675,5677],{"className":82,"code":5676,"language":84,"meta":85,"style":85},"void print(int value);\n\n\u002F\u002F int (*operation)(int, int) = print; \u002F\u002F 错误：返回值和参数列表不匹配\n",[25,5678,5679,5694,5698],{"__ignoreMap":85},[89,5680,5681,5683,5686,5688,5690,5692],{"class":91,"line":92},[89,5682,1553],{"class":95},[89,5684,5685],{"class":99}," print",[89,5687,104],{"class":103},[89,5689,96],{"class":95},[89,5691,1563],{"class":109},[89,5693,121],{"class":103},[89,5695,5696],{"class":91,"line":159},[89,5697,338],{"emptyLinePlaceholder":337},[89,5699,5700,5703],{"class":91,"line":168},[89,5701,5702],{"class":235},"\u002F\u002F int (*operation)(int, int) = print;",[89,5704,5705],{"class":235}," \u002F\u002F 错误：返回值和参数列表不匹配\n",[38,5707,5709],{"id":5708},"错误3调用空函数指针","错误3：调用空函数指针",[80,5711,5713],{"className":82,"code":5712,"language":84,"meta":85,"style":85},"void (*task)() = nullptr;\n\n\u002F\u002F task(); \u002F\u002F 错误：产生未定义行为\n\nif (task)\n{\n    task(); \u002F\u002F 正确：先检查再调用\n}\n",[25,5714,5715,5727,5731,5739,5743,5749,5753,5764],{"__ignoreMap":85},[89,5716,5717,5719,5721,5723,5725],{"class":91,"line":92},[89,5718,1553],{"class":95},[89,5720,3635],{"class":103},[89,5722,426],{"class":95},[89,5724,3640],{"class":454},[89,5726,476],{"class":103},[89,5728,5729],{"class":91,"line":159},[89,5730,338],{"emptyLinePlaceholder":337},[89,5732,5733,5736],{"class":91,"line":168},[89,5734,5735],{"class":235},"\u002F\u002F task();",[89,5737,5738],{"class":235}," \u002F\u002F 错误：产生未定义行为\n",[89,5740,5741],{"class":91,"line":180},[89,5742,338],{"emptyLinePlaceholder":337},[89,5744,5745,5747],{"class":91,"line":367},[89,5746,3547],{"class":95},[89,5748,3654],{"class":103},[89,5750,5751],{"class":91,"line":382},[89,5752,364],{"class":103},[89,5754,5755,5758,5761],{"class":91,"line":388},[89,5756,5757],{"class":99},"    task",[89,5759,5760],{"class":103},"();",[89,5762,5763],{"class":235}," \u002F\u002F 正确：先检查再调用\n",[89,5765,5766],{"class":91,"line":393},[89,5767,385],{"class":103},[38,5769,5771],{"id":5770},"错误4用普通函数指针保存非静态成员函数","错误4：用普通函数指针保存非静态成员函数",[80,5773,5775],{"className":82,"code":5774,"language":84,"meta":85,"style":85},"class Robot\n{\npublic:\n    void run();\n};\n\n\u002F\u002F void (*task)() = &Robot::run;     \u002F\u002F 错误\nvoid (Robot::*task)() = &Robot::run; \u002F\u002F 正确\n",[25,5776,5777,5784,5788,5792,5801,5805,5809,5817],{"__ignoreMap":85},[89,5778,5779,5781],{"class":91,"line":92},[89,5780,2398],{"class":95},[89,5782,5783],{"class":99}," Robot\n",[89,5785,5786],{"class":91,"line":159},[89,5787,364],{"class":103},[89,5789,5790],{"class":91,"line":168},[89,5791,2410],{"class":95},[89,5793,5794,5796,5799],{"class":91,"line":180},[89,5795,2983],{"class":95},[89,5797,5798],{"class":99}," run",[89,5800,3666],{"class":103},[89,5802,5803],{"class":91,"line":367},[89,5804,2460],{"class":103},[89,5806,5807],{"class":91,"line":382},[89,5808,338],{"emptyLinePlaceholder":337},[89,5810,5811,5814],{"class":91,"line":388},[89,5812,5813],{"class":235},"\u002F\u002F void (*task)() = &Robot::run;",[89,5815,5816],{"class":235},"     \u002F\u002F 错误\n",[89,5818,5819,5821,5823,5826,5828,5830,5833,5835,5837,5839,5842],{"class":91,"line":393},[89,5820,1553],{"class":95},[89,5822,488],{"class":103},[89,5824,5825],{"class":99},"Robot",[89,5827,2738],{"class":103},[89,5829,205],{"class":95},[89,5831,5832],{"class":103},"task)() ",[89,5834,426],{"class":95},[89,5836,529],{"class":95},[89,5838,5825],{"class":99},[89,5840,5841],{"class":103},"::run;",[89,5843,5844],{"class":235}," \u002F\u002F 正确\n",[38,5846,5848],{"id":5847},"错误5调用成员函数指针时没有提供对象","错误5：调用成员函数指针时没有提供对象",[80,5850,5852],{"className":82,"code":5851,"language":84,"meta":85,"style":85},"Robot robot;\nvoid (Robot::*task)() = &Robot::run;\n\n\u002F\u002F task();          \u002F\u002F 错误：没有对象\n(robot.*task)();    \u002F\u002F 正确\n",[25,5853,5854,5859,5882,5886,5893],{"__ignoreMap":85},[89,5855,5856],{"class":91,"line":92},[89,5857,5858],{"class":103},"Robot robot;\n",[89,5860,5861,5863,5865,5867,5869,5871,5873,5875,5877,5879],{"class":91,"line":159},[89,5862,1553],{"class":95},[89,5864,488],{"class":103},[89,5866,5825],{"class":99},[89,5868,2738],{"class":103},[89,5870,205],{"class":95},[89,5872,5832],{"class":103},[89,5874,426],{"class":95},[89,5876,529],{"class":95},[89,5878,5825],{"class":99},[89,5880,5881],{"class":103},"::run;\n",[89,5883,5884],{"class":91,"line":168},[89,5885,338],{"emptyLinePlaceholder":337},[89,5887,5888,5890],{"class":91,"line":180},[89,5889,5735],{"class":235},[89,5891,5892],{"class":235},"          \u002F\u002F 错误：没有对象\n",[89,5894,5895,5898],{"class":91,"line":367},[89,5896,5897],{"class":103},"(robot.*task)();",[89,5899,5900],{"class":235},"    \u002F\u002F 正确\n",[38,5902,5904],{"id":5903},"错误6把有捕获的-lambda-转换为函数指针","错误6：把有捕获的 Lambda 转换为函数指针",[80,5906,5908],{"className":82,"code":5907,"language":84,"meta":85,"style":85},"using Operation = int (*)(int);\nint offset = 10;\n\n\u002F\u002F Operation operation = [offset](int value) {\n\u002F\u002F     return value + offset;\n\u002F\u002F }; \u002F\u002F 错误\n",[25,5909,5910,5930,5942,5946,5951,5956],{"__ignoreMap":85},[89,5911,5912,5914,5916,5918,5920,5922,5924,5926,5928],{"class":91,"line":92},[89,5913,31],{"class":95},[89,5915,3844],{"class":99},[89,5917,3383],{"class":95},[89,5919,2418],{"class":95},[89,5921,488],{"class":103},[89,5923,205],{"class":95},[89,5925,1307],{"class":103},[89,5927,96],{"class":95},[89,5929,121],{"class":103},[89,5931,5932,5934,5936,5938,5940],{"class":91,"line":159},[89,5933,96],{"class":95},[89,5935,4967],{"class":103},[89,5937,426],{"class":95},[89,5939,4972],{"class":454},[89,5941,476],{"class":103},[89,5943,5944],{"class":91,"line":168},[89,5945,338],{"emptyLinePlaceholder":337},[89,5947,5948],{"class":91,"line":180},[89,5949,5950],{"class":235},"\u002F\u002F Operation operation = [offset](int value) {\n",[89,5952,5953],{"class":91,"line":367},[89,5954,5955],{"class":235},"\u002F\u002F     return value + offset;\n",[89,5957,5958,5960],{"class":91,"line":382},[89,5959,4993],{"class":235},[89,5961,5962],{"class":235}," \u002F\u002F 错误\n",[10,5964,5965],{"id":5965},"总结",[55,5967,5968],{},[58,5969,5970],{},"函数指针保存函数地址，类型中包含函数的返回值和参数列表。",[55,5972,5973],{},[58,5974,5975],{},"函数名通常可以直接赋给签名兼容的函数指针。",[55,5977,5978],{},[58,5979,5980],{},"函数指针可以用于回调、运行时选择函数和函数表。",[55,5982,5983],{},[58,5984,5985],{},"静态成员函数可以使用普通函数指针。",[55,5987,5988],{},[58,5989,5990],{},"非静态成员函数需要成员函数指针，并且调用时必须提供对象。",[55,5992,5993],{},[58,5994,5995,5996,3205,5998,189],{},"对象使用 ",[25,5997,2581],{},[25,5999,2362],{},[55,6001,6002],{},[58,6003,6004,6006],{},[25,6005,3214],{}," 是成员函数指针类型的一部分。",[55,6008,6009],{},[58,6010,6011],{},"可能为空的函数指针必须在调用前检查。",[55,6013,6014],{},[58,6015,6016,6017,6019],{},"现代 C++ 可以使用 ",[25,6018,31],{}," 简化类型，用无捕获 Lambda 创建函数指针。",[55,6021,6022],{},[58,6023,6024,6025,189],{},"需要统一保存多种可调用对象时，可以使用 ",[25,6026,35],{},[6028,6029,6030],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":85,"searchDepth":159,"depth":159,"links":6032},[6033,6043,6051,6065,6073],{"id":12,"depth":159,"text":5,"children":6034},[6035,6036,6037,6038,6039,6040,6041,6042],{"id":40,"depth":168,"text":40},{"id":267,"depth":168,"text":268},{"id":610,"depth":168,"text":611},{"id":896,"depth":168,"text":897},{"id":1150,"depth":168,"text":1151},{"id":1448,"depth":168,"text":1449},{"id":1702,"depth":168,"text":1703},{"id":2066,"depth":168,"text":2067},{"id":2300,"depth":159,"text":2301,"children":6044},[6045,6046,6047,6048,6049],{"id":2304,"depth":168,"text":2304},{"id":2367,"depth":168,"text":2368},{"id":2560,"depth":168,"text":2561},{"id":2877,"depth":168,"text":2878},{"id":3210,"depth":168,"text":6050},"示例11：const 成员函数指针",{"id":3510,"depth":159,"text":3511,"children":6052},[6053,6055,6057,6058,6059,6061,6063],{"id":3519,"depth":168,"text":6054},"扩展示例1：使用 nullptr 表示空函数指针",{"id":3790,"depth":168,"text":6056},"扩展示例2：使用 using 给函数指针类型起别名",{"id":4230,"depth":168,"text":4231},{"id":4620,"depth":168,"text":4621},{"id":5002,"depth":168,"text":6060},"扩展示例5：使用 static_cast 选择重载函数",{"id":5260,"depth":168,"text":6062},"扩展示例6：使用 std::function 保存不同的可调用对象",{"id":5587,"depth":168,"text":6064},"函数指针、Lambda 与 std::function 的选择",{"id":5621,"depth":159,"text":5622,"children":6066},[6067,6068,6069,6070,6071,6072],{"id":5625,"depth":168,"text":5626},{"id":5672,"depth":168,"text":5673},{"id":5708,"depth":168,"text":5709},{"id":5770,"depth":168,"text":5771},{"id":5847,"depth":168,"text":5848},{"id":5903,"depth":168,"text":5904},{"id":5965,"depth":159,"text":5965},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen",0,"1450","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教学\u002F1450-函数指针",false,null,"en-US","en-us",{},{"title":5,"description":85},"\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1450-函数指针","b9HUpYHwLhYhHGd6lZaOefKgclBZJXxK09l1mCxDMok",[6094,6099,6104,6109,6114,6119,6124,6129,6134,6139,6144,6149,6154,6159,6164,6169,6174,6179,6184,6189,6194,6199,6200,6205,6210,6215,6220,6225,6230,6235,6240,6245,6250,6255,6260,6265,6270,6275,6280,6285,6289,6293,6297,6302,6307,6312,6317,6322,6327,6332,6337,6341,6346,6351,6356,6361,6366,6371,6376,6381,6386,6391,6396,6401,6406,6411,6416,6421,6426,6431,6436,6441,6446,6451,6456,6461,6466,6471,6476,6481,6486,6491,6496,6501],{"path":6095,"stem":6096,"title":6097,"date":6077,"chapterOrder":6098,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6100,"stem":6101,"title":6102,"date":6077,"chapterOrder":6103,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6105,"stem":6106,"title":6107,"date":6077,"chapterOrder":6108,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6110,"stem":6111,"title":6112,"date":6077,"chapterOrder":6113,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6115,"stem":6116,"title":6117,"date":6077,"chapterOrder":6118,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6120,"stem":6121,"title":6122,"date":6077,"chapterOrder":6123,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6125,"stem":6126,"title":6127,"date":6077,"chapterOrder":6128,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0700-shu-zu","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0700-数组","array","0700",{"path":6130,"stem":6131,"title":6132,"date":6077,"chapterOrder":6133,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6135,"stem":6136,"title":6137,"date":6077,"chapterOrder":6138,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F0900-zhi-zhen","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F0900-指针","pointer","0900",{"path":6140,"stem":6141,"title":6142,"date":6077,"chapterOrder":6143,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6145,"stem":6146,"title":6147,"date":6077,"chapterOrder":6148,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6150,"stem":6151,"title":6152,"date":6077,"chapterOrder":6153,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1200-yin-yong","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1200-引用","reference","1200",{"path":6155,"stem":6156,"title":6157,"date":6077,"chapterOrder":6158,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1300-han-shu-ti-gao","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1300-函数提高","Function Optimization","1300",{"path":6160,"stem":6161,"title":6162,"date":6077,"chapterOrder":6163,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1350-ming-ming-kong-jian","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1350-命名空间","命名空间","1350",{"path":6165,"stem":6166,"title":6167,"date":6077,"chapterOrder":6168,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6170,"stem":6171,"title":6172,"date":6077,"chapterOrder":6173,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6175,"stem":6176,"title":6177,"date":6077,"chapterOrder":6178,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6180,"stem":6181,"title":6182,"date":6077,"chapterOrder":6183,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6185,"stem":6186,"title":6187,"date":6077,"chapterOrder":6188,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6190,"stem":6191,"title":6192,"date":6077,"chapterOrder":6193,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6195,"stem":6196,"title":6197,"date":6077,"chapterOrder":6198,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6074,"stem":6091,"title":5,"date":6077,"chapterOrder":6076,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},{"path":6201,"stem":6202,"title":6203,"date":6077,"chapterOrder":6204,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6206,"stem":6207,"title":6208,"date":6077,"chapterOrder":6209,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6211,"stem":6212,"title":6213,"date":6077,"chapterOrder":6214,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1700-mu-ban","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1700-模板","template","1700",{"path":6216,"stem":6217,"title":6218,"date":6077,"chapterOrder":6219,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6221,"stem":6222,"title":6223,"date":6077,"chapterOrder":6224,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6226,"stem":6227,"title":6228,"date":6077,"chapterOrder":6229,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6231,"stem":6232,"title":6233,"date":6077,"chapterOrder":6234,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6236,"stem":6237,"title":6238,"date":6077,"chapterOrder":6239,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6241,"stem":6242,"title":6243,"date":6077,"chapterOrder":6244,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6246,"stem":6247,"title":6248,"date":6077,"chapterOrder":6249,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6251,"stem":6252,"title":6253,"date":6077,"chapterOrder":6254,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6256,"stem":6257,"title":6258,"date":6077,"chapterOrder":6259,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6261,"stem":6262,"title":6263,"date":6077,"chapterOrder":6264,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6266,"stem":6267,"title":6268,"date":6077,"chapterOrder":6269,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6271,"stem":6272,"title":6273,"date":6077,"chapterOrder":6274,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6276,"stem":6277,"title":6278,"date":6077,"chapterOrder":6279,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6281,"stem":6282,"title":6283,"date":6077,"chapterOrder":6284,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1900-c-lei-xing-zhuan-huan","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F1900-C++类型转换","C++ Type Casting","1900",{"path":6286,"stem":6287,"title":5018,"date":6077,"chapterOrder":6288,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0100-auto","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0100-auto","2000-0100",{"path":6290,"stem":6291,"title":27,"date":6077,"chapterOrder":6292,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6294,"stem":6295,"title":31,"date":6077,"chapterOrder":6296,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\u002Fen-us\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F2000-0300-using","_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002F2000-0300-using","2000-0300",{"path":6298,"stem":6299,"title":6300,"date":6077,"chapterOrder":6301,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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","enum class","2000-0400",{"path":6303,"stem":6304,"title":6305,"date":6077,"chapterOrder":6306,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6308,"stem":6309,"title":6310,"date":6077,"chapterOrder":6311,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6313,"stem":6314,"title":6315,"date":6077,"chapterOrder":6316,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6318,"stem":6319,"title":6320,"date":6077,"chapterOrder":6321,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6323,"stem":6324,"title":6325,"date":6077,"chapterOrder":6326,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6328,"stem":6329,"title":6330,"date":6077,"chapterOrder":6331,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6333,"stem":6334,"title":6335,"date":6077,"chapterOrder":6336,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6338,"stem":6339,"title":35,"date":6077,"chapterOrder":6340,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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","2000-1200",{"path":6342,"stem":6343,"title":6344,"date":6077,"chapterOrder":6345,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6347,"stem":6348,"title":6349,"date":6077,"chapterOrder":6350,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6352,"stem":6353,"title":6354,"date":6077,"chapterOrder":6355,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6357,"stem":6358,"title":6359,"date":6077,"chapterOrder":6360,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6362,"stem":6363,"title":6364,"date":6077,"chapterOrder":6365,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6367,"stem":6368,"title":6369,"date":6077,"chapterOrder":6370,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6372,"stem":6373,"title":6374,"date":6077,"chapterOrder":6375,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6377,"stem":6378,"title":6379,"date":6077,"chapterOrder":6380,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6382,"stem":6383,"title":6384,"date":6077,"chapterOrder":6385,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6387,"stem":6388,"title":6389,"date":6077,"chapterOrder":6390,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6392,"stem":6393,"title":6394,"date":6077,"chapterOrder":6395,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6397,"stem":6398,"title":6399,"date":6077,"chapterOrder":6400,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6402,"stem":6403,"title":6404,"date":6077,"chapterOrder":6405,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6407,"stem":6408,"title":6409,"date":6077,"chapterOrder":6410,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6412,"stem":6413,"title":6414,"date":6077,"chapterOrder":6415,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6417,"stem":6418,"title":6419,"date":6077,"chapterOrder":6420,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6422,"stem":6423,"title":6424,"date":6077,"chapterOrder":6425,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6427,"stem":6428,"title":6429,"date":6077,"chapterOrder":6430,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6432,"stem":6433,"title":6434,"date":6077,"chapterOrder":6435,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6437,"stem":6438,"title":6439,"date":6077,"chapterOrder":6440,"chapterDepth":159,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6442,"stem":6443,"title":6444,"date":6077,"chapterOrder":6445,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6447,"stem":6448,"title":6449,"date":6077,"chapterOrder":6450,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6452,"stem":6453,"title":6454,"date":6077,"chapterOrder":6455,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6457,"stem":6458,"title":6459,"date":6077,"chapterOrder":6460,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6462,"stem":6463,"title":6464,"date":6077,"chapterOrder":6465,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6467,"stem":6468,"title":6469,"date":6077,"chapterOrder":6470,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6472,"stem":6473,"title":6474,"date":6077,"chapterOrder":6475,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6477,"stem":6478,"title":6479,"date":6077,"chapterOrder":6480,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6482,"stem":6483,"title":6484,"date":6077,"chapterOrder":6485,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6487,"stem":6488,"title":6489,"date":6077,"chapterOrder":6490,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6492,"stem":6493,"title":6494,"date":6077,"chapterOrder":6495,"chapterDepth":92,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6497,"stem":6498,"title":6499,"date":6077,"chapterOrder":6500,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":6084},"\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":6080,"stem":6502,"title":6503,"date":6077,"chapterOrder":6085,"chapterDepth":6075,"docKey":6079,"docRoot":6080,"docTitle":6081,"isWikiDoc":337,"isWikiIndex":337},"_i18n\u002Fen-us\u002Fwiki\u002F2023-10-05-Cplusplus教学\u002Findex","C\u002FC++ tutorial",{"variants":6505},[6506,6507,6510,6513,6516],{"path":6074,"localeSlug":6087,"i18nKey":6083},{"path":6508,"localeSlug":6509,"i18nKey":6083},"\u002Fzh-hant\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","zh-hant",{"path":6511,"localeSlug":6512,"i18nKey":6083},"\u002Fzh-hk\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","zh-hk",{"path":6514,"localeSlug":6515,"i18nKey":6083},"\u002Fzh-tw\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","zh-tw",{"path":6517,"localeSlug":6518,"i18nKey":6083},"\u002Fzh-cn\u002Fwiki\u002F2023-10-05-cplusplus-jiao-xue\u002F1450-han-shu-zhi-zhen","zh-cn",[6074,6090,6508,6090,6511,6090,6514,6090,6517,6090],1784727908450]