《高质量C++编程指南》读书笔记(二)

类别:VC语言 点击:0 评论:0 推荐:

内存管理:

用malloc 或new 申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL 的内存。

不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。

免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

动态内存的申请与释放必须配对,防止内存泄漏。

free delete 释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

 

 

 

C++函数的高级特性:

参数缺省值只能出现在函数的声明中,而不能出现在定义体中。

如果函数有多个参数,参数只能从后向前挨个儿缺省,否则将导致函数调用语句怪模怪样。

 

 

类的构造函数、析构函数与赋值函数:

不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。

构造函数初始化表的使用规则:

    如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。

类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化。

类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。

基类的构造函数、析构函数、赋值函数都不能被派生类继承。如果类之间存在继承关系,在编写上述基本函数时应注意以下事项:

派生类的构造函数应在其初始化表里调用基类的构造函数。

    基类与派生类的析构函数应该为虚(即加virtual 关键字)。

    在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值。

 

 

 

 

 

类的继承与组合:

 

 

如果类A 和类B 毫不相关,不可以为了使B 的功能更多些而让B继承A 的功能和属性。不要觉得“白吃白不吃”,让一个好端端的健壮青年无缘无故地吃人参补身体。

若在逻辑上B A 的“一种”(a kind of ),则允许B 继承A 的功能和属性。

若在逻辑上A B 的“一部分”(a part of),则不允许B A 派生,而是要用A 和其它东西组合出B

 

 

 

其它编程经验:

 

不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率。

以提高程序的全局效率为主,提高局部效率为辅。

在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。

先优化数据结构和算法,再优化执行代码。

有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。

不要追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。

 

 

一些有益的建议:

当心那些视觉上不易分辨的操作符发生书写错误。

我们经常会把“==”误写成“=”,象“||”、“&&”、“<=”、“>=”这类符号也很容易发生“丢1”失误。然而编译器却不一定能自动指出这类错误。

 

变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。

当心变量的初值、缺省值错误,或者精度不够。

当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。

当心变量发生上溢或下溢,数组的下标越界。

当心忘记编写错误处理程序,当心错误处理程序本身有误。

当心文件I/O 有错误。

避免编写技巧性很高代码。

不要设计面面俱到、非常灵活的数据结构。

如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。

尽量使用标准库函数,不要“发明”已经存在的库函数。

尽量不要使用与具体硬件或软件环境关系密切的变量。

把编译器的选择项设置为最严格状态。

如果可能的话,使用PC-LintLogiScope 等工具进行代码审查。

 

 

本文地址:http://com.8s8s.com/it/it2233.htm