zoukankan      html  css  js  c++  java
  • c++成员变量与构造函数

    一、 如果成员变量是对象实体(不是指针)

    例如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 这句。

  • 相关阅读:
    C#如何释放未托管资源
    C# 如何将一个List转换为只读的
    【转载】所谓爱情不是一个人的事情(爱情不完全手册)
    vbs SendKey 用法 Sendkey 键盘对应的码表
    PowerShell签名和执行策略
    IDisposable接口和析构函数的联合使用
    [读报]2009中国基金业明星基金奖揭晓
    【读书笔记】泛型接口 和 泛型方法
    C# 反射(转)
    设计模式详解——装饰者模式
  • 原文地址:https://www.cnblogs.com/james6176/p/2792947.html
Copyright © 2011-2022 走看看