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

你说的曾经没有我的故事 提交于 2020-03-02 03:24:14
  1.  程序分成三部分:

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

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

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

    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声明,首选将其作用域设置为局部,而不是全局。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!