下面的代码在 main() 中有一行会导致编译错误,请找出来。
class Pet {
public:
Pet(string n, int a) : name(n), age(a) {}
string getName() { return name; }
void birthday() { age++; }
private:
string name;
int age;
};
int main() {
Pet cat("奶茶", 2);
cout << cat.getName(); // ①
cat.birthday(); // ②
cat.name = "大橘"; // ③
cout << cat.getName(); // ④
}逐项分析每个选项,利用C++语法规则和算法知识判断正误。注意隐含条件(如整型溢出、栈溢出)。
注意题目问的是"错误的是"还是"正确的是",避免看反。选项中若有绝对化表述通常错误。
【考点】类成员访问控制|构造函数|私有成员访问
🎯 考纲定位 GESP 六级大纲“面向对象编程”模块,命题人卡住的是对private访问权限的机械记忆——很多考生知道成员是私有的,却误以为构造函数或main能直接访问,暴露了“只记语法、不懂封装”的致命弱点。
🧠 解题思维 看到private成员,先确认访问路径:构造函数只在实例化时调用,main是普通函数,无法直接访问私有成员。本题陷阱在于混淆“初始化”与“赋值”——构造函数负责初始化,而main里试图赋值,违反了封装原则。
🪤 陷阱拆解 第③行试图直接访问private成员name,但main是普通函数,没有权限。其他行都通过公共方法访问,符合封装。命题人利用“构造函数=唯一赋值途径”的误区,其实构造函数只负责初始化,后续赋值必须通过公共接口。
🔄 反命题思维 若把name改为public,第③行合法,但第①行冗余;若添加setName公共方法,第③行可改为调用它。刷到类似题,先问“这个成员是谁能访问的”——命题人最爱考“权限边界”而非语法细节。