.
(1) 若在X的成员函数中无同名的局部作用域标识符,则在该函数可访问成员m。
(2) 通过表达式x.m或X::m。这正是程序中访问对象成员的最基本方法。 (3) 通过prt->m这样的表达式,其中prt为指向X类的一个对象的指针。
4. 命名空间作用域 命名空间
大型程序通常由不同模块构成,不同模块中的类和函数之间可能发生重名,将引发错误。
命名空间可以解决类名、函数等的命名冲突。 命名空间语法形式: namespace 命名空间名{ 命名空间的各种声明(函数声明、类声明、……) } 例 namespace SomeNs { class SomeClass { ... }; } 特殊的命名空间 _ 全局命名空间:默认的命名空间
_ 匿名命名空间:对每个源文件是唯一的
命名空间作用域
一个命名空间确定了一个命名空间作用域 引用其它命名空间作用域中的标识符 _ 命名空间名::标识符名
_ 例:声明一个SomeClass型的对象
SomeNs::SomeClass obj1;
将其它命名空间作用域的标识符暴露于当前作用域 _ 对指定标识符
using 命名空间名::标识符名;
_ 对所有标识符
using namespace命名空间名;
例5-1中所声明的全局变量就具有文件作用域,它们在整个文件中都有效。
例5-1 作用域实例。
#include
.
int j;//在Ns命名空间中的全局变量 } void main() { i=5;//文件作用域的i赋初值 Ns::j=6;//为全局变量j赋值 {//子块1 using namespace Ns;//使得在当前块中可直接引用Ns命名空间的标识符 int i;//局部变量,块作用域 i=7; cout<<\//输出7 cout<<\ } cout<<\//输出5 } 参考(cout, endl是命名空间std中的全局变量): #include
.
} 具有文件作用域的变量也称为全局变量。 5.1.2 可见性P150
可见的标识符 程序运行到某一点,能够引用到的标识符。 文件作用域最大,接下来依次是类作用域和块作用域。
图5-1 作用域关系图
可见性表示从层作用域向外层作用域“看”时能看到什么。 作用域可见性的一般规则: _ 标识符声明在前,引用在后。
_ 同一作用域,不能声明同名标识符。
_ 在没有包含关系的不同作用域中声明的同名标识符互不影响。
_ 在具有包含关系的作用域中声明了同名标识符,则外层标识符在层不可见。
例5-l中,文件作用域与块作用域相互包含。
#include
int i;//全局变量,文件作用域 namespace Ns{
int j;//在Ns命名空间中的全局变量 }
void main(){ i=5;//文件作用域的i赋初值 Ns::j=6;//为全局变量j赋值 {//子块1 using namespace Ns; int i;//局部变量,块作用域 i=7; cout<<\//输出7 cout<<\ } cout<<\//输出5 }
在主函数子块1前,可引用到具有文件作用域的变量,它是可见的。 当进入子块1,只能引用到具有局部作用域的同名变量,文件作用域的同名变量不可见,称层屏蔽,或同名覆盖,即层的变量覆盖了外层的同名变量。
.
.
5.2 对象的生存期P150
对象(包括简单变量)从诞生到结束的这段时间就是它的生存期。
5.2.1 静态生存期
若对象的生存期与程序的运行期相同,称它具有静态生存期。 在文件作用域中声明的对象具有静态生存期的。
若要在函数部的块作用域中声明具有静态生存期的对象,则要使用关键字static。
static int i; i称为静态变量。
其余的对象都具有动态生存期。
定义时未指定初值的基本类型静态生存期变量,初值为0;动态生存期变量,不指定初值时值不确定。
5.2.2 动态生存期
在块作用域中声明的具有动态生存期的对象,称局部生存期对象。 动态生存期对象诞生于声明点,结束于该标识符作用域结束处。
例5-2 变量的生存期与可见性。
局部变量就是具有块作用域的变量。 全局变量就是具有文件作用域的变量。 #include
.
{ } static int a;//a为静态局部变量,具有全局寿命,局部可见 int b=-10;//b, c为局部变量,具有动态生存期 int c=0; cout<<\cout<<\ a:\ b:\ c:\c=c+8; other(); cout<<\cout<<\ a:\ b:\ c:\c=c+10; other(); 例5-3 具有静态、动态生存期对象的时钟程序。
声明具有函数原型作用域、块作用域、类作用域和文件作用域的多个变量及对象,并分析各自的可见性和生存期。 #include