C++Primer自己整理 第九章 内存模型和名称空间

上传人:公**** 文档编号:409716859 上传时间:2023-05-19 格式:DOCX 页数:4 大小:14.54KB
返回 下载 相关 举报
C++Primer自己整理 第九章 内存模型和名称空间_第1页
第1页 / 共4页
C++Primer自己整理 第九章 内存模型和名称空间_第2页
第2页 / 共4页
C++Primer自己整理 第九章 内存模型和名称空间_第3页
第3页 / 共4页
C++Primer自己整理 第九章 内存模型和名称空间_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《C++Primer自己整理 第九章 内存模型和名称空间》由会员分享,可在线阅读,更多相关《C++Primer自己整理 第九章 内存模型和名称空间(4页珍藏版)》请在金锄头文库上搜索。

1、第九章内存模型和名称空间1、单独编译头文件经常包含的内容(1) 函数原型(2) 使用#define或const定义的符号常量(3) 结构声明(4) 类声明(5) 模板声明(6) 内联函数如果文件名包含在尖括号中,则C+编译器将在存储标准头文件的主机系统的文件系 统中查找。但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目 录。2、存储持续性、作用域和链接性自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。 在程序开始执行其所属函数或代码块时被创建,执行完函数或代码块时,它们使用的内存被 释放。静态存储持续性:在函数外定义的变量和使用关键字stati

2、c定义的变量的存储性都为 静态。它们在程序整个运行过程中都存在。线程存储持续性:如果变量是用threadocal声明的,则其声明周期与所属的线程一 样长。动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将 其释放或程序结束为止。这种内存的存储持续性为动态,有时称为自由存储或堆。在函数原型作用域中使用的名称只在包含参数列表的括号内可用(这就是为什么这些 名称是什么以及是否出现都不重要的原因)。在类中声明的成员的作用域为整个类。 int main()int teledeli = 5;int teledeli = 5;这样有两个同名的变量(一个位于代码块中,另一个位于内

3、部代码块中)。这样,会将 teledeli解释为局部代码块变量。我们说,新的定义隐藏了以前的定义。新定义可见,旧定 义暂时不可见。自动变量和栈程序使用两个指针来跟踪栈,一个指针指向栈底一一栈的开始位置,另一个指针指向堆 顶一一下一个可用内存单元。当函数被调用时,其自动变量将被加入到栈中,栈顶指针指向 变量后面的下一个可用内存单元。函数结束时,栈顶指针被重置为函数被调用前的值,从而 释放新变量使用的内存。新值没有被删除,但不再被标记。它所占据的空间将被下一个将值加入到栈中的函数调 用所使用。3、静态持续性,外部链接性C+为静态存储持续性变量提供了 3种链接性:外部链接性(可在其他文件中访问) 内

4、部链接性(只能在当前文件中访问)和无链接性(只能在当前函数或代码块中访问)。链接性为外部的静态持续变量要想创建链接性为外部的静态持续变量,必须在代码块外部声明它;要创建链接性为内 部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;要创建没有链接性 的静态持续变量,必须在代码块内声明它,并使用static限定符。外部变量时在函数外部定义的,因此对所有函数而言它都是外部的。例如:可以在main() 函数或头文件定义它们,可以在文件中位于外部变量定义后面的任何函数中使用它,因此外 部变量也称全局变量。在每个使用外部变量的文件中,都必须声明它。另一方面,C+有单定义规则,变量 只能

5、有一次定义。C+提供了两种变量声明,一种是定义声明,或简称为定义。它给变量分 配存储空间。另一个种是引用声明,或简称为声明,它不给变量分配存储空间。因为它引用 已有的变量。引用声明使用关键字extern,且不进行初始化;否则,声明为定义。double up; /definition, up is 0extern int blem; /blem defined somewhere elseextern char gr = s /definition because initialized定义与全局变量同名的局部变量后,局部变量将隐藏全局变量。链接性为内部的静态持续变量如果初始化了静态局部变量,则

6、程序只在启动时进行一次初始化。以后再调用函数时, 将不会像自动变量那样再次被初始化。关键字volatile。即使程序代码没有对内存单元进行修改,其值也可能发生变化。 可以将一个指针指向某个硬件位置,其中包含了来自串行端口的时间或信息,这种情况 下,硬件(而不是程序)可能修改其中的内容。或两个程序可能互相影响,共享数据。 const关键字const全局变量的链接性为内部的。也就是说,在C+看来,全局const定义(如下述代 码所示)就像使用了 static说明符一样。const int fingers = 10; /same as static const int fingers = 10int

