- 析构函数(不能重载,没有参数,一个类只能有一个析构函数。如果没定义,编译器会自动生成一个)
析构函数:创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作。
析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个“~”符号。 如下函数:
#include <iostream>
using namespace std;
class Func{
public:
Func(int len); //构造函数
~Func(); //析构函数
public:
void input(); //从控制台输入数组元素
void show(); //显示数组元素
private:
int *ptr(int i); //获取第i个元素的指针
private:
const int m_len; //数组长度
int *m_arr; //数组指针
int *m_p; //指向数组第i个元素的指针
};
Func::Func(int len): m_len(len){
if(len > 0)
{
m_arr = new int[len]; /*分配内存*/
}
else
{
m_arr = NULL;
}
}
Func::~Func()
{
delete[] m_arr; //释放内存
}
void Func::input()
{
for(int i=0; m_p=ptr(i); i++)
cin>>*ptr(i);
}
void Func::show()
{
for(int i=0; m_p=ptr(i); i++)
{
if(i == m_len - 1)
{
cout<<*ptr(i)<<endl;
}
else
{
cout<<*ptr(i)<<", ";
}
}
}
int * Func::ptr(int i)
{
if(!m_arr || i<0 || i>=m_len)
{
return NULL;
}
else
{
return m_arr + i;
}
}
int main(){
//创建一个有n个元素的数组(对象)
int n;
cout<<"Input array length: ";
cin>>n;
Func *parr = new Func(n);
//输入数组元素
cout<<"Input "<<n<<" numbers: ";
parr -> input();
//输出数组元素
cout<<"Elements: ";
parr -> show();
//删除数组(对象)
delete parr;
return 0;
}
在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对象的析构函数。
在函数内部创建的对象是局部对象,它和局部变量类似,位于栈区,函数执行结束时会调用这些对象的析构函数。
new 创建的对象位于堆区,通过 delete 删除时才会调用析构函数;如果没有 delete,析构函数就不会被执行。(下面的例子)
#include <iostream>
#include <string>
using namespace std;
class Demo{
public:
Demo(string s);
~Demo();
private:
string m_s;
};
Demo::Demo(string s): m_s(s){ }
Demo::~Demo(){ cout<<m_s<<endl; }
void func(){
//局部对象
Demo obj1("1");
}
//全局对象
Demo obj2("2");
int main(){
//局部对象
Demo obj3("3");
//new创建的对象
Demo *pobj4 = new Demo("4");
func();
/*位置1*/
//delete(pobj4);//有delete 才会调用 pobj4
cout<<"main"<<endl;
/*位置2*/
delete(pobj4);//位置不同调用的时机也不同
return 0;
}
运行结果分析: