网站优化建设公司,电商网站建设公司哪家好,湖南众诚建设 官方网站,网站管理系统改不了的一、 如果成员变量是对象实体#xff08;不是指针#xff09; 例如StudyTool类中有一个Book类的成员变量#xff0c;StudyTool的构造函数和析构函数均为空函数。 class StudyTool
{
public:Book book;StudyTool();virtual ~StudyTool();void printBook();
}; 那么在main()方…一、 如果成员变量是对象实体不是指针 例如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将其赋给指针bookStudyTool和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