问题 单项选择题

有如下程序: #include <iostream> using namespace std; class Obj {static int i; public:Obj( ){i++;}~Obj(){i--;}static int getVal( ){ return i;} }; int Obj::i=0; void f() {Obj ob2; cout<<ob2.getVal( ); } int main( ){Obj ob1;f();Obj *ob3=ew Obj; cout<<ob3->getVal( );delete ob3; cout<<Obj::getVal( );return 0; } 程序的输出结果是

A.232

B.231

C.222

D.221

答案

参考答案:D

解析: 本题主要考查的是静态成员。静态成员的特性是不管这个类创建了多少个对象,它的静态成员都只有一个拷贝(副本),这个副本被所有属于这个类的对象共享。本例中,Obj类定义了一个静态数据成员i,并初始化为0。在主函数中,首先定义了1个该类对象ob1,所以构造函数被执行1次,i被加1。然后调用函数f(),该函数中又定义了一个对象ob2,此时i再次加1变成2,然后通过静态成员函数getVal()输出i的值2。f()函数结束了,局部变量ob2被释放,故析构函数被调用了1次,i变成1。回到主函数中,又动态创建了1个对象并让指针ob3指向它,所以i变成2,接着输出的值为2。最后,释放动态创建的那个对象,i变为1,所以最后输出的值为1。因此,程序最终输出结果为221,应该选择D。

名词解释
单项选择题