- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章命名控制
下载
第9章 命 名 控 制
创建名字是编程中最基本的活动,当一个项目中包含大量名字时,名字很容易冲突。 C + +
允许我们对名字的产生和名字的可见性进行控制,包括名字的存储位置以及名字的连接。
s t a t i c这个关键字早在人们知道“重载”这个词之前就在 C语言中被重载了,在 C + + 中又增
加了新的含义。s t a t i c最基本的含义是指“位置不变的某个东西”(像“静电”),这里则指内存
中的物理位置或文件中的可见性。
在这一章里,我们将看到s t a t i c是怎样控制存储和可见的,还将看到一种通过 C + + 的名字空
间特征来控制访问名字的改进方法。我们还可以发现怎样使用C语言中编写并编译过的函数。
9.1 来自C语言中的静态成员
在C和C + + 中,s t a t i c都有两种基本的含义,并且这两种含义经常是互相有冲突的:
1) 在固定的地址上分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次
函数调用时在堆栈上产生的。这也是静态存储的概念。
2) 对一个特定的编译单位来说是本地的(就像我们在后面将要看到的,这在 C + + 中包括类
的范围)。这里s t a t i c控制名字的可见性,所以这个名字在这个单元或类之外是不可见的。这也
描述了连接的概念,它决定连接器将看到哪些名字。
本节将着重讨论s t a t i c的这两个含义,这些都是从C 中继承来的。
9.1.1 函数内部的静态变量
通常,在函数体内定义一个变量时,编译器使得每次函数调用时堆栈的指针向下移一个适
当的位置,为这些内部变量分配内存。如果这个变量有一个初始化表达式,那么每当程序运行
到此处,初始化就被执行。
然而,有时想在两次函数调用之间保留一个变量的值,我们可以通过定义一个全局变量来
实现这点,但这样一来,这个变量就不仅仅受这个函数的控制。 C和C + +都允许在函数内部创
建一个s t a t i c对象,这个对象将存储在程序的静态数据区中,而不是在堆栈中。这个对象只在
函数第一次调用时初始化一次,以后它将在两次函数之间保持它的值。比如,下面的函数每次
调用时都返回一个字符串中的下一个字符。
158 C + +编程思想
下载
static char* s在每次o n e c h a r ( )调用时保留它的值,因为它存放在程序的静态数据区而不是
存储在函数的堆栈中。当我们用一个字符指针作参数调用 o n e c h a r ( ) 时,参数值被赋给 s ,然后
返回字符串的第一个字符。以后每次调用 o n e c h a r ( )都不用带参数,函数将使用缺省参数 0作为
s t r i n g 的值,函数就会继续用以前初始化的 s值取字符,直到它到达字符串的结尾标志—空字
符为止。这时,字符指针就不会再增加了,这样,指针不会越过字符串的末尾。
但是,如果调用 o n e c h a r ( ) 时没有参数而且s 以前也没有初始化,那会怎样呢?我们也许会
在s定义时提供一个初始值:
static char* s=0 ;
但如果说没有为一个预定义类型的静态变量提供一个初始值的话,编译器也会确保在程序
开始时它被初始化为零(转化为适当的类型),所以在o n e c h a r ( ) 中,函数第一次调用时s将被赋
值为零,这样i f ( ! s )后面的程序就会被执行。
上例中s 的初始化是很简单的,其实对一个静态对象的初始化(与其他对象的初始化一样)
可以是任意的常量表达式,它可以包括常量及在此之前已声明过的变量和函数。
1. 函数体内部的静态对象
用户自定义的静态变量同一般的静态对象的规则是一样的,而且它同样也必须有初始化操作。
但是,零赋值只对预定义类型有效,用户自定义类型必须用构造函数来初始化。因此,如果我们
在定义一个静态对象时没有指定构造函数参数,这个类就必须有缺省的构造函数。请看下例:
第9章 命 名 控 制 159
下载
在函数f ( ) 内部定义一个静态的X类型的对象,它可以用带参数的构造函数来初始化,也可以用
缺省构造函数。程序控制第一次转到对象
您可能关注的文档
最近下载
- 华为云平台运维复习试题附答案.doc
- 2022-2023学年湖北省荆州市荆州区八年级(下)期末物理试卷(含解析).pdf VIP
- 十年(2013-2023年)高考生物真题分项汇编专题解析版合集共20套.doc
- 矫健:天局(胜天半子!).pdf
- (完整版)高中英语3500单词表含音标.pdf
- 150吨履带吊性能表(参考)1.doc VIP
- 湖北省荆州市荆州区2022-2023学年八年级下学期期末考试数学试卷(含答案).pdf VIP
- 人教版(新教材)高中英语选修2Unit4Journey Across a Vast Land精品学案:Writing—An email about a journey.docx
- 2012-2021十年高考生物真题(含解析)共92套.docx
- 2023年湖南师范大学附属小学教师招聘考试真题及答案.docx
文档评论(0)