有如下程序: #include<iostream> usingnamespacestd; classA { public: A(){cout<<"A";} ~A(){cout<<"~A";} }; classB { A*P: public: B(){cout<<"B";p=newA;} ~B(){cout<<"~B";deleteP;} }; intmain() { Bobi; return0; } 执行这个程序的输出结果是( )。A.BAA~A~B~AB.ABA~B~A~AC.BAA~B~A~AD.AB

题目

有如下程序: #include<iostream> usingnamespacestd; classA { public: A(){cout<<"A";} ~A(){cout<<"~A";} }; classB { A*P: public: B(){cout<<"B";p=newA;} ~B(){cout<<"~B";deleteP;} }; intmain() { Bobi; return0; } 执行这个程序的输出结果是( )。

A.BAA~A~B~A

B.ABA~B~A~A

C.BAA~B~A~A

D.ABA~A~B~A


相似考题
参考答案和解析
正确答案:B
B。【解析】本题考查的是类的构造函数和析构函数。派生类构造函数的执行顺序:首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容。因此本题中,首先调用基类构造函数输出A,然后调用子对象的构造函数输出B,P=newA再调用类A的构造函数输出A。析构函数的调用顺序和构造函数的调用顺序相反。
更多“有如下程序: #include&lt;iostream&gt; usingnamespacestd; classA { public: A(){cout&lt;&l ”相关问题
  • 第1题:

    请将如下程序补充完整,使得输出结果为:bbaa include using namespace std; class A {

    请将如下程序补充完整,使得输出结果为:bbaa

    include <iostream>

    using namespace std;

    class A {

    public:

    【 】{cout << "aa"; }

    };

    class B: public A{

    public:

    ~B(){ cout << "bb"; }

    };

    int main () {

    B *p= new B;

    delete p;

    return 0;

    }


    正确答案:~A()
    ~A() 解析:本题考查的知识点是:类的构造与析构。本题要求的输出结果中包含aa,所以基类A中填空位置处的函数一定要被执行。但主函数中仅仅创建了一个B类对象,然后释放了它,并没有调用什么函数。所以可以肯定填空处一定是要定义基类的构造或者析构函数。如果定义的是构造,那么盼肯定在new操作的时候就会被输出,而下面的bb是在析构函数中,会在delete时被输出。故可肯定应填入基类A的析构函数定义:~A()。

  • 第2题:

    有如下程序:includeusing namespace std;class A{public:A(){cout<<"A";}};class B{p

    有如下程序: #include<iostream> using namespace std; class A { public: A(){cout<<"A";} }; class B{public:B(){cout<<"B";} }; class C:public A { B b; public:C(){cout<<"C";} }; int main() { C obj; return 0; } 执行后的输出结果是( )。

    A.CBA

    B. BAC

    C.ACB

    D.ABC


    正确答案:D

  • 第3题:

    有如下程序:includeusing namespace std;class A{public: A(){cout<<"A";}};classB{p

    有如下程序: #include<iostream> using namespace std; class A{ public: A(){cout<<"A";} }; classB{public:B().{cout<<"B";}} classC:public A{ B b; public: C(){cout<<"C";} }; int main (){ C obj; return 0;} 执行后的输出结果是

    A.CBA

    B.BAC

    C.ACB

    D.ABC


    正确答案:D
    解析:本题考核类的继承与派生。派生类构造函数执行的一般次序如下:首先调用基类构造函数,调用顺序按照它们被继承时说明的顺序。然后调用子对象的构造函数,调用顺序按照它们在类中的说明顺序。最后是派生类构造函数中的内容。题中,类A是基类,类C是基类A的派生类,类B的对象b是类C的私有成员。所以最后的输出为ABC。

  • 第4题:

    如下程序的输出结果是includeusing namespace std;class A{public:A( ){cout<<"A";}}

    如下程序的输出结果是 #include<iostream> using namespace std; class A{ public: A( ){cout<<"A";} }; class B{public:B( ){cout<<"B";}}; class C:public A{ B b; public: C( ){cout<<"C";} }; int main( ){C obj;return 0;}

    A.CBA

    B.BAC

    C.ACB

    D.ABC


    正确答案:D
    解析:派生类的构造函数的执行顺序是,先调用基类的构造函数,然后调用派生类的构造函数。当类中的数据成员为对象时,先调用对象成员的构造函数。

  • 第5题:

    有如下程序:include using namespace std;class A {public: A() {cout<<"A";}};class

    有如下程序: #include <iostream> using namespace std; class A { public: A() {cout<<"A";} }; class B {public:B() {cout<<"B";}}; class C: public A { Bb; public: C() {cout<<"C";} }; int main() {C obj;return 0;}执行后的输出结果是 ______。

    A.CBA

    B.BAC

    C.ACB

    D.ABC


    正确答案:D
    解析:在构造派生类对象时,基类的构造函数要优于派生类的构造函数先执行,所以D为正确答案。

  • 第6题:

    有如下程序:includeusing namespace std;class A {public:A(){cout<<"A";}};classB{p

    有如下程序: #include<iostream> using namespace std; class A { public: A(){cout<<"A";} }; classB{public:B(){cout<<"B";}} classC:public A{ B b; public: C(){cout<<"C";} }; int main(){ C obj; return 0;} 执行后的输出结果是( )。

    A.CBA

    B.BAC

    C.ACB

    D.ABC


    正确答案:D
    解析:此题考查的是类的继承和派生。系统首先要通过派生类的构造函数调用基类的构造函数,对基类成员初始化:然后对派生类中的新增成员初始化。