7、 main()如果希望某个常量的链接性为外部的,可以使用extern关键字来覆盖默认的内部链接性 extern const int states = 59; /definition with external linkage4、函数的链接性所有函数的存储性都自动为静态的,即在整个程序执行期间都一直存在。在默认情况下,函数的链接性为外部的,即可以在文件间共享。还可以使用关键字static将函数的链接性设置为内部的,使之只能在一个文件中,必 须同时在原型和函数定义中使用该关键字。这意味着该函数只在文件中可见,还意味着可以在其他文件中定义同名的函数。和变量一样,在定义静态函数的文件中,静态函数将覆盖

8、外部定义,因此即使在外部 定义了同名的函数,该文件仍将使用静态函数。内联函数不受这项规则约束,这允许程序员能够将内联函数的定义放在头文件中。这 样包含了头文件的每个文件都有内联函数的定义。然而,C+要求同一个函数的所有内联定 义都必须相同。4、定位new运算符它让您能够指定要使用的位置。 delete只能用于这样的指针:指向常规new运算符分配的堆内存。定位new运算符只返回传递给它的地址,并将其强制转换为void*,以便能够赋给任 何指针类型。 C+允许程序员重载定位new函数。5、名称空间名称空间可以是全局的,也可以位于另一个名称空间中,但不能位于代码块中。因此, 默认情况下,在名称空间中

9、声明的名称的链接性为外部的(除非它引用了常量)。 using 声明using声明由被限定的名称和它前面的关键字using组成例如:using std:cin; using编译指令using编译指令由名称空间名和它前面的关键字using namespace组成。using声明使一个名称可用,using编译指令使空间中的所有的名称都可用。编译器不允许同时使用两个或两个以上using声明,因为这将导致二义性。如果使用using编译指令导入一个已经在函数中声明的名称,则局部名称将隐藏名称 空间名,就像隐藏同名的全局变量一样。不过仍可以使用作用域解析运算符使用空间名。注意:假设名称空间和声明区域定义了相

10、同的名称,如果试图使用using声明将名称 空间的名称导入该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指 令将该名称空间的名称导入该声明区域,则局部版本将隐藏名称空间版本。可以将名称空间声明进行嵌套namespace elementsnamespace fireint flame;float water;这里flame指的是elements:fire:flame,同样,可以使用下面的using编译指令使内部的 名称可用,using spacename elements:fire;在名称空间中声明的函数名的作用域为整个名称空间,因此定义和声明必须位于同一 个名称空间中。

11、using声明只使用了名称(对函数),因此,如果函数被重载,则一个using声明将导 入所有的版本。一些使用原则:(1) 使用在已命名的名称空间中声明的变量,而不是使用外部全局变量、静态全局变 量。(2) 如果开发了一个函数库或类库,将其放在一个名称空间中。(3) 仅将编译指令using作为一种旧代码转换为使用名称空间的权宜之计。(4) 不要在头文件中使用using编译指令。首先这样做掩盖了要让哪些名称可用;另 外,包含头文件的顺序可能影响程序的行为。如果非要使用编译指令using,应将其放在所 有预处理器编译指令#include之后。(5)导入名称时,首选使用作用域解析运算符或using声明

12、的方法。(6)对于using声明,首选将其作用域设置为局部而不是全局。6、总结开发程序时使用多个文件,一种有效的组织策略是:使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型。将函数定义放在一个独立的源代码文件中。最后,将main()和其他使用这些函数的函数放在第三个文件中。C+存储方案决定了变量保存在内存中的时间(存储持续性)以及程序哪一部分可以 访问它(作用域和链接性)。(1)自动变量在代码块(如函数体或函数体中的代码块)中定义的变量。仅当程序执 行到包含定义的代码块时,它们才存在,并且可见。自动变量可以通过使用存储类型说明符 register或根本不使用说明符来声明。没有使用说明

13、符,变量默认为自动的。register说明符 提示编译器,该变量的使用频率很高。(C+11摒弃了这种用法)(2)静态变量在整个程序执行期间都存在。对于在函数外面定义的变量,其所属文件 中位于该变量的定义后面的所有函数都可以使用它(文件作用域),并可在程序的其它文件 中使用(外部链接性)。另一个文件要使用这种变量,必须使用extern关键字声明它。对于文件间共享的变量,应在一个文件中包含其定义声明(无需使用extern,但如果同 时进行初始化,也可以使用它)。并在其他文件中包含引用声明(使用extern且不初始化)。 在函数外面使用关键字static定义的变量的作用域为整个文件,但是不能用于其他文件(内 部链接性)。在代码块中使用关键字static定义的变量被限制在该代码块内(局部作用域、 无链接性)。但在整个程序执行期间,它都一直存在并且保持原值。名称空间允许定义一个可在其中声明标识符的命名区域。使用作用域解析运算符、 using声明和using编译指令来使名称空间中的标识符可用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号