对象的生命周期

——C++11构造函数的新特性

  • 委托构造函数:允许构造函数调用同一个类的其它构造函数。(而在此之前,虽然编译可通过,但不能像预期那样调用构造函数以初始化对象)
  • 引入显式默认构造函数:MyClass() = default;    //仅在类定义中声明,而不需具体实现
  • 显式删除构造函数:  MyClass() = delelete;   //想定义一个没有任何构造函数,且不想让编译器生成默认构造函数时使用;

——什么时候需要默认构造函数

  • 当需创建某个类的对象数组时:MyClass myC[3];
  • 当想要在STL容器(如std::vector)中存储类时;
  • 当在其他类中创建该类对象时(即该类对象是其他类的成员变量);
  • 如果某个类是继承层次结构的基类,默认构造函数会带来很多方便(子类可以通过默认构造函数方便地初始化基类)

——构造函数初始化器与构造函数体内初始化的区别

  • 前者比后者效率高(前者允许在创建数据成员时赋初值);
  • 有些数据类型必须使用前者方式进行初始化
    • const 数据成员  //因为const变量创建后无法对其正确赋值,必须在创建时候提供值;
    • 引用数据成员   //因为如果不指向一个量,引用将无法存在;
    • 没有默认构造函数的对象数据成员
    • 没有默认构造函数的超类

  

  说明:构造函数初始化器:MyClass::MyClass() : m_Value(2), m_String("")

  机制:

  • 当C++创建对象时,必须在调用构造函数前创建对象的所有数据成员。
  • 若数据成员本身就是对象,那么在创建这些对象时,必须为其调用构造函数;
  • 当在构造函数体内给某个对象赋值时,并没有真正创建这个对象,而是改变这个对象的值。

——销毁在干什么

  • 调用对象的析构函数
  • 释放对象占用的内存

——栈与堆的销毁

  • 栈:遇到“}”时(即超出作用域)就会销毁;且多个对象销毁的顺序与创建顺序相反;
  • 堆:必须调用delete才会销毁
posted @ 2013-01-31 10:22  卧野观云  阅读(138)  评论(0编辑  收藏  举报