近期关于析构的讨论热度持续攀升 ,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理 。若这些内容恰好能为您提供参考,将是我们最大的荣幸。
1,在销毁对象的时候,执行它。
析构函数是“反向 ”的构造函数。它们在对象被撤消(回收)时调用 。析构函数的名
称除了最前面的“~”符号外 ,与类的名称相同。例如,类String的析构函数是~string()。
析构函数通常用于当一个对象不再需要时,完成“消除”功能 。
在函数中建立对象之后 ,这个对象作为局部对象开始生存,直到函数运行到遇见右括号“}”才结束生存,此时调用析构函数。
对象的释放发生在以下几种情况 ,首发自学编程网:
·使用运算符new分配的对象被delete删除。
·一个具有块作用域的本地(自动)对象超出其作用域 。
·临时对象的生存期结束。
·程序结束运行。
·使用完全限定名显示调用对象的析构函数 。
有几条规则约束着析构函数的说明:
·不能接受参量。
· 不能说明有任何返回类型(包括void)。
·不能用return语句返回值 。
· 不能说明为const、volatile或static,但析构函数可以因说明为const 、volatile或static的对象的析构而被调用。
·可以说明为虚拟的。使用虚析构函数,可以撤消对象而不必知道该对象的类型。由于使用虚拟函数机制 ,程序将调用该对象的正确的析构函数 。
c++ 什么叫析构函数? 他的输出与构造函数相反么?
摘要
构造函数与析构函数是一个类中看似较为简单的两类函数 但在实际运用过程中总会出现一些意想不到的运行错误 本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用 以及在使用过程中需要注意的若干事项
一.构造函数与析构函数的原理
作为比C更先进的语言 C#提供了更好的机制来增强程序的安全性 C#编译器具有严格的类型安全检查功能 它几乎能找出程序中所有的语法问题 这的确帮了程序员的大忙 但是程序通过了编译检查并不表示错误已经不存在了 在 错误 的大家庭里 语法错误 的地位只能算是冰山一角 级别高的错误通常隐藏得很深 不容易发现
根据经验 不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的 而初始化和清除工作很容易被人遗忘 微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决 把对象的初始化工作放在构造函数中 把清除工作放在析构函数中 当对象被创建时 构造函数被自动执行 当对象消亡时 析构函数被自动执行 这样就不用担心忘记对象的初始化和清除工作
二.构造函数在C#中的运用
构造函数的名字不能随便起 必须让编译器认得出才可以被自动执行 它的命名方法既简单又合理 让构造函数与类同名 除了名字外 构造函数的另一个特别之处是没有返回值类型 这与返回值类型为void的函数不同 如果它有返回值类型 那么编译器将不知所措 在你可以访问一个类的方法 属性或任何其它东西之前 第一条执行的语句是包含有相应类的构造函数 甚至你自己不写一个构造函数 也会有一个缺省构造函数提供给你
class TestClass{ public TestClass(): base() {} // 由CLR提供} 下面列举了几种类型的构造函数 )缺省构造函数class TestClass{ public TestClass(): base() {}}
上面已介绍 它由系统(CLR)提供
)实例构造函数
实例构造函数是实现对类中实例进行初始化的方法成员 如
lishixinzhi/Article/program/net/201311/14889c++中析构函数有什么作用?在什么情况下用?
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后 ” 的工作(例如在建立对象时用new开辟了一片内存空间 ,应在退出前在析构函数中用delete释放)。
析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数 。它不能带任何参数 ,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数 ,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数) ,它也不进行任何操作 。所以许多简单的类中没有用显式的析构函数。
包含构造函数和析构函数的C++程序。#include<string>
#include<iostream>
using?namespace?std;
class?stud?//声明一个类
{
private:?//?私有部分
int?num;
char?name[10];
char?sex?;
public:?//公用部分
stud(int?n,char?nam[],char?s?)?//构造函数
{
num?=?n;
strcpy?(name,?nam);
sex?=?s;
}
~stud(?)?//析构函数
{
cout?<<?"stud?has?been?destructe!"?<<?endl;//通过输出提示告诉我们析构函数确实被调用了
}
void?display(?)?//成员函数,输出对象的数据
{
cout<<"num:?"<<num<<endl;
cout<<"name:?"<<name<<endl;
cout<<"sex:?"<<sex<<endl;
}
};
int?main(?)
{
stud?stud1(10010,?"Wang-li",?'f'),?stud2(10011,?"Zhang-fun",?'m');?//建立两个对象
stud1.display(?);?//输出学生1的数据
stud2.display(?);?//输出学生2的数据
}//主函数结束的同时,对象stud1 ,stud2均应被“清理”,而清理就是通过调用了析构函数实现的 。
输出结果:
num:?10010
name:?Wang-li
sex:?f
num:?10011
name:?Zhang-fun
sex:?m
stud?has?been?destructe!
stud?has?been?destructe!
析构函数主要作用就是释放资源,避免内存泄漏。
1、析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕) ,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间 。
2、析构函数如果我们不写的话,C++?会帮我们自动的合成一个,就是说:C++?会自动的帮我们写一个析构函数。很多时候,自动生成的析构函数可以很好的工作 ,但是一些重要的事迹,就必须我们自己去写析构函数。?
3、按照?C++?的要求,只要有?new?就要有相应的?delete?。这个?new?是在构造函数里?new?的 ,就是出生的时候 。所以在死掉的时候,就是调用析构函数时,我们必须对指针进行?delete?操作。
关于析构的探讨就到这里 ,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!
评论列表(3条)
我是宝凯利的签约作者“admin”
本文概览:近期关于析构的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。1,在销毁对象的时候,执行它。析构函...
文章不错《析构》内容很有帮助