一、 如果成员变量是对象实体(不是指针)
例如StudyTool类中有一个Book类的成员变量,StudyTool的构造函数和析构函数均为空函数。
class StudyTool
{
public:
Book book;
StudyTool();
virtual ~StudyTool();
void printBook();
};
那么在main()方法中执行如下代码时
int main(void) {
StudyTool tool;
return 0;
}
执行顺序为:1. 执行Book的默认构造函数,2. 执行StudyTool的默认构造函数, 3.执行StudyTool的析构函数, 4. 执行Book的析构函数。
注1:以上顺序可以通过:设置一个全局变量,在StudyTool和Book的构造函数和析构函数中分别打印函数名和全局变量,来证明其执行顺序。本人已编码做过验证。
可见,在执行StudyTool的构造函数之前,将会自动调用其成员变量book的构造函数,同时,当main()函数清理栈内存时,调用外层StudyTool的析构函数之后,会再自动调用成员变量book的析构函数。
二、如果成员变量是指针
仍用StudyTool和Book的例子,在StudyTool的构造函数中new一个Book,将其赋给指针book,StudyTool和Book的析构函数均为空函数。如下
class StudyTool
{
public:
Book *book;
StudyTool()
{
book = new Book();
}
virtual ~StudyTool()
{
}
void printBook();
};
则执行顺序为:将1. 执行StudyTool的构造函数,2. 在StudyTool的构造函数中,通过new语句来执行Book的构造函数, 3.执行StudyTool的析构函数。
注2:以上顺序本人也编码做过验证,验证方式类同注1。
可见:当成员变量为指针时,外层类StudyTool不会自动对其初始化,也不会自动对其析构。需要在构造函数和析构函数中显式地对其new和delete。
因此,上述StudyTool类的析构函数中应该加上 delete book 这句。
原文链接: https://www.cnblogs.com/james6176/archive/2012/11/28/2792947.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/70840
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!