有如下程序: #include class A { public: A(int n=2):m_i(n){} ~A(){std::cout

admin2019-05-22  25

问题 有如下程序:
    #include
    class A
    {
    public:
    A(int n=2):m_i(n){}
    ~A(){std::cout<    protected:
    int m_i;
    };
    class B:public A
    {
    public:
    B(int n):m_a2(n),m_al(m_i+1){}
    public:
    ~B()
    {
    std::cout<    --m_i;
    }
    private:
    A m_a1;
    A m_a2;
    };
    int main()
    {
    B b(5);
    return 0;
    }
    运行后的输出结果是(    )。

选项 A、2351
B、2531
C、5354
D、5534

答案B

解析 main()函数中调用了B的构造函数,参数为5,接下来B类对象b的构造过程如下:①调用基类A的默认构造函数,构造对象b的基类部分:初始化mj为2。②按照B类中成员的定义顺序,使用成员初始化列表初始化两个A类成员:首先执行m_a1(m_i+1),m_i为基类A中的成员,此时值为2,调用A类的默认构造函数,初始化m_a1.m_i为3;然后执行m_a2(n).调用A类的默认构造函数。初始化m_a2.m_i为5。
    接着main()执行return语句,此时对象b需要调用析构函数进行释放,释放过程如下:①首先运行B类的析构函数~B(),输出m_j的值为2,然后将m_i自减1,使得m_i的值为1。②按照B类中成员定义顺序的反顺序,首先调用m_a2的析构函数~A(),释放对象m_a2,输出m_a2.mj的值5;再调用m_a1的析构函数~A(),释放对象m_a1,输出m_a1.mj的值3。③最后调用基类A的析构函数~A(),释放b对象中的基类部分,输出m_i的值1。
    由上分析,程序运行结果为:2531。故本题答案为B选项。
转载请注明原文地址:https://kaotiyun.com/show/XB8p777K
0

最新回复(0)