以下代码中,构造函数被调用的次数是 1 次。
class Test {
public:
Test() { cout << "T "; }
};
int main() {
Test a;
Test b = a;
}C++类:构造函数(对象创建时调用)、析构函数(对象销毁时调用)、虚函数(实现多态)。构造函数不能为虚。
构造函数不能是虚函数(虚表在构造函数完成后才建立)。析构函数可以且通常应该为虚函数(防止内存泄漏)。
【考点】构造函数|拷贝构造|对象初始化
1. 考纲定位 GESP 六级 C++ 面向对象模块,构造函数与拷贝构造。命题人卡住“学生以为只定义了一个构造函数就只用它”的盲区,这是六级该有的精度,不是给初学者留的坑。
2. 解题思维 看到 Test a; 先想到默认构造,这是第一步;看到 Test b = a; 想到拷贝构造,这是第二步。编译器自动生成的拷贝构造函数 Test(const Test&) 虽然没写,但被调用。所以构造次数是 2 次,题干说 1 次错。每行构造一次,共两次。
3. 陷阱拆解 陷阱:学生常把“拷贝初始化”当成“赋值”;把“默认构造”当成唯一构造。更阴险的是,题干没写“默认构造函数被调用 1 次”,而只说“构造函数”,这就把隐式拷贝构造也包进去了。比如你只写了一个默认构造,编译器就会帮你补一个拷贝构造,但你若以为没写就不算,那就掉坑了。
4. 反命题思维 若把 Test b = a; 改成 Test b(a); 或类里写了拷贝构造,答案还是 2 次。改一个条件:把拷贝初始化改成成员初始化列表,答案不变;改一个考法:类里定义了拷贝构造,答案还是 2 次。刷到类似题先问“这里有没有触发拷贝/移动构造”。