一.对象的构造顺序
**A.对于局部对象 **--当程序执行流到达对象的定义语句时进行构造 程序示例
#include<iostream>
using namespace std;
class Test
{
private:
int mi;
public:
Test(int i)
{
mi=i;
cout<<"Test(int i)="<<mi<<endl;
}
Test(const Test& obj)
{
mi=obj.mi;
cout<<"Test(const Test& obj)"<<mi<<endl;
}
};
int main()
{
int i=0;
Test a=i;
while(i<3)
{
Test a1=++i;
}
if(i<4)
{
Test a2=a;
}
else
{
Test a(100);
}
return 0;
}
运行结果如图所示 由运行结果可以看出,程序是按照程序流来实现的Test a=i首先被构造,输出Test(int i)=0,Test a1=++i输出Test(int i)=1,Test(int i)=2,Test(int i)=3;Test a2=a输出Test(const Test& obj)=0; B.对于堆对象 1.当程序执行流到达new语句时创建对象 2.使用new创建对象将自动触发构造函数的调用 代码示例
#include<iostream>
using namespace std;
class Test
{
private:
int mi;
public:
Test(int i)
{
mi=i;
cout<<"Test(int i)="<<mi<<endl;
}
Test(const Test& obj)
{
mi=obj.mi;
cout<<"Test(const Test& obj)="<<mi<<endl;
}
};
int main()
{
int i=0;
Test *a1=new Test(i);
while(++i<10)
if(i%2)
new Test(i);
if(i<4)
new Test(*a1);
else
new Test(100);
return 0;
}
运行结果如图所示 C.对于全局对象 1.对象的构造顺序是不确定的 2.不同的编码器使用不同的规则确定构造顺序
二.对象的销毁
1.一般而言,需要要销毁的对象都应该做清理 2.解决方案 a.为每个类提供一个public的free函数 b.对象不在需要时立即调用free函数进行清理 存在的问题 1.free函数只是一个普通的函数,必须显示的调用 2.对象销毁前没有做清理,很可能造成资源泄漏
析构函数 C++的类中可以定义一个特殊的清理函数 1.这个特殊的清理函数叫做析构函数 2.析构函数的功能与构造函数相反 定义:~ClassName() 1.析构函数没有参数也没有返回值类型声明 2.析构函数在对象销毁时自动被调用 代码示例
#include <iostream>
using namespace std;
class Test
{
int mi;
public:
Test(int i)
{
mi = i;
cout<<"Test()"<<endl;
}
~Test()
{
cout<<"~Test()"<<endl;;
}
};
int main()
{
Test t(1);
Test* pt = new Test(2);
delete pt;//使用new时 需要用delete进行删除
return 0;
}
运行结果 运行结果如图所示,使用~ClassName之后对构造函数进行了析构,并销毁
小结 1.局部对象的构造顺序依赖于程序的执行流 2.堆对象的构造顺序依赖于new的使用顺序 3.全局对象的构造顺序是不确定的 4.析构函数时对象销毁时进行清理的特殊函数 5.析构函数在对象销毁时自动被调用 6.析构函数是对象释放系统资源的保障