以下代码中,类的构造函数被调用了( )次。
class MyClass {
public:
MyClass() {
cout << "Constructor called!" << endl;
}
};
int main() {
MyClass obj1;
MyClass obj2 = obj1;
return 0;
}仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】构造函数|拷贝构造函数|对象初始化
1. 🎯 考纲定位 GESP六级C++模块"类与对象",专门卡住考生对"初始化列表"与"赋值操作"的区分能力。命题人用"="符号制造视觉误导——在声明位置触发拷贝构造,在表达式位置触发赋值运算符,这是六级经典陷阱。
2. 🧠 解题思维 看到 MyClass obj1; 先触发默认构造,计1次。 看到 MyClass obj2 = obj1; 这是拷贝初始化语法,直接调用拷贝构造函数(C++11起移动构造更优先,但本题没有右值引用,仍走拷贝构造),再计1次。 main 函数里没有显式调用赋值运算符,所以构造总次数就是2次。 核心判断链:先问"obj2 是声明还是表达式?"再问"= 左边是对象名还是临时对象?"最后匹配到拷贝构造。
3. 🪤 陷阱拆解 选项B(2次)是典型"以为拷贝初始化不算构造"的陷阱,命题人用"="符号误导考生忽略初始化列表的语义。 选项C(3次)是把拷贝构造与赋值操作混在一起,以为 obj2 = obj1 还会额外调用赋值运算符,但赋值运算符在构造完成后才存在,这里只发生拷贝构造。 选项D(0次)属于完全不懂对象构造的概念。 最阴险的细节是"=在声明中触发拷贝构造,在表达式中触发赋值",考生不区分场景就会掉坑。
4. 🔄 反命题思维 如果把声明写成 MyClass obj2 = MyClass(); 会先构造临时对象再拷贝,构造次数变成3次。 如果把声明写成 MyClass obj2; obj2 = obj1; 则先默认构造 obj2,再调用赋值运算符,构造次数仍为2次,但调用顺序不同。 刷到类似题先问:这个"="是在声明里还是赋值里?是在拷贝初始化还是赋值操作里?