构造函数与析构函数

       学习编程已快三年,前段时间一直好高鹜远,老想着做一些很牛B的东西。经过两三个项目后,老觉得很飘,没有一种脚踏实地的感觉。现在只想好好地补补基础知识,一切从今天开始。学习的东西记录到这里,方便以后重温。

      类的构造与析构应该是最基础的东西了,可是现在对一些概念还不是很清晰,写了几段代码,证明一下。

      首选定义一个类CParent(以后学习继承还有这个类,所以类名定义成这样),定义如下:

class CParent
{
public:
    CParent(void);
    ~CParent(void);
};
 
很简单的一个类,只有一个构造函数与一个析构函数,两个函数的实现如下:
CParent::CParent(void)
{
    cout<<"run constructor of CParent"<<endl;
}

CParent::~CParent(void)
{
    cout<<"run destructor  of CParent"<<endl;
}

 

建立一个控制台win32程序,实现main函数如下:

#include<iostream>
using namespace std;
#include"Parent.h"

int main()
{
    cout<<"Begin of main function"<<endl;
    cout<<"End of main function"<<endl;
    return 0;
}
 
在不同地方实例化CParent类,看下构造函数与析构函数何时执行。
 
首先在main函数中建立CParent类
int main()
{
    cout<<"Begin of main function"<<endl;
    CParent Object;
    cout<<"End of main function"<<endl;
    return 0;
}

程序运行结果如下:

Begin of main function
run constructor of CParent
End of main function
run destructor  of CParent
可以看出,构造函数在main内部创建对象时执行,析构函数要等到main函数结束自动执行。
 
下面看看在其它函数内部创建CParent对象时,又是什么情况
新添一个函数FuncA(),同时修改main函数,代码如下。
void FuncA()
{
    cout<<"Begin of FuncA"<<endl;
    CParent Object;
    cout<<"End of FuncA"<<endl;
}

int main()
{
    cout<<"Begin of main function"<<endl;
    FuncA();
    cout<<"End of main function"<<endl;
    return 0;
}

程序运行结果如下:

Begin of main function
Begin of FuncA
run constructor of CParent
End of FuncA
run destructor  of CParent
End of main function

构造函数创建对象时执行,析构函数在FuncA结束后,返回main函数之前执行。

如果是定义一个全局变量的对象呢?代码如下:

CParent object;

int main()
{
    cout<<"Begin of main function"<<endl;
    cout<<"End of main function"<<endl;
    return 0;
}

运行结果:

run constructor of CParent
Begin of main function
End of main function
run destructor  of CParent

如果是用new呢?

int main()
{
    cout<<"Begin of main function"<<endl;
    CParent *p=new CParent();
    cout<<"End of main function"<<endl;
    return 0;
}

运行结果:

Begin of main function
run constructor of CParent
End of main function
可以看出,定义全局变量,及使用new 关键字创建对象,虽然对象都是存储在堆上,但创建全局变量的方法最后程序会把对象销废,而使用new关键字却不会。
posted @ 2008-03-25 19:42  Zimmem  阅读(225)  评论(0编辑  收藏  举报