(4)C++析构函数、两种申请释放空间的不同


二、析构函数


与构造函数对比:
构造函数是对象在创建时自动调用一个函数
析构函数是对象在释放时(对象生命周期结束时)自动调用一个函数
可用断点查看

1.作用:
清理工作:比如我们在堆区(用new)申请了一段空间,析构函数可以释放掉;调用时间决定了它主要的作用
2.形式:
~类名(){} 如下:

	~Cstu(void)  //析构函数写法  无参可加void 
	{

	}

3.注意:
a.不像构造函数可以重载多个,析构函数只有一个;
b.析构函数无参
c.系统有默认的析构函数,啥都不做:类比构造
4.局部对象
充分证明在函数结束时再调用

class Cstu
{
public:
	int a;
	Cstu()
	{
		cout << "构造函数" << endl;
	}
	~Cstu(void)  //析构函数写法
	{
		cout << "析构函数" << endl;
	}

};
int main()
{
	{
		Cstu st;  //执行前先执行构造函数,执行后即将消失时再执行析构函数
	}
	system("pause");
	return 0;
}

若在主函数中,则析构函数在主函数结束时再调用,因为此时对象的作用域是主函数全部,此时打印就不会打印析构里的东西,因为system("pause");阻碍了,只会在return 0 ; (结束函数的作用)后再打印

//主函数续上
int main()
{
	Cstu st;
	system("pause");
	return 0;
}

5.指针对象
由于需要申请一个堆区的空间来接指针,所以它不会主动自动释放
即在delete空间时才会释放空间,此时才会调用析构函数

//全局变量续上
//主函数指针调用	
	Cstu*stu = new Cstu;
	delete stu;

只要不释放遇花括号也不会执行

	{
		Cstu*stu = new Cstu;
	}

6.临时对象
写在前面:

临时变量:

	int c = int(12);

解读:
a.创建一个临时变量 int(12); 将临时变量赋值给c;
b.类型+(值); 这样的就是临时对象(类+(值)),或者叫临时变量(int等+(值));
c.执行过程:先构造出临时对象,假如名为q,把12初始化给q,再用q给c进行赋值

临时对象:

(1).创建:Cstu(); //有参传参,无参不传

class Cstu
{
public:
	Cstu(int i)
	{
		cout << "构造函数" << endl;
	}
	~Cstu()
	{
		cout << "析构函数" << endl;
	}

};
int main()
{
	Cstu(12);   //这就是临时对象的创建
	//代码一结束,临时对象就释放掉  作用域只在此一行
	system("pause");
	return 0; 
}

(2).作用域
当前所在行的语句
(3).注意
a.Cstu(12); 绝对不是一个值,这条语句产生的是一个对象,假如产生的是临时对象we,则是利用we调用类,不同的是此语句作用域仅是所在语句。
b.一般来说,都是在构造函数申请空间,在析构函数释放空间,如:

class Cstu
{
public:
	int*p;
	Cstu(int i)
	{
		p = new int(10);
	}
	~Cstu()
	{
		delete p;
	}

};

两种申请释放空间的区别


申请:

class Cstu
{
public:
	int*p;
	Cstu()
	{
		p = new int(10);
		cout << "构造函数" << endl;
	}
	~Cstu()
	{
		delete p;
		cout << "析构函数" << endl;
	}
};
//主函数调用
Cstu*stu = (Cstu*)malloc(sizeof(stu));	//类的指针

运行后会发现:malloc是无法进到构造函数内的

释放:
free(stu);
运行后会发现,直接结束,并不会触发析构函数
总结:
malloc不会触发构造函数,new会
free不会触发析构函数,delete会

你可能感兴趣的:(C++基础学习,c++,类,堆栈)