欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 类的析构函数的作用 C++析构函数的作用?
类的析构函数的作用 C++析构函数的作用?
2019-07-24 20:24:04 来源:朵拉利品网

1, C++析构函数的作用?



析构函数是提供一个在对象删除前可以释放这个对象所占有的资源的机会。比如:
class A
{
A(){m_a=new int[10];}
~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(); 然后再会删除这两个对象。
至于你问我怎么删除的?我是知道的,但你目前的知识可能还不能理解。那是通过栈的局部变量方式来删除对象的。如果你学习了汇编与反汇编,就会明白。
谭浩强的书讲的不完全清楚,但也不能说错。
欢迎采纳!谢谢!

3, 构造函数和析构函数的主要作用是什么?它们各有什么特性?



构造函数只是起初始化值的作用,但实例化一个对象的时候,可以通过实例去传递参数,从主函数传递到其他的函数里面,这样就使其他的函数里面有值了。规则,只要你一实例化对象,系统自动回调用一个构造函数,就是你不写,编译器也自动调用一次。

析构函数与构造函数的作用相反,用于撤销对象的一些特殊任务处理,可以是释放对象分配的内存空间;
特点:析构函数与构造函数同名,但该函数前面加~。
析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。
当撤销对象时,编译器也会自动调用析构函数。
每一个类必须有一个析构函数,用户可以自定义析构函数,也可以是编译器自动生成默认的析构函数。一般析构函数定义为类的公有成员。

4, 类的构造函数的作用是什么?类析构函数的形参是几个?静态数据成员...



比如class Point{ //这是一个类定义的界面//
int yeah,month,day;
public:
void set(int y,int m,int d);
void print();
};
//类的成员在外定义如下//
void Point::set(int y,int m,int d){
yeah=y;month=m;day=d;
}
void Point::print(){
cout
}
//在main函数里的实现//
int main(){
Point s;
s.set(12,34,56);
s.print();
}
程序结果为:12 34 56
构造函数是用来初始化某些对象的。如果不声明构造函数,程序将自动生成一个无参构造函数。如果声明了则不用之。
析构函数跟拷贝构造函数是成双成对的出现的。
只要使用了new申请了动态内存(堆)就必须使用析构函数来释放申请的内存。避免内存泄露。
形参有多少个要看你的程序要求。没有固定的。
静态数据是static int a; //例子//
在类界面外声明最好。

5, 析构函数的作用 什么是析构函数



析构函数的作用是当对象生命期结束后,收回对象占用的资源,析构函数的特点是:
1、析构函数名是在类名前加以符号“~”。
2、析构函数没有参数、返回类型和修饰符。
3、一个类中至多有一个析构函数,如果程序员没有定义析构函数,那么系统会自动地加入一个析构函数。
4、不能显式地调用析构函数,而是由系统自动调用。
定义析构函数格式为:~类名()
{...}
由于c#得到自动内存管理的支持,当对象生命期结束后,系统能够自动回收那些对象应该释放的资源等,所以一般不需要程序员的关心,对于一般的对象,程序中不需要定义析构函数。

相关概念


函数

函数的定义:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

构造函数

构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。