再谈类的构造函数与初始化(2)

踩了有关默认构造函数的一个坑,于是复习了一下CPPP。

1 抽象数据类型将数据(类的数据成员)和作用于状态的操作(类的成员函数)视为一个单元。

2 在创建类的对象之前,必须完整地定义该类。必须定义类,而不只是声明类,这样,编译器就会给类的对象 预留相应的存储空间。同样地,在使用引用或指针访问类的成员之前,必须已经定义类。

3 构造函数是特殊的成员函数,只要创建类型为类的新对象,就会执行构造函数。构造函数的工作是保证每个对象的数据成员具有合适的初始值。

4 从概念上讲,可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)计算阶段。
初始化可以使用初始化列表显示完成。计算阶段由构造函数函数体中的所有语句组成。初始化发生在计算阶段开始之前。
初始化列表即Sales_item::Sales_item(const string &book):isbn(book), units_sold(0), revenue(0.0)
类类型的数据成员总是在初始化阶段初始化,无论是否在构造函数的初始化列表中显示初始化。


5 类型类类的变量必定会在初始化阶段进行初始化。如果在构造函数的初始化列表中写明了这个变量的初始,则依据此值进行初始化,否则调用默认构造函数进行初始化。内置或者复合类型的成员的初始值依赖于对象的作用域。在局部作用域中这些成员不被初始化,在全局作用域中这些成员被初始化为零。


6 必须对任何 const 或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。

例如,下面的构造函数是错误的:
class ConstRef {
public:
ConstRef(int ii);
private:
int i;
const int ci;
int &ri;
};
// no explicit constructor initializer: error ri is uninitialized
ConstRef::ConstRef(int ii)
{ // assignments:
i = ii; // ok
ci = ii; // error: cannot assign to a const
ri = i; // assigns to ri which was not bound to an object
}

但是下面的构造函数是正确的
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) { }

7 只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数。

8 如果类包含内置或复合类型的成员,则该类应该定义自己的构造函数来初始化这些成员,而不应该依赖编译器生成的默认构造函数。

9 如果动态调用构造函数。

Sales_item *p = new Sales_item();

你可能感兴趣的:(再谈类的构造函数与初始化(2))