1 Sales_item Primer_2nd("0-201-54848-8");//运行带string参数的构造函数 2 Sales_item *p = new Sales_item();//通过默认构造函数初始化该对象
View Code6. 构造函数初始化列表
对象中的一些数据成员除了在构造函数体中进行初始化外,还可以通过构造函数初始化列表进行初始化,构造函数初始化列表只在构造函数的定义中而不是声明中指定。从概念上将讲,可以认为构造函数分两个阶段执 行:(1)初始化阶段;(2)普通计算阶段,计算阶段由构造函数函数体中的所有语句组成;(3)构造函数就是按照成员定义的次序初始化成员的次序。
不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化阶段发生在计算阶段开始之前。
1 Sales_item::Sales_item(const string &book): isbn(book), units_sold(0), revenue(0.0){}
View Code说明:对于const类型成员、引用类型的成员变量都必须在构造函数初始化列表中进行初始化,例如下面的代码就是错误的,必须在初始化列表中对类成员变量进行初始化。
1 class ConstRef{ 2 public: 3 ConstRef(int ii); 4 private: 5 int i; 6 const int ci; 7 int &ri; 8 }; 9 ConstRef::ConstRef(int ii) 10 { 11 //赋值 12 i = ii; 13 ci = ii; //错误,不能对const成员赋值 14 ri = i;//不能对引用变量赋值 15 } 16 记住,可以初始化const对象或引用类型的对象,但不能对它们赋值。在开始执行构造函数体之前,要完成初始化。初始化const或引用类型的唯一机会是在构造函数初始化列表中。编写以上构造函数的正确方式为 17 ConstRef::ConstRef(int ii):i(ii), ci(i), ri(ii) View Code
二、析构函数
构造函数的一个作用是自动获取资源。例如,构造函数可以分配一个缓冲区或打开一个文件,在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源。析构函数就是这样一个特殊函数,它可以完成所需资 源的回收,作为类的构造函数的补充。
1.何时调用析构函数
a.删除指向动态分配对象的指针
b.实际对象(而不是对象的引用)超出作用域时
c.撤销一个容器(不管是标准库容器还是内置数组)时,即超出容器的作用范围时
2.缺省析构函数