C++ Primer Plus(九)——内存模型和名称空间

  1.  程序分红三部分:程序员

    1. 头文件:包含结构声明和使用这些结构的函数的原型,使用#define或const定义的符号常量,类声明,模板声明,内联函数数组

      只需将源代码文件加入项目中,而不用加入头文件;不要使用#include来包含源代码文件,这样将致使多重声明。函数

      同一个文件中只能将同一个头文件包含一次,可使用如下的防御方案。基于预处理器编译命令#ifndef,能够在没有使用#define定义某个特定名称时,处理#ifndef和#endif之间的语句。但这种方法并不能防止编译器将文件包含两次,而只是让他忽略除第一次外的全部内容。spa

    2. 源代码文件:包含与结构相关的函数的代码操作系统

    3. 源代码文件:包含调用与结构相关的函数的代码线程

  2. C++标准容许每一个编译器以他认为合适的方式实现名称修饰,所以不一样编译器建立的对象代码文件极可能没法正确的链接。请确保全部对象文件都是由同一个编译器生成的。对象

  3. C++的存储连续性:自动存储连续性、静态存储连续性、线程存储连续性、动态存储连续性内存

  4. 在C++11中,关键字auto用于自动类型判断,但在C语言和之前的C++版本中,auto的含义大相径庭,它被用于显式指出变量为自动存储。在C++11中,这种用法再也不合法。作用域

  5. 在C++11前,关键字register用于建议编译器使用CPU寄存器来存储自动变量。在C++11中,关键字register这种提示做用失去,只用于显式指出变量是自动的。开发

  6. 5种变量的储存方式

    存储描述 持续性 做用域 连接性 如何声明
    自动 自动 代码块 在代码块中
    寄存器 自动 代码块 在代码块中,使用关键字register
    静态,无连接性 静态 代码块 在代码块中,使用关键字static
    静态,内部连接性 静态 文件 内部 不在任何函数内,使用关键字sattic
    静态,外部连接性 静态 文件 外部 不在任何函数内
  7. 若是在多个文件中使用外部变量,只需在一个文件中包含该变量的定义,但在使用该变量的其它全部文件中,都必须使用关键字extern声明它。

  8. 在默认状况下全局变量的连接性为外部的,但const所有变量的连接性为内部的。若是但愿某个常量的连接性为外部的,则可使用extern关键字来覆盖默认的内部连接性。

  9. 可使用static关键字将函数的连接性设置为内部的,即只能在一个文件内使用,但必须同时在原型和函数定义中使用该关键字。

  10. 内联函数不受单定义规则的约束,但要求同一个函数的全部内联定义都必须相同。

  11. 若是要在C++程序中使用C库中编译的函数能够用函数原型来指定要使用的约定:

    1. extern 'C' 函数定义:使用C语言连接性

    2. extern 函数定义:使用默认方式——C++

    3. extern 'C++' 函数定义:使用C++语言连接性

  12. 在程序结束时,由new分配的内存一般都会被释放,但在一些不健壮的操做系统中,可能不会被释放,最佳的作法是使用delete来释放new分配的内存。

  13. 若是要为内置的标量的类型、有合适构造函数的类分配空间并初始化,可在类型后面加上初始值,并用括号括起。在C++11中,要初始化常规结构或数组,须要使用大括号的列表初始化。

  14. 定位new运算符讷讷够让程序员指定要使用的位置,程序员可能使用这种特性来设置七内存管理规程、处理须要经过特定地址进行访问的硬件或在特定位置建立对象。

  15. 名称空间能够是全局的,也能够位于另外一个名称空间中,但不能位于代码块中。

  16. using声明使一个名称可用,而using编译命令使全部的名称可用。

  17. 若是使用using编译指令将该名称空间的名称导入该声明区域,则局部的版本将隐藏名称空间版本。

  18. using编译指令是可传递的,若是A op B 且 B op C,则A op C,则说操做op是可传递的。

  19. 能够给名称空间建立别名:namespace xxx=另外一个名称空间。

  20. 省略了名称空间的名称来建立未命名的名称空间,则提供了连接性为内部的静态变量的替代品。

  21. 名称空间的指导原则:

    1. 使用已命名的名称空间声明的变量,而不是使用外部全局变量或静态全局变量。

    2. 若是开发了一个函数库或类库,将其放在一个名称空间中。

    3. 仅将编译指令using做为一种将就代码转换为使用名称空间的权宜之计。

    4. 不要在头文件中使用using编译指令,若是非要使用,应将其放在全部预处理编译指令#include后

    5. 导入名称时,首先选用做用域解析符或using声明的方法。

    6. 对于using声明,首选将其做用域设置为局部,而不是全局。

相关文章
相关标签/搜索