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