学习编程已快三年,前段时间一直好高鹜远,老想着做一些很牛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关键字却不会。