C++中的析构函数和构造函数

原创 2013年12月02日 15:34:08
析构函数(destructor)是一个特殊的成员函数。
析构函数的定义:
~类名(){}
执行时期:当对象的生命周期结束时就会自动执行析构函数。具体情况如下:
1、如果在一个函数中定义了一个对象(局部对象),当这个函数被调用,且执行结束时,对象应该释放,也就是在释放对象前调用析构函数。
2、static局部对象在函数调用结束时并不释放对象,因此这是并不执行析构函数,在main函数执行结束或调用exit()函数结束程序时,这时调用局部对象的析构函数。
3、如果定义了一个全局对象,在程序执行结束或调用exit结束程序,则会调用析构函数。
4、使用new运算符动态创建对象,在使用delete释放对象时,调用期析构函数。
对析构函数的理解:析构函数的作用不是删除对象,是在对象的声明周期结束时释放该对象所占用的资源。他还可以用于完成程序员想要在该对象生命结束时完成任何程序员想要完成的动作。

析构函数和构造函数的比较:
1、调用的时间:(一般情况下)构造函数随着类的实例化,而被执行;但是析构函数在一个实例化的对象生命周期结束时被调用。
有一句话可以概括:”先构造的后析构,后构造的先析构“。
2、在一个程序中,构造函数可以有多个,但是析构函数只能有一个。


通过实例更好的理解:
#include
#include
using namespace std;
class Person
{
private:
string name;
public:
Person(string n)
{
name = n;
cout<<"Constructor called!"<<endl;
}
~Person()
{
cout<<"Destructor called!"<<endl;
}
void show()
{
cout<<"name"<<name<<endl;
}

};
class Student
{
private:
string name;
public:
Student(string n);
~Person()
{
cout<<"Destructor called!"<<endl;
}

void show()
{
cout<<"name"<<name<<endl;
}

};

Student::Stuednt(string n)
{
name = n;
cout<<"Constructor called!"<<endl;
}


int main()
{
Person p("zhangsan");
p.show();
Student s("lisi");
s.show();
return 0;
}
运行结果:
Constructor called! 
name:zhangsan 
Constructor called! 
name:lisi 
Destructor called! 
Destructor called!
 



版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中的#,##,和"

想要灵活应用宏,离不开#和##。 " 在学习#和##之前,先来看一个关于"的例子: #include #include int main() { const char* p1 = ...
  • mzlogin
  • mzlogin
  • 2014年11月09日 22:47
  • 7587

C++中的::的作用

(1)作用域限定符,当在类体中直接定义函数时,不需要在函数名字的前面加上类名,但是在类体外实现函数定义的时候,必须加上类名并且加上作用域限定符。Student::Display(); (2)...
  • zhanghuaichao
  • zhanghuaichao
  • 2017年02月18日 21:44
  • 2254

浅论C++的复杂性

C++语言已经有了20多年的历史。作为一门影响广泛的编程语言,它所受到的关注和争论恐怕是任何一门其他的语言所不能比拟的。十几年前,Java等新生语言的出现曾导致“C++信任危机”,但最终C++以自身非...
  • K346K346
  • K346K346
  • 2015年12月05日 11:56
  • 1738

c/c++中指针的理解(初学者)

关于指针,大家肯定不陌生,一些初学者,想必会出现思绪混乱的情况,现在我就来帮大家缕一缕吧。(第一次写微博 有点小紧张) 大家应该了解一些计算机对内存的管理方式吧。操作系统会将内存单元进行编号,这些...
  • Allen_ww
  • Allen_ww
  • 2016年01月11日 19:41
  • 8781

没事写点啥(一)——C++扫雷

整天编学校的作业实在枯燥,不如……写点别的?
  • destinyson
  • destinyson
  • 2016年02月29日 14:17
  • 1762

C++笔试题目大全(笔试宝典)(不断完善中)

1.new 、 delete 、 malloc 、 free 关系 delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数。 malloc 与 f...
  • Lina_ACM
  • Lina_ACM
  • 2016年06月07日 13:29
  • 21414

C/C++中“#”和“##”的作用和用法

C/C++中“#”和“##”的作用和用法!
  • fengbingchun
  • fengbingchun
  • 2015年03月08日 16:15
  • 3385

C++ 进程间的通讯(一):简单的有名管道实现

进程间的通讯(一):简单的有名管道实现 一 管道简介 命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程...
  • u010797208
  • u010797208
  • 2014年11月28日 02:09
  • 6575

OpenCV中Mat的C++用法介绍

Mat       OpenCV 自 2001 年出现以来。在那些日子里库是围绕C接口构建的。在那些日子里,他们使用名为IplImage C 的结构在内存中存储图像。这是您将在大多数较旧的教程和...
  • wadefan7
  • wadefan7
  • 2015年03月05日 15:53
  • 4293

关于C和C++一些大神们的讨论

知乎上曾经有一个关于C和C++语言的讨论,弄的沸沸扬扬。余天升 开源社区一直都不怎么待见C++,自由软件基金会创始人Richard Stallman认为C++有语法歧义,这样子没有必要、非常琐碎还会...
  • wangshubo1989
  • wangshubo1989
  • 2016年02月23日 20:33
  • 2637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的析构函数和构造函数
举报原因:
原因补充:

(最多只允许输入30个字)