运行下列代码,屏幕上输出( )。
#include <iostream>
using namespace std;
class my_class {
public:
static int count;
my_class() {
count++;
}
~my_class() {
count--;
}
static void print_count() {
cout << count << " ";
}
};
int my_class::count = 0;
int main() {
my_class obj1;
my_class::print_count();
my_class obj2;
obj2.print_count();
my_class obj3;
obj3.print_count();
return 0;
}C++类:构造函数(对象创建时调用)、析构函数(对象销毁时调用)、虚函数(实现多态)。构造函数不能为虚。
构造函数不能是虚函数(虚表在构造函数完成后才建立)。析构函数可以且通常应该为虚函数(防止内存泄漏)。
【考点】静态成员变量|构造函数执行时机|析构函数执行时机|对象生命周期
考纲定位:GESP六级面向对象编程模块,命题人用静态成员变量卡住"类共享成员与对象生命周期"的混淆点,绝大多数人误以为每次创建对象后立刻执行析构。
解题思维:静态成员count全局共享(初始0),每构造一个对象count++,每销毁一个count--。main中先创建obj1→count=1,随即调用print_count输出1;再创建obj2→count=2,输出2;再创建obj3→count=3,输出3。注意析构仅在对象离开作用域时触发,而三次调用print_count都在obj3销毁之前,因此输出序列为1 2 3。
陷阱拆解:A项把count当成实例成员,认为每次打印前都重置;C项误以为析构立即执行,导致第二次打印后count被减回1;D项混淆了析构时机,以为obj2销毁在obj3创建之前。最阴险细节是"创建即销毁"的错觉——静态成员永不自动清零,必须等待所有对象析构。此外,print_count是静态函数,无论通过类名还是对象调用,访问的都是同一个count,不会因调用方式改变。
反命题思维:若把print_count移到main末尾,输出会变为1 2 3 3;若去掉static,count变成实例成员,输出全为0。刷到类似题先问:静态成员是否共享?析构何时触发?对象何时离开作用域?