GESP 六级 · GESP 202406 C++ 六级 第 2 题

选择题 · 答案 B · 考点:函数

← 整套速查表 GESP 六级 全部真题

题目

运行下列代码,屏幕上输出( )。

#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;
}
答案:B

考点

函数

解题思维

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。刷到类似题先问:静态成员是否共享?析构何时触发?对象何时离开作用域?

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断