C++基础之析构函数的介绍

开发 后端
本文介绍的是C++程序设计语言中的析构函数,对于析构函数而言,我想我们并不陌生。希望对你有帮助,一起来看。

析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

前面的一些例子都没有说明析构函数,这是因为所用到的类在结束时不需要做特别的清理工作。下面的程序给出了一新的Date类,其中包括一个字符串指针,用来表示月份。

#include \"iostream.h\"  
#include \"string.h\"  
 
class Date  
{  
int mo,da,yr;  
char *month;  
public:  
Date(int m=0, int d=0, int y=0);  
~Date();  
void display() const;  
};  
 
Date::Date(int m,int d,int y)  
{  
static char *mos[] =  
{  
\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",  
\"July\",\"August\",\"September\",\"October\",\"November\",\"December\" 
};  
mo=m; da=d; yr=y;  
if(m!=0)  
{  
month=new char[strlen(mos[m-1])+1];  
strcpy(month, mos[m-1]);  
}  
else month = 0;  
}  
 
Date::~Date()  
{  
delete [] month;  
}  
 
void Date::display() const 
{  
if(month!=0) cout<<month<<\' \'<<da<<\',\'<<yr;  
}  
 
int main()  
{  
Date birthday(8,11,1979);  
birthday.display();  
return 0;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

在Date对象的构造函数中,首先用new运算符为字符串month动态分配了内存,然后从内部数组中把月份的名字拷贝给字符串指针month。
析构函数在删除month指针时,可能会出现一些问题。当然从这个程序本身来看,没什么麻烦;但是从设计一个类的角度来看,当Date类用于赋值时,就会出现问题。假设上面的main()修改为“

int main()  
{  
Date birthday(8,11,1979);  
 
Date today;  
today=birthday;  
 
birthday.display();  
return 0;  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

这会生成一个名为today的空的Date型变量,并且把birthday值赋给它。如果不特别通知编译器,它会简单的认为类的赋值就是成员对成员的拷贝。在上面的程序中,变量birthday有一个字符型指针month,并且在构造函数里用new运算符初始化过了。当birthday离开其作用域时,析构函数会调用delete运算符来释放内存。但同时,当today离开它的作用域时,析构函数同样会对它进行释放操作,而today里的month指针是birthday里的month指针的一个拷贝。析构函数对同一指针进行了两次删除操作,这会带来不可预知的后果。

如果假设today是一个外部变量,而birthday是一个自变量。当birthday离开其作用域时,就已经把对象today里的month指针删除了。显然这也是不正确的。
再假设有两个初始化的Date变量,把其中一个的值赋值给另一个:

Date birthday(8,11,1979);  
Date today(12,29,2003);  
today=birthday; 
  • 1.
  • 2.
  • 3.

问题就更复杂了,当这两个变量离开作用域时,birthday中的month的值已经通过赋值传递给了today。而today中构造函数用new运算符给month的值却因为赋值被覆盖了。这样,birthday中的month被删除了两次,而today中month却没有被删除掉。

希望以上内容对析构函数的介绍,能够给你带来帮助。

责任编辑:于铁 来源: 互联网
相关推荐

2025-02-18 00:08:00

代码C++RAII

2010-01-18 15:53:27

C++析构函数

2010-02-04 16:39:26

C++析构函数

2010-02-05 13:35:19

C++虚析构函数

2024-12-19 14:42:15

C++内存泄漏内存管理

2009-08-14 17:24:28

C#构造函数和析构函数

2011-07-14 23:27:05

C++引用

2009-07-30 15:24:13

C#析构函数C#构造函数

2009-09-03 13:14:55

C#构造函数C#析构函数

2011-06-15 09:47:14

C++

2011-07-14 17:17:21

C++指针

2011-07-14 17:02:09

C++指针

2024-12-11 16:00:00

C++函数编译器

2021-12-11 19:02:03

函数C++对象

2010-01-20 14:25:56

函数调用

2010-07-20 09:52:27

Perl构造函数

2011-06-17 16:09:04

freadfwrite

2010-01-25 10:10:42

C++函数参数

2011-07-15 00:47:13

C++多态

2024-08-12 08:34:25

析构函数C++
点赞
收藏

51CTO技术栈公众号