个人日志

物联网 & 极简主义

<30, 读书笔记——林锐-高质量C编程指南:卷9:类内函数>

本篇主要涉及类的构造函数,析构函数和赋值函数。每个类只能有一个析构函数和赋值函数,但可以有多个构造函数。


类A的默认配置如下:

1,缺省的无参构造函数:A(void);

2,缺省的析构函数:~A(void);

3,  缺省的拷贝构造函数:A(const A &a);

4,缺省的赋值函数:A & operator = (const A &a);


然而我们不适用默认的这些函数的原因是:

1,我们不能白白的浪费了构造和析构时的好时机;

2,缺省的拷贝构造函数和赋值函数均采用的是“位拷贝”,而非值拷贝,倘若类中有指针,则这两个函数必定出错。


———————————————————————————————

1,一般而言,对于一个较为高级的程序员,其出错的地方自然不是语法错误,而是隐藏较深的数据未能初始化或及时清除。

故C++衍生出了构造析构机制,这里的析构函数和构造函数自然与类同名,此外,这两个函数并无返回值。


2,构造函数的初始化表达式:

初始化表,位于函数参数表之后,函数执行体之前。

构造函数的使用规则有:

2.1 若类存在继承关系,则派生类一定要在其初始化表里调用基类的构造函数。

2.2 类的const常量只能在初始化表里进行,而不能再函数体里以赋值的形式来初始化

2.3 对于类外成员,建议采用初始化标的方式来进行初始化。而类内成员,则两者均可以,故一般采用在类内初始化的方法。


3,构造和析构的次序

构造是从类的最根层开始(由基类到派生类),每层均先调用基类的构造函数,再调用对象的构造函数。——而析构则严格按照此过程的逆过程来进行。

此外,类成员对象的构造顺序仅受其在类中声明的位置有关,而与初始化表无关,


4,类String的构造函数和析构函数实例;


5,类String的拷贝构造函数和赋值函数的实例;


6,偷懒的处理拷贝构造函数和赋值函数的方法;


若我们不想编写这两个函数,并且不想其被使用,则,直接在类定义时将其声明为私有函数。


7,如何在派生类中实现基类的基本函数;


7.1 对于构造函数,应在派生类的构造函数的初始化表中调用基类的构造函数


7.2 对于析构函数,则应该在派生类和基类的析构函数前均加上virtual关键字


7.3 最后,最关键的一点是,在派生类中对数据成员赋值时,不要忘了对基类的数据成员赋值

-----------------------------------------------------------

此日志仅为个人笔记,若需电子版,请留言。

上一篇 下一篇
评论
热度(1)
©个人日志 | Powered by LOFTER