一、类的缺省函数

每个类只有一个析构函数和赋值函数,但可以有多个构造函数。对于任意类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)在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值(可调用基类的赋值函数,已完成对基类私用成员的赋值)。

posted on 2013-03-17 21:39  guoxiang  阅读(222)  评论(0编辑  收藏  举报