一、类的缺省函数
每个类只有一个析构函数和赋值函数,但可以有多个构造函数。对于任意类A,C++编译器自动为A生成四个缺省的函数:
A();
A(const A &a);
~A();
A & operate = (const A &a);
二、构造函数的初始化表
规则:
(1)如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数???
(2)类的const常量只能在初始化表里被初始化,因为它不能在函数体用赋值的方式来初始化。
(3)非内部数据类型的成员对象应该采用初始化表的方式初始化,以获取更高的效率。如:
class A
{
A();
A(const A &other);
A & operate =(const A&other);
};
class B
{
public:
B(const A&a);
private:
A m_a;
};
B::B(const A &a):m_a(a)
{}
类B的构造函数在其初始化表中调用了类A的拷贝构造函数,从而将成员对象m_a初始化。
B::B(const A &a)
{
m_a = a;
}
类B的构造函数先调用A的无参构造函数创建对象m_a,再调用类A的赋值函数,将参数a赋给m_a。
三、构造和析构的次序
构造从类的最根层开始,在每一层中,首先调用基类的构造函数,然后调用成员对象的构造函数。析构则严格按照与构造相反的次序执行,该次序是唯一的,否则编译器无法自动执行析构过程。
成员对象初始化的顺序不受初始化表中次序的影响,只由成员对象在类中声明的次序决定。因为如果以初始化表中次序初始化成员对象,则每个构造函数都有一个构造顺序,造成析构函数的执行次序无法唯一。
四、拷贝构造函数与赋值函数
拷贝构造函数是对象被创建时调用的,赋值函数只能被已经存在的对象调用。
String c = a;//调用了拷贝构造函数,最好写成String c(a)
c = b;//调用了赋值函数
五、偷懒的办法处理拷贝构造函数和赋值函数
如果不想编写构造函数和赋值函数,又不允许别人调用编译器自动生成的缺省函数,怎么办?
偷懒的办法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。
六、如何在派生类中实现类的基本函数
注意事项:
(1)派生类的构造函数应在其初始化表中调用基类的构造函数。
(2)基类与派生类的析构函数应该为虚。
(3)在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值(可调用基类的赋值函数,已完成对基类私用成员的赋值)。