下面这段代码会输出( )。
int add(int a, int b = 1); // 函数声明
int main() {
cout << add(2) << " " << add(2, 3);
return 0;
}
int add(int a, int b) { // 函数定义
return a + b;
}答案A。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】默认参数|函数声明与定义
GESP四级默认参数必考,考点在于区分声明与定义处的规则差异。命题人专卡新手对C++默认参数机制的误解——以为定义处需显式写默认值,实则只需声明处指定即可。
先看声明int add(int a, int b = 1);,b有默认值1,调用add(2)时b自动补1,得3;再看定义int add(int a, int b){return a+b;},b虽无默认但声明已给,add(2,3)直接传3,得5。通法:默认参数只在声明处生效,定义处可省略,调用时优先用实参,无实参才用默认值。
B选项是最大陷阱:定义处少了默认参数。很多人背"C++默认参数必须在定义处写",其实这是错的,声明处指定即可。D选项链接失败更是离谱——函数既有声明又有定义,链接器不会报错。C选项运行错误纯属臆想,add(2)和add(2,3)都是合法调用,无运行时异常。
反命题思维:若定义处写b = 2,则add(2,3)会因参数冲突报错;若声明处无默认,add(2)就会编译失败。遇到默认参数题,先问"声明处有没有默认值",再问"调用时传了几个参数",别被定义处的参数列表误导。