C++中基类,派生类 类成员对象的构造函数,析构函数的顺序

昨天笔试遇见了这个选择题,竟然被难住了,看来自己的基本功还不够扎实.回来编程开始实现摸索.

#include <iostream>
using namespace std;
class BaseClass
{
    public:
         BaseClass()
         {
 
           cout<<"Base Class is  constructed"<<endl;
         }

      ~BaseClass()
         {    
   
           cout<<"Base Class is destructed"<<endl;
         }

};
class InObject
{
        public:

         InObject()
          { 
              cout<<"object data number is  constructed."<<endl;
           }

         ~InObject()
         { 
              cout<<"object data number is destructed."<<endl;
          }

};

class DerivedClass:public BaseClass
{
        public:
   
         InObject m_Derived;
         DerivedClass()
         {
 
              cout<<"Derived Class is constructed"<<endl;
  
           
           }
         ~DerivedClass()
            { 
                  cout<<"Derived Class is destructed"<<endl;
             }

};

int main()
{
          DerivedClass  d;
         return 0;

}

运行结果:

Base Class is constructed

object data number is constructed

Derived Class is constructed

Derived Class is destructed

object data number is destructed.

Base Class is destructed.

答案已经很明显了.这是无参数的,可假如有参数呢?

  1. #include <iostream>
  2. using namespace std;
  3. class BaseClass
  4. {
  5. public:
  6.     BaseClass(int a)
  7.     {
  8.        
    1. cout<<"Base Class with parameter is constructed"<<endl; 
    2. m_base=a;
    3.         
        }
  9.     BaseClass()
  10.     {
  11.      cout<<"Base Class is constructed"<<endl;
  12.     }
  13.      ~BaseClass()
  14.     {
  15.       
  16.       cout<<"Base Class  is destructed"<<endl;
  17.     }
  18. protected:
  19.     int m_base;
  20. };
  21. class InObject
  22. {
  23. public:
  24.     float m_inobject;
  25.     InObject(float f)
  26.     {
  27.      
    1. cout<<"object data number with parameter  is constructed."<<endl;   
    2. m_inobject=f;
    3.         
        }
  28.     InObject()
  29.     {   
  30.         cout<<"object data number is constructed."<<endl;
  31.     }
  32.     ~InObject()
  33.     {   
  34.         cout<<"object data number is destructed."<<endl;
  35.     }
  36. };
  37. class DerivedClass:public BaseClass
  38. {
  39. public:
  40.     char m_Derived;
  41.     InObject m_DerivedObject;
  42.     DerivedClass(int nvalue,float fvalue,char cvalue):
  43.       BaseClass(nvalue),m_DerivedObject(fvalue),m_Derived(cvalue)
  44.       {
  45.           cout<<"Derived Class with parameter is constructed"<<endl;
  46.       }
  47.     DerivedClass()
  48.     {
  49.     
  50.         cout<<"Derived Class is constructed"<<endl;
  51.         
  52.        
  53.     }
  54.     ~DerivedClass()
  55.     {   
  56.         cout<<"Derived Class is destructed"<<endl;
  57.     }
  58. };
  59. int main()
  60. {
  61.     //DerivedClass  d;
  62.     DerivedClass d(3,8.0,'A');
  63.     return 0;
  64. }

答案为:

Base Class with parameter  is constructed

object data number  with parameter is constructed

Derived Class with parameter is constructed

Derived Class with parameter is destructed

object data number with parameter  is destructed.

Base Class with parameter  is destructed.

或许有人说,是派生类的初始化列表的顺序问题,好,我任意改变了顺序,结果不变.

如果我不用初始化列表,而在括号里直接赋值有什么结果呢?

    1. DerivedClass(int nvalue,float fvalue,char cvalue):
    2.        BaseClass(nvalue)
    3.       {
    4.         cout<<"Derived Class with parameter is constructed"<<endl;
    5.         m_Derived=cvalue;
    6.         m_DerivedObject=fvalue;
    7.        }
    注意这次结果:

Base Class with parameter  is constructed

object data number is constructed.//在进入括号之前调用.

Derived Class with parameter is constructed

object data number with parameter is constructed.//在  m_DerivedObject=fvalue被调用.

object data number is destructed.//在m_DerivedObject =fvalue 语句执行完被调用.

//即使我在m_DerivedObject ;加入 int abc; abc=3;abc=5;语句.调用处不变.

Derived Class with parameter is destructed

object data number with parameter  is destructed.

Base Class with parameter  is destructed.

可见要多一次无参数的构造函数调用.在类成员对象中,用初始化列表能提高程序效率.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值