析构函数是成员函数吗(c++析构函数的作用和语法是什么)

本文目录
c++析构函数的作用和语法是什么
析构函数(destructor)是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”符号。
在C++中“~”是位取反运算符,从这点也可以想到:
析构函数是与构造函数作用相反的函数。
当对象的生命期结束时,会自动执行析构函数。
具体地说如果出现以下几种情况,程序就会执行析构函数:
①如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
②static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
③如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象的析构函数。
④如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。
程序设计者事先设计好析构函数,以完成所需的功能,只要对象的生命期结束,程序就自动执行析构函数来完成这些工作。
析构函数不返回任何值,没有函数类型,也没有函数参数。
因此它不能被重载。
一个类可以有多个构造函数,但只能有一个析构函数。
实际上,析构函数的作用并不仅限于释放资源方面,它还可以被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”,例如输出有关的信息。
C++析构函数的作用
析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会。比如:
class A
{
A(){m_a=new int;}
~A(){delete m_a;}
int * m_a;
}
这种情况,你就可以清楚的看到,析构函数提供了一个释放m_a所占用的内存的机会——当然释放的动作还需要你使用delete来做到。这就是所谓的【在撤销对象占有的内存之前完成一些清理工作】的情形之一;还有就是再复杂一点的情况,请看下面例子:
class B
{
B(){}
~B(){}
A a;
}
这个情况下,构造函数B()会自动调用A()函数来做A.m_a的初始化工作;而析构函数~B()会自动调用A的析构函数~A()做清除内存的动作。
还有其他更复杂的情况,但原理都是提供了一个清理内存的机会。删除对象是编译器所做的工作,如你写一段如下代码:
int main()
{
int k = 10;
int d = 100;
int s = k+d;
return s;
}
像k,d,s这几个变量,都是函数内的局部变量,只存在于main()函数的生命周期里面,出了main函数就不存在了——注意,是不存在,不是不可见!因为在退出函数之前要做删除这些局部变量的动作。
那么,这里是没有析构函数的,但对象是在main函数结构的时候删除的,也就是删除对象。这里没有动态内存。删除k,d,s对象的动作是和有析构函数的情况是一样的;只是有了析构函数,就会在这个删除对象动作之前做一些其他的清除内存的工作(像我上面举的两个析构函数例子);请看:
int main()
{
A a;
B b;
}
这种情况,同样在main退出的时候,也是会和上面的k, d, s一样删除b对象的,没什么区别。但是B是一个类,就会在删除b对象之前调用B的析构函数~B()!
OK?删除对象,是在析构函数之后进行的,这个变量出生命周期的时候就会先后调用~A(); ~B(); 然后再会删除这两个对象。
至于你问我怎么删除的?我是知道的,但你目前的知识可能还不能理解。那是通过栈的局部变量方式来删除对象的。如果你学习了汇编与反汇编,就会明白。
谭浩强的书讲的不完全清楚,但也不能说错。
欢迎采纳!谢谢!
C++析构函数的作用是什么
C++析构函数的作用是用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。
析构函数与构造函数的作用正好相反,如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭。析构函数允许类自动完成类似清理工作,不必调用其他成员函数。析构函数也是特殊的类成员函数。
析构函数简介:
析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud(
),以区别于
构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能
重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。
析构函数怎么用,在c++中的
析构函数,就是善后处理,该对象的生命周期结束了,它负责善后的一些工作,如释放已分配的内存等。你将该对象delete掉时,析构函数就自动执行了,不用你去调用它的。
简单的举个例子:
假如有
class
test
{
void
test()
{
.......new
a....
}
~test(){
delete
a;
a
=
null;
printf(“析构函数执行了“);
}
}
那么在mian
函数中,你new
了一个
test
对象后,再将它delete
掉,这时析构函数~test();就自动执行了,释放
a
的内存,并打印出“析构函数执行了“。
与一般成员函数比较,构造函数和析构函数有哪些特
1、虚析构函数和析构函数在功能上是一回事,因此除了动态联编(此处意思:需要销毁 父类指针指向的子类对象的空间)外,其他性质和析构函数类似。
2、析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
3、析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;当撤消对象时,编译系统会自动地调用析构函数。
下列有关析构函数的描述中,正确的是
在对象释放时,自动调用析构函数。选D。
析构函数(destructor)是成员函数的一种,它的名字与类名相同,但前面要加~,没有参数和返回值。
一个类有且仅有一个析构函数。如果定义类时没写析构函数,则编译器生成默认析构函数。如果定义了析构函数,则编译器不生成默认析构函数。
析构函数在对象消亡时即自动被调用。可以定义析构函数在对象消亡前做善后工作。例如,对象如果在生存期间用 new 运算符动态分配了内存,则在各处写 delete 语句以确保程序的每条执行路径都能释放这片内存是比较麻烦的事情。
有了析构函数,只要在析构函数中调用 delete 语句,就能确保对象运行中用 new 运算符分配的空间在对象消亡时被释放。
扩展资料:
析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。
以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。
只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。

更多文章:
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00






