有如下程序:#include<iostream>using namespace std;class A{public:  static int a;  void init(){a=1;}  A(int a=2){init();a++;}};int A::a

admin2013-05-30  25

问题 有如下程序:#include<iostream>using namespace std;class A{public:  static int a;  void init(){a=1;}  A(int a=2){init();a++;}};int A::a=0;A obj;int main(){  cout<<obj.a;  return 0;}运行时输出的结果是

选项 A、0
B、1
C、2
D、3

答案B

解析 本题是一道陷阱题,看似考查类的静态成员变量,实际考查的是:变量作用域的屏蔽效应。在C++中,当标识符的作用域发生重叠时,在一个函数(或块)中声明的标识符可以屏蔽函数(或块)外声明的标识符或全局标识符。本题从行"class A{"到行“int A::a=0;”都是类A的声明部分。行“A obj;”声明了一个类A的全局对象 obj,由于没指定构造参数,所以构造时构造函数的形参a取默认值2。构造函数中首先调用了init函数,将静态成员变量a赋为1,然后将a增1。许多考生此时会很自然地认为是将类A的静态成员变量a增1了,从而导致选择C这个错误答案。其实,此时静态成员变量a被构造函数的形参a所屏蔽,所以a++改变的是形参a的值,对静态成员变量a没有影响,其值还是被init函数所改成的值1。故本题应该选择B。
转载请注明原文地址:https://kaotiyun.com/show/jUNp777K
0

最新回复(0)