对象的生命周期
——C++11构造函数的新特性
- 委托构造函数:允许构造函数调用同一个类的其它构造函数。(而在此之前,虽然编译可通过,但不能像预期那样调用构造函数以初始化对象)
- 引入显式默认构造函数:MyClass() = default; //仅在类定义中声明,而不需具体实现
- 显式删除构造函数: MyClass() = delelete; //想定义一个没有任何构造函数,且不想让编译器生成默认构造函数时使用;
——什么时候需要默认构造函数
- 当需创建某个类的对象数组时:MyClass myC[3];
- 当想要在STL容器(如std::vector)中存储类时;
- 当在其他类中创建该类对象时(即该类对象是其他类的成员变量);
- 如果某个类是继承层次结构的基类,默认构造函数会带来很多方便(子类可以通过默认构造函数方便地初始化基类)
——构造函数初始化器与构造函数体内初始化的区别
- 前者比后者效率高(前者允许在创建数据成员时赋初值);
- 有些数据类型必须使用前者方式进行初始化
- const 数据成员 //因为const变量创建后无法对其正确赋值,必须在创建时候提供值;
- 引用数据成员 //因为如果不指向一个量,引用将无法存在;
- 没有默认构造函数的对象数据成员
- 没有默认构造函数的超类
说明:构造函数初始化器:MyClass::MyClass() : m_Value(2), m_String("")
机制:
- 当C++创建对象时,必须在调用构造函数前创建对象的所有数据成员。
- 若数据成员本身就是对象,那么在创建这些对象时,必须为其调用构造函数;
- 当在构造函数体内给某个对象赋值时,并没有真正创建这个对象,而是改变这个对象的值。
——销毁在干什么
- 调用对象的析构函数
- 释放对象占用的内存
——栈与堆的销毁
- 栈:遇到“}”时(即超出作用域)就会销毁;且多个对象销毁的顺序与创建顺序相反;
- 堆:必须调用delete才会销毁