【C++】c++中的六个默认函数——析构函数

  • 析构函数(不能重载,没有参数,一个类只能有一个析构函数。如果没定义,编译器会自动生成一个)

析构函数:创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作。

析构函数(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;
}

运行结果分析:

猜你喜欢

转载自blog.csdn.net/weixin_41576955/article/details/84829189