编程高手之路-- C++入门—析构函数和this指针
void Date::display() const
{
if(month!=0) cout<<MONTH<<' ?<<da<<?,?<<yr;
}
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却没有被删除掉。
你可能喜欢
- C语言函数指针
- 语言分析
- 劳动合同
- 嵌入式C语言
- C语言指针详解
- 结构体指针
- 高等数学公式
- 2012劳动合同范本6页
- 简易劳动合同范本2页
- 通知签订劳动合同1页
- 劳动合同管理办法31页
- 劳动合同2页
- 外商投资企业劳动合同25页


