运行如下代码会输出( )。
struct Cat {
string name;
int age;
};
void birthday(Cat& c) {
c.age++;
}
int main() {
Cat kitty{"Mimi", 2};
birthday(kitty);
cout << kitty.name << " " << kitty.age;
}答案B。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】引用传参|结构体成员访问
【考纲定位】本题属于 GESP 四级 C++ 基础语法模块,命题人专门卡住"引用传参"这个薄弱环节。绝大多数考生看到 void birthday(Cat& c) 会下意识按值传参理解,却忽略了引用就是别名,函数内修改 c.age 必然改变原对象 kitty.age。
【解题思维】第一反应定位参数类型:Cat& c 是引用而非值,birthday(kitty) 把 kitty 的地址绑定给 c,因此 c.age++ 直接作用于 kitty.age。初始 age=2,调用后变为 3,输出语句直接打印 kitty.name 与 kitty.age,故为 "Mimi 3"。此类题通法:看到引用参数先确认"是否修改原对象",无论函数名如何,只要参数是引用且函数内修改成员,外部对象必变。
【陷阱拆解】A 项"Mimi 2"是典型的按值传参陷阱,把引用误作拷贝;C、D 项"kitty 3/2"偷换概念,把对象名当成成员名,混淆 kitty.name 与 kitty 本身;题目最阴险的是 string 类型,考生容易纠结字符串操作,实则只是用来迷惑注意力。只背结论不读参数类型,必掉坑。
【反命题思维】若把 Cat& c 改为 Cat c(按值传参),答案会变成 "Mimi 2";若把输出改为 cout << c.name << " " << c.age; 则答案仍是 "Mimi 3" 但考察点变成引用别名。刷到类似题先问:"参数是引用还是值?修改的是原对象还是副本?" 一句话定位本质。