C++primer笔记————第七章

域和生命期
  1. C++程序中每一个名字都必须指向唯一的一个实体(对象、函数、类型或者模板)。
  2. 一个名字被重新使用以指向不同的实体,只要编译器能够根据上下文来区分出该名字的不同含义即可。
  3. 用来区分名字含义的一般上下文就是域。C++中含有三种域,局部域、名字空间域和类域。
  4. 局部域是定义在函数定义中的程序文本部分。每一个函数都有一个独立的局部域,在函数中每个复合语句也有一个独立的局部域。
  5. 名字空间域是不包含在函数声明、函数定义或者类定义的程序文本部分。
  6. 程序的最外层的名字空间域被称为全局域或者全局名字空间域。
  7. 同一个名字在不同的域中可以引用不同的实体。
  8. 由声明引入的名字从声明点直到声明它的类结束为止都是可见的(包含其中的嵌套域)
  9. 名字解析(name resolution)是把表达式中的一个名字和某一个声明相关联的过程。也是给出这个名字的意义的过程。这个过程依赖于该名字是如何被使用的。以及使用该名字的域。
  10. 局部域内的名字解析的过程:首先查找使用该名字的域,如果找到一个声明,则该名字被解析,如果没有找到,则查找包含该域的域,知道找到一个声明或者查找完整个全局域。
  11. 因为在名字解析期间查找域的顺序是由内向外的,因此在外围域中的声明被嵌套域中的同名声明所隐藏。
  12. 在if语句中定义的变量,之在该if语句和相关的else语句以及内部的嵌套域中可见。
  13. 全局域内的函数声明将引入全局函数。全局域内的变量声明将引入全局对象。全局对象是一个运行时刻实体,他的程序的整个执行周期内都存在。它所占据的存储区的生命期(lifetime)从程序启动开始,在程序终止时结束。
  14. 全局对象和非inline全局函数必须有一个定义并且只能被定义一次。或者多次完全相同的定义。这被称为一次定义法则(ODR,one definition rule)
  15. 函数声明指定了该函数的名字以及函数的返回类型和参数表。
  16. 函数定义除了函数声明所包含的信息外,还为函数提供了函数体。并且分配了内存。
  17. 在全局域中定义的对象,如果没有指定显示的初始值,则该存储区被初始化为0。(仅在debug版本下)
  18. 关键字extern 为声明但是不定义一个对象提供了一种方法。实际上,它类似于一种函数声明。表示该对象会在其他i地方被定义
  19. 类型安全连接机制:该机制可以将函数参数的类型和数目编码在函数名中。
  20. 类型安全链接机制为文件之间的函数调用提供了类型检查手段。它对支持重载函数也是必须的。
  21. 不同文件中出现的同一个对象或函数声明的其他类型不匹配的情况,在编译和链接时可能不会被捕捉到,因为编译器一次只能处理一个文件,它不能很容易的检查到文件之间的类型违例。这些类型违例可能是程序严重错误的根源。
  22. 文件之间错误的对象声明或者函数返回值类型不能被检测出来,这样的错误只有在运行时刻异常或程序的错误输出中才能被揭示出来。
  23. 头文件为所有的extern对象声明、函数声明和inline函数定义提供了一个集中的位置。这被称为声明的局部化。
  24. 头文件中不应该含有非inline函数或对象的定义。这些定义如果在同一个程序的两个或者多个文件中被包含, 便会产生重复定义错误。
  25. 符号常量和inline函数可以被多次定义。
  26. 常量折叠:在程序编译期间,在可能的情况下,符号常量的值会代替该名字出现。
  27. 局部对象的分类:自动对象(automatic object)、寄存器对象(register object)、局部静态对象(local static object)
  28. 自动对象所在存储区从声明它的函数调用开始,一直到该函数结束为止。
  29. 寄存器对象是一种自动对象,它支持对其值的快速读取。
  30. 局部静态对象的存储区在该程序的整个执行期间一直存在。
  31. 分配给自动变量的存储区来自于程序的运行栈。
  32. 自动对象也被成为具有自动存储持续时间或自动范围。
  33. 未初始化的自动对象包含一个随机的位模式,是该存储区上次被使用的结果。它的值被称为未指定的。
  34. 当一个自动变量的地址被存储在一个生命期长于它的指针时,该指针被称为空悬指针(dangling pointer)
  35. register声明:如果可能的话,register对象会被编译器装载到寄存器中。但是register对于编译器来说只是建议
  36. 静态局部对象具有静态存储持续期间(static storage duration) 或静态范围(static extent)虽然它的值在整个程序运行期间是有效的,但是其名字的可视性仍限制在其局部域内。
  37. static对象只会被初始化一次。
  38. new表达式不会返回世纪分配的对象,而是返回指向该对象的指针。
  39. 动态分配数组的好处是第一维不需要为常量值。
  40. 删除动态分配数组的内存:delete[] ss ,如果忘记方括号编译器无法检查到。
  41. 用户声明的名字空间域可以包含其他嵌套的名字空间定义。
  42. 命名空间的的定义可以是非连续的,并且是可以跨文本文件的。
  43. 外围命名空间声明的实体被嵌套的名字空间中声明的同名实体所隐藏。
  44. 名字空间中的实体被局部域中声明的实体所隐藏。
  45. 只有包围该成员声明的名字空间才可能包含它的定义。
  46. 只有当一个名字空间成员在名字空间定义中已经被声明过,它才能在该名字空间定义之外被定义。
  47. 作为名字空间成员的函数和对象的声明被放在头文件中,该文件将被包含在要使用该名字空间的文件中。
  48. 必须使用extern关键字来指明只是声明名字空间成员而不是定义它们。
  49. 一个命名空间可以有很多别名或者同义词。
  50. using指示符是域内的。
  51. using指示符引起的二义性错误是在该名字被使用时才被检测到,而不是遇到using指示符时。
文章目录
  1. 1. 域和生命期
,