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/,转载请注明。