1、结构体
结构体(struct)这一术语指的是使用其他类型组建的数据。通常情况下,你会希望创建类而非结构体,这样除了能利用结构体的公用数据成员,还能利用类所提供的私密性和功能性。但有时,直接操作成块的数据会十分方便。
使用结构体的理由:
- 用结构体来明确数据关系
- 用结构体来简化对数据块的操作
- 用结构体来简化参数列表
- 用结构体来减少维护
2、指针
从概念上看,指针包含两个部分:
-
内存中的位置
内存中的一个位置就是一个地址,指针本身只包含这个地址,为了使用该指针所指向的数据,就必须访问该地址,解释该位置的内存内容。
-
如何解释该位置的内容
如何解释内存中某个位置的内容,是由指针的基类型(base tye)决定的。内存并不包含任何与之相关的内在解析,只有通过一个特定类型的指针,一个特殊位置的比特才能解释为有意义的数据。
使用指针的一般技巧:
- 把指针操作限制在子程序或者类里面
- 同时声明和定义指针
- 在与指针分配相同的作用域中删除指针
- 在使用指针之前检查指针
- 先检查指针所引用的变量再使用它
- 用狗牌字段来检测损毁的内存
- 增加明显的冗余
- 用额外的指针变量来提高代码清晰度
- 简化复杂的指针表达式
- 画一个图来帮助我们考虑指针链接步骤
- 按照正确的顺序删除链表中的指针
- 分配一篇保留的内存后备区域
- 粉碎垃圾数据
- 在删除或者释放指针之后把它们设置为空值
- 在删除变量之前检查非法指针
- 跟踪指针分配情况
- 编写覆盖子程序,集中实现避免指针问题的策略
- 采用非指针的技术
c++ 指针:
- 理解指针和引用之间的区别
- 把指针用于“按引用传递”参数,把const引用用于“按值传递”参数
- 使用auto_ptr
- 灵活运用智能指针
c指针:
- 使用显式指针类型而不是默认类型
- 避免强制类型转换
- 遵循参数传递的星号规则
- 在内存分配中使用sizeof()确定变量的大小
3、全局数据
全局数据可以在程序中任意一个位置访问,使用全局数据的风险比局部数据大。
与全局数据有关的常见问题:
- 无意间修改了全局数据
- 与全局数据有关的奇异和令人激动的别名问题
- 与全局数据有关的代码重入问题
- 全局数据阻碍代码重用
- 与全局数据有关的非确定的初始化顺序事宜
- 全局数据破坏了模块化和智力上的可管理性
使用全局数据的理由:
- 保存全局数值
- 模拟具名常量
- 模拟枚举类型
- 简化对极其常用的数据的使用
- 消除流浪数据
只有万不得已才使用全局数据:
- 首先把一个变量设置为局部的,仅当需要时才设置为全局的
- 区分全局变量和类变量
用访问器子程序来取代全局数据:
-
访问器子程序的优势
- 获得对数据的集中控制
- 可以确保对变量的所有引用都得到了保护
- 自动获得信息隐藏的普遍益处
- 访问器子程序可以很容易的转变为抽象数据类型
-
使用访问器子程序来隐藏全局变量的指导原则:
- 要求所有的代码通过访问器子程序来存取数据
- 不要把所有的全局数据都扔在一块
- 用锁定来控制对全局变量的访问
- 在访问器子程序里构建一个抽象层
- 使得对一项数据的所有访问都发生在同一个抽象层上
-
如何降低使用全局数据的风险
- 创建一种命名规则来突出全局变量
- 为全部的全局变量创建一份注释良好的清单
- 不要用全局变量来存放中间结果
- 不要把所有的数据都放在一个大对象中并到处传递,以说明你没有使用全局变量
更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/
本文链接:http://tabalt.net/blog/cc2-unusual-data-types/,转载请注明。
