本节书摘来自异步社区出版社《c++面向对象高效编程(第2版)》一书中的第4章,第4.3节,作者: 【美】kayshav dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
c++面向对象高效编程(第2版)
c++提供类的析构函数专门处理无用单元收集,但是,这并不意味着无用单元收集只发生在析构函数中。实际上,某些其他成员函数也必须考虑无用单元收集。
类的析构函数给予对象最后一次机会释放它所获得的所有资源。在退出某作用域之前,由语言自动为在该作用域中创建的自动(基于栈)对象调用析构函数。此时,对象即将被销毁(也就是说,被对象占用的内存即将被系统回收)。一旦析构函数完成,对象将彻底地消失。
删除(使用delete操作符)指向某对象的指针时,将通过该对象调用对象所属类的析构函数。
// 第一个构造函数
tperson::tperson(const char birthdate[])
: _ssn(0), _name(0), _birthdate(birthdate), _address(0)
{ / 构造函数体无代码 / }
char strdup (const char src) // 辅助函数
{
char* ptr = new char[strlen(src)+1];
strcpy(ptr, src);
return ptr;
}
// 第二个构造函数
tperson::tperson(const char thename[], const char theaddress[],
unsigned long thessn, const char thebirthdate[])
: _ssn(thessn), _birthdate(thebirthdate)
{ // 初始化_name、_address等
_name = (thename ? strdup(thename) : 0);
_address = (theaddress ? strdup(theaddress) : 0);
}<code>`</code>
我们已在堆(heap)上为待储存人名中的字符分配内存。析构函数负责释放这些内存。
main()
tperson john(“11-23-45”);
// ...
john.setname(“john wayne”);
对象john只有出生日期,没有姓名。接下来,我们使用setname成员函数设置john的姓名。setname成员函数用来做什么?以下是它的实现代码: