- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 程序结构
16.1对象的作用域与可见性
作用域是指标识符的作用范围或有效范围,可见性是从对标识符引用的角度来谈的概念,若标识符在某处可见,则就可以在该处引用该标识符。这里所说的标识符主要是指变量名或者对象名。
16.1.1 对象的作用域
例子
#include iostream.h
int id01=3;
void main()
{
int id=5;
{
int id;
id=7;
cout id= id endl; //输出7
}
cout id= id endl; //输出5
cout id01 endl; //输出3
}
1.函数原形的作用域
函数原形的作用域是指函数原型中标识符形参的作用范围,其作用域始于函数原形的左括号“(”,结束于函数原形声明的右括号“)”。
例如,设有下列原型声明:
double Area(double radius);
等价形式: double Area(double);
radius的作用域仅在函数的左右括号之间,不能用于程序正文其它地方,因而radius参数可有可无,省略它,也不会影响程序的编译效果,但是,考虑到可读性,还是在函数原形中给出形参说明比较好。
需要说明的是,这里函数原形的作用域是针对函数声明中的对象形参而言的,而不是指函数实现中的对象形参。
2.块作用域
块作用域是指在块中声明的标识符,其作用域自声明处起,一直到块结束为止。由于该作用域的范围具有局部性,所以有些文献也把它叫作局部作用域。
例如:
#includeiostream.h
void fun(int x) //x的作用域从此处开始
{ int y=x; //y的作用域从此处开始
ciny;
if (y0)
{
int z; //z的作用域从此处开始
z=x+y;
} //z的作用域到此处结束
} //x和y的作用域到此处结束
这里,y和z都具有块作用域,并且是不同的块作用域。所谓块是指用一对花括号“{”和“}”括起来的一段程序。在本例中,函数体是一个块,if语句后的分支部分又是一个较小的块,二者是包含的关系。
3.类作用域
类的作用域是指类的声明中一对花括号所形成的作用范围,简称类域。每一个类都具有该类的类域,该类的成员局部于该类所属的类域中
在类作用域之外,对类成员的访问一般是不允许的,或者要受特殊的规则的限制(如使用友元函数)。
在C++中,由于类成员的特殊访问规则,使得类成员的作用域变得比较复杂。具体地讲,某个类A某个成员M在下情况下具有类A的作用域:该成员M出现在该类的某个成员函数中,并且该成员函数没有定义同名标识符。该类A的某个对象的该成员M的表达式中。例如,是A的对象,在表达式.M中在该类A的某个指向对象指针的该成员M的表达式中。例如,pt一个指向A类对象的指针,在表达式p-M中。在使用作用域符所限定的该成员中。例如,在表达式A::M中。类域不同于文件域,在类域中定义的变量不能使用autoregister和extern等修饰符,只能用static修饰符,而定义的函数也不能用extern修饰符。另外,在类域中的静态成员和成员函数还具有外部的连接属性。一般说来,类域介于文件域和域之间,由于类域问题比较复杂,只能根据具体问题具体分析。
一般来说,在文件开始所定义的全局标识符就具有全局作用域,从这个意义上说文件作用域也叫全局作用域。不同位置定义的同名标识符有不同的作用域,要注意区别。
16.1.2对象的可见性
可见性是从对标识符的引用的角度来谈的概念,如果标识符在某处可见,则表示在该处可以引用该标识符。作用域指的是标识符的有效范围,而可见性是分析在某个位置标识符的有效性。
在作用域中,文件作用域最大,接着依次是类作用域和块作用域,作用域的一般关系见图6.1所示。可见性表示从内层作用域向外层作用域“看”时能看见什么,可见性和作用域之间有着紧密的联系。
图6.1 作用域关系图
作用域可见性的一般如下:
·标识符应声明在先,引用在后。
·在同一作用域中,不能声明同名的标识符。
·如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。
·对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。
例6.1 作用域与可见性示例。
#includeiostream
using namespace std;
int x; //定义全局变量,具有文件作用域
void main()
{ x=3; //给文件作用域的变量赋初值3
{ int x; //子块中定义局部变
文档评论(0)