高质量C++/C编程指南

基本信息

  • 作者:林锐 博士
  • 版本:v1.0
  • 完成日期:2001年7月
  • 页数:101页
  • 原始路径:/田浩然上传的资料/电子书/C_C++/高质量C++_C编程指南.pdf

核心内容

本书是华为知名技术专家林锐博士撰写的C++/C编程指南,被誉为”百页经书”。内容涵盖了从文件结构到高级特性的全面编程规范。

第1章 文件结构

  • 头文件作用:包含类声明、函数声明、宏定义等
  • 目录结构:规范的工程目录组织方式
  • 版权和版本声明:文件头部的标准声明格式

第2章 程序的版式

  • 空行:用空行分隔逻辑相关的代码段
  • 代码行:每行代码不宜过长,一般不超过80列
  • 空格:运算符两侧、关键字与括号之间加空格
  • 对齐:保持代码的视觉对齐
  • 长行拆分:过长的表达式应适当拆分
  • 注释:注释要清晰、简洁,解释”为什么”而非”是什么”

第3章 命名规则

  • 共性规则:
    • 文件名:全小写,用下划线分隔
    • 变量名:小写字母开头,混合大小写
    • 常量:全大写字母,用下划线分隔
    • 类名:大写字母开头,混合大小写
    • 函数名:小写字母开头,混合大小写
  • Windows应用命名:匈牙利命名法
  • UNIX应用命名:下划线分隔

第4章 表达式和基本语句

  • 运算符优先级:了解优先级,必要时用括号明确
  • 复合表达式:避免过于复杂的复合表达式
  • IF语句:
    • 比较操作放在左边:if (x == 0) 而非 if (0 == x)
    • 统一使用花括号:即使只有一行代码
  • 循环语句的效率:
    • 将循环变量初始化放在循环外
    • 避免在循环体内进行不必要的计算
  • FOR语句:循环控制变量不应在循环体内被修改
  • SWITCH语句:每个case后必须有break
  • GOTO语句:尽量避免使用

第5章 常量

  • 为什么需要常量:提高程序可读性和可维护性
  • const与#define的比较:
    • const有类型检查,#define没有
    • const参与编译,#define是文本替换
    • const可调试,#define不可调试
  • 常量定义规则:使用const关键字定义常量

第6章 函数设计

  • 参数的规则:
    • 参数个数不宜过多
    • 输入参数用const修饰
    • 指针参数前加const
  • 返回值的规则:
    • 返回指针时检查有效性
    • 返回引用时注意生命周期
  • 函数内部实现的规则:
    • 函数职责单一
    • 避免过长的函数
  • 使用断言:用assert检查前置条件

第7章 内存管理(核心章节)

  • 内存分配方式:
    • 从静态存储区分配:全局变量、静态变量
    • 从栈上分配:局部变量
    • 从堆上分配:动态内存
  • 常见的内存错误及其对策:
    • 内存分配未成功却使用了它
    • 内存分配成功但未初始化
    • 内存分配成功且已初始化,但操作越界
    • 使用了free或delete释放了内存后仍未置指针为NULL
    • 忘记释放内存,造成内存泄漏
    • free或delete了非动态内存
    • 对同一块动态内存多次释放
    • 释放动态内存之后却用它
  • 指针与数组的对比:
    • sizeof运算符对指针和数组的区别
    • 指针算术运算
  • 杜绝”野指针”:
    • 指针未初始化
    • 指针越界
    • 指针指向的空间已释放
  • malloc/free与new/delete的区别:
    • new/delete是运算符,malloc/free是函数
    • new/delete会调用构造函数和析构函数
    • new/delete返回具体类型,malloc/free返回void*
    • new/delete可重载,malloc/free不能

第8章 C++函数的高级特性

  • 函数重载的概念:同名不同参
  • 成员函数的重载、覆盖与隐藏:
    • 重载:同一作用域,同名不同参
    • 覆盖:派生类覆盖基类虚函数
    • 隐藏:派生类屏蔽基类同名函数
  • 参数的缺省值:右侧参数才能有缺省值
  • 运算符重载:合理重载,避免滥用
  • 函数内联:内联函数避免递归、循环等复杂操作

第9章 类的构造函数、析构函数与赋值函数

  • 构造函数的初始化表:效率更高
  • 构造和析构的次序:先基类后派生类,先成员后自身
  • 拷贝构造函数与赋值函数:
    • 必须正确处理深拷贝
    • 赋值函数要检查自赋值
  • 在派生类中实现基本函数:正确调用基类函数

第10章 类的继承与组合

  • 继承:is-a关系,公有继承
  • 组合:has-a关系,优先使用组合而非继承

第11章 其它编程经验

  • 使用const提高函数健壮性:
    • const参数
    • const返回值
    • const成员函数
  • 提高程序效率:
    • 用空间换时间
    • 减少系统调用
    • 避免不必要的计算
  • 有益的建议:
    • 代码风格一致
    • 合理使用宏
    • 注释要清晰

附录A:C++/C代码审查表

  • 文件结构审查
  • 程序版式审查
  • 命名规则审查
  • 表达式和语句审查
  • 常量审查
  • 函数设计审查
  • 内存管理审查
  • C++高级特性审查
  • 类的设计审查

附录B:C++/C试题

  • 经典面试题,包括:
    • sizeof运算符
    • 内存分配
    • strcpy函数实现
    • String类实现

核心观点

  1. 代码规范是质量的基础:良好的编码规范能显著提高代码可读性和可维护性
  2. 内存管理是C++的核心难点:正确理解和使用内存管理是区分初级和高级程序员的关键
  3. const的正确使用:合理使用const可以提高代码安全性和可读性
  4. 构造函数和析构函数的重要性:正确实现这四个基本函数是类设计的基础

可行动点

  1. 建立代码审查清单:参考附录A,为团队建立代码审查流程
  2. 统一命名规范:根据项目平台选择Windows或UNIX命名风格
  3. 重视内存管理:定期检查内存泄漏和野指针问题
  4. 合理使用const:在所有可能的地方使用const

与其他知识的关联