高质量C/C++编程指南--读书笔记九 9、10、11章

第九章  类的构造、析构函数

一、知识点
1、对于一个类,如果不想编写构造、析构、赋值函数,那么C++编译器将自动为 A 产生四个缺省的函数,如 (P69)
A(void);     //  缺省的无参数构造函数
A(const A &a);    //  缺省的拷贝构造函数
~A(void);     //  缺省的析构函数
A & operate =(const A &a); //  缺省的赋值函数 
 “缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。 
 
2、构造函数初始化表的使用规则:(P70)
(1)、 如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数
(2)、类的 const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化
(3)、类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。例如:
示例 9-2(a)中,类 B 的构造函数在其初始化表里调用了类 A 的拷贝构造函数,从而将成员对象 m_a 初始化。
示例 9-2 (b)中,类 B 的构造函数在函数体内用赋值的方式将成员对象 m_a 初始化。我们看到的只是一条赋值语句,但实际上 B 的构造函数干了两件事:先暗地里创建 m_a对象(调用了 A 的无参数构造函数) ,再调用类 A 的赋值函数,将参数 a 赋给 m_a。 

3、, 成员对象初始化的次序完全不受它们在初始化表中次序的影响,只由成员对象在类中声明的次序决定。这是因为类的声明是唯一的,而类的构造函数可
以有多个,因此会有多个不同次序的初始化表。(P72)
 
4、拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。(P74)
 
5、拷贝构造函数与普通构造函数的区别:在函数入口处无需与NULL进行比较,这是因为“引用”不可能是NULL,而“指针”可以为NULL。(P75)
类string的赋值函数比构造函数复杂得多,分四步实现:
(1)、检查字符值
(2)、用delete释放原有的内存资源
(3)、分配新的内存资源,并复制字符串
(4)、返回本对象的引用,目的是为了实现像a = b = c 这样的链式表达
 
6、如果我们实在不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数,怎么办? 偷懒的办法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。(P75)
 
7、在派生类中实现类的基本函数:基类的构造函数、析构函数、赋值函数都不能被派生类继承。如果类之间存在继承关系,在编写上述基本函数时应注意以下事项:
(1)、 派生类的构造函数应在其初始化表里调用基类的构造函数
(2)、 基类与派生类的析构函数应该为虚(即加 virtual 关键字) 。
(3)、 在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值
 
 
 
第十章
 
一、知识点
1、继承规则:若在逻辑上B是A的“一种”,并且A的所有功能和属性对 B 而言都有意义,则允许 B 继承 A的功能和属性。(P80)
 
2、组合规则:若在逻辑上 A 是 B 的“一部分”  ,则不允许 B 从 A 派生,而是要用 A 和其它东西组合出 B。 (P81)
 
 
 
第十一章
 
一、知识点
1、const的用法总结:

2、函数返回值采用“引用传递”的目的多是为了实现链式表达。(P83)
 
3、  任何不会修改数据成员的函数都应该声明为 const 类型。如果在编写 const 成员函数时,不慎修改了数据成员,或者调用了其它非 const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。 (P84)
posted on 2012-05-01 09:40  谷堆旁边  阅读(176)  评论(0编辑  收藏  举报