有如下程序 #include using namespace std; class AA{ char c; public: AA(char ch):c(ch){ cout

admin2021-05-06  20

问题 有如下程序
     #include
     using namespace std;
     class AA{
         char c;
     public:
         AA(char ch):c(ch){ cout<         ~AA(){ cout<<"a"; }
     };
     class BB{
         AA m1;
           AA m2;
     public:
         BB(): m2(’p’),m1(’q’){ cout<<"B"; }
         ~BB(){ cout<<"b"; }
     };
     int main(){
         BB bb;
         return 0;
     }
运行这个程序的输出是

选项 A、pgBaab
B、pgBbaa
C、qpBaab
D、qpBbaa

答案D

解析 构造函数初始化列表仅指定用于初始化成员的值,不指定这些初始化执行的次序,成员初始化的次序是类定义中声明成员的次序,成员初始化完成后执行构造函数的函数体;所以程序中在创建BB对象时,首先初始化m1,再初始化m2,由于m1、m2都是AA对象,且有实参q、p,所以调用构造函数AA(charch),用ch初始化成员c后输出成员c的值,即输出’q’、’p’,再执行类BB的函数体,输出’B’;程序执行结束时,系统会自动调用类的析构函数清理自己的成员,析构函数工作过程:
1、执行析构函数的函数体;
2、如果该类中拥有类对象成员,且类对象有析构函数,则以类对象成员声明次序的相反顺序调用其析构函数,销毁类对象成员;
3、按原来构造顺序的相反顺序向上依次调用基类的析构函数。
所以程序运行结束时,首先调用BB的析构函数并执行函数体,输出"b";然后调用m2的析构函数,销毁m2成员,输出’a’,再调用m1的析构函数,销毁m1成员,输出’a’;综上所述,程序运行的输出是:"qpBbaa";答案为D。
转载请注明原文地址:https://kaotiyun.com/show/QPfp777K
0

最新回复(0)