设为首页 加入收藏

TOP

2018年计算机二级C++辅导笔记:析构函数
2018-03-28 09:05:52 】 浏览:294
Tags:2018年 计算机 二级 辅导 笔记 函数

析构函数和this指针


一、析构函数


前面的一些例子都没有说明析构函数,这是因为所用到的类在结束时不需要做特别的清理工作。下面的程序给出了一新的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< }


int main()


{


Date birthday(8,11,1979);


birthday.display();


return 0;


}


在Date对象的构造函数中,首先用new运算符为字符串month动态分配了内存,然后从内部数组中把月份的名字拷贝给字符串指针month。


析构函数在删除month指针时,可能会出现一些问题。当然从这个程序本身来看,没什么麻烦;但是从设计一个类的角度来看,当Date类用于赋值时,就会出现问题。假设上面的main()修改为“


int main()


{


Date birthday(8,11,1979);


Date today;


today=birthday;


birthday.display();


return 0;


}


这会生成一个名为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;


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇2018年计算机二级C++辅导笔记:MF.. 下一篇2018年计算机二级C++辅导笔记:重..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目