您的位置:首页 > 编程语言 > C语言/C++

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

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

#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.

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

#include <iostream>

using namespace std;

class BaseClass

{

public:

BaseClass(int a)

{

cout<<"Base Class with parameter is constructed"<<endl;

m_base=a;

}

BaseClass()

{

cout<<"Base Class is constructed"<<endl;

}

~BaseClass()

{

cout<<"Base Class is destructed"<<endl;

}

protected:

int m_base;

};

class InObject

{

public:

float m_inobject;

InObject(float f)

{

cout<<"object data number with parameter is constructed."<<endl;

m_inobject=f;

}

InObject()

{

cout<<"object data number is constructed."<<endl;

}

~InObject()

{

cout<<"object data number is destructed."<<endl;

}

};

class DerivedClass:public BaseClass

{

public:

char m_Derived;

InObject m_DerivedObject;

DerivedClass(int nvalue,float fvalue,char cvalue):

BaseClass(nvalue),m_DerivedObject(fvalue),m_Derived(cvalue)

{

cout<<"Derived Class with parameter is constructed"<<endl;

}

DerivedClass()

{

cout<<"Derived Class is constructed"<<endl;

}

~DerivedClass()

{

cout<<"Derived Class is destructed"<<endl;

}

};

int main()

{

//DerivedClass d;

DerivedClass d(3,8.0,'A');

return 0;

}

答案为:

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.

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

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

DerivedClass(int nvalue,float fvalue,char cvalue):

BaseClass(nvalue)

{

cout<<"Derived Class with parameter is constructed"<<endl;

m_Derived=cvalue;

m_DerivedObject=fvalue;

}
注意这次结果:

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.

可见要多一次无参数的构造函数调用.在类成员对象中,用初始化列表能提高程序效率.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