有以下程序: #include <iostream> using namespace std; class CSample { private: int i; public: CSample (

admin2010-03-29  38

问题 有以下程序:    #include <iostream>    using namespace std;    class CSample    {    private:       int i;    public:       CSample ( );       CSample( int val );       void Display();       ~CSample ();    };    CSample:: CSample ()    {       cout << "C1";       i = 0;    }    CSample: :CSample( int val )    {       cout<< "C2";       i = val;    }    void CSample: :Display()    {       cout<<i<<": ";    }    CSample:: ~CSample ( )    {       cout << "D";    }    int main ( )    {       CSample a,  b( 10 );       return 0;    }    执行后的输出结果为(   )。

选项 A、ClC2DD
B、DDC1C2
C、C2C1DD
D、C1DC2D

答案1

解析 本题程序首先定义了类CSample,其内部成员为private类型数据成员int i和public类型成员函数,包括两个构造函数、一个析构函数和一个普通成员函数 void Display(),其成员函数的功能分别为:
   ①CSample::CSample():构造函数,输出构造函数的执行消息“C1”,并将数据成员i赋值为i=0:
   ②CSample::CSample(int val):重载构造函数,输出构造函数的执行消息“C2”,并将数据成员i赋值为i=val:
   ③void CSample::Display():成员函数,输出数据成员i的值;
   ④CSample::~CSample():析构函数,输出析构函数的执行消息,并输出数据成员值。在主函数中,程序分别采用两个构造函数,创建了类CSample的两个对象,一个利用不带参数的构造函数创建对象a,另一个利用带参数的构造函数创建对象b。根据上面的分析,可以得到a和b中数据成员i的值分别为0(不带参数情况)和10(所带参数值)。因此下面的两条输出语句分别输出“0”和“10”。
   此外,由于系统在创建对象时会调用构造函数,在对象生命期结束时会调用析构函数,因此程序还会有相应的输出。由于构造函数的调用顺序与对象创建的先后顺序一致,因此程序应该首先输出两个构造函数的调用信息,即“C1”和“C2”。在主函数执行结束后,由于两个对象a和b的生命期已经结束,因此系统将调用析构函数收回系统资源。由于析构函数的调用顺序与构造函数完全相反,因此系统将首先调用对象b的析构函数,程序输出析构函数执行信息“D”;之后调用对象a的析构函数,程序输出析构函数执行信息“D”。
转载请注明原文地址:https://kaotiyun.com/show/J6jp777K
0

最新回复(0)