对象的构造和析构过程不太清晰,特意做个笔记。
定义Value类:
class Value
{
public:
Value(int nVal){
m_nVal = nVal;
printf("Call Value ::Value(int nValue)\n");
}
~Value(){
printf("Call value ::~Value()\n");
}
Value& operator = (int nVal)
{
m_nVal = nVal;
printf("Call value ::operator=\n");
return *this;
}
void Dump(){printf("Value::m_nVal=%d\n",m_nVal);}
protected:
int m_nVal;
};
定义一个Base类:
class Base
{
public:
Base(){Init();}
virtual ~Base(){Release();}
virtual void Init(){printf("Call Base::Init()\n");}
virtual void Release(){printf("Call Base::RELEASE()\n");}
virtual void Dump(){printf("Call Base::Dump()\n");}
private:
};
//派生出一个Derive类
class Derive:public Base
{
public:
Derive(){printf("Call Derive ::Derive()\n");}
~Derive(){printf("Call Derive::~Derive()\n");}
virtual void Init(){m_Val = 2;printf("Call Derive::Init()\n");}
virtual void Release(){printf("Call Derive::Release()\n");}
virtual void Dump(){m_Val.Dump();}
protected:
static Value m_Val; //声明一个静态成员变量
private:
};
//静态成员变量的定义
Value Derive::m_Val = 0;
void DestroyObj(Base* pOb)
{
pOb->Dump();
delete pOb;
}
int main()
{
Derive *pOb = new Derive;
DestroyObj(pOb);
return 0;
}
程序运行结果:
结果分析: 派生类的对象在调用自身的构造函数前,要先执行基类的默认构造函数,然后才返回来执行该派生类的构造函数。
对象析构时:先执行该派生类的析构函数,然后再执行基类的析构函数。
构造和析构步骤可以表示为:
1. 基类构造函数
2.自身构造函数
3.自身析构函数
4. 基类析构函数