1、标识符的作用域与可见性
作用域的分类有:
1)函数原型作用域
double area(double radius); //radius的作用域仅在于这,不能用于程序其他地方
2)局部作用域(块作用域)
a.函数的形参、块中声明的标识符;
b.作用域自声明处起,限与块中;
eg:局部作用域举例
局部作用域3)类作用域
a.类的成员具有类作用域
其范围包括类体和成员函数体
b.在类的作用域以外访问类的成员:
1、静态成员:通过类名,或者该类的对象名、对象引用访问。
2、非静态成员:通过类名,或者该类的对象名、对象引用、对象指针访问。
4)文件作用域
a.不在前述各个作用域中出现的声明,具有文件作用域;
b.其作用域开始于声明点,结束于文件尾。
5)命名空间作用域
可见性:
1)可见性是从对标识符的引用的角度来谈的;
2)可见性表示从内层作用域向外层作用域”看“时能看见什么;
3)如果标识在某处可见,就可以在此次引用此标识符;
4)如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见;
5)对于两个嵌套的作用域,如果内层作用域内声明了与外层作用域同名的标识符,则外层的作用域的标识符在内层不可见。
可见性eg:全局与局部
#include <iostream>
using namespace std;
int i; //全局变量,文件作用域
int main()
{
i = 5;
{
int i; //局部变量,局部作用域 i = 7;
cout << "i = " << i << endl;
}
cout << "i = " << i << endl;
return 0;
}
2、对象的生存期
1)静态生存期
a.生存期与程序的运行期相同;
b.在文件作用域中声明的对象具有静态生存期;
c.在函数内部声明静态生存期对象,关键字static。
2)动态生存期
a.开始于程序执行到声明点时,结束于命名该标识符的作用域结束处;
b.块作用域中声明的,没有用static修饰的对象是动态生存期的对象(局部生存期对象)
eg:静态和动态生存期例子
#include <iostream>
using namespace std;
int i; //i是全局变量,静态生存期
void other()
{
/* a,b为静态局部变量,具有全局寿命,局部可见,
第一次调用other函数进行初始化 */
static int a = 2;
static int b;
/* c为局部变量,具有动态生存期,
每次调用函数时都初始化 */
int c = 10;
a += 2;
i += 32;
c += 5;
cout << "---OTHER---\n";
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
b = a;
}
int main()
{
static int a; //静态局部变量,全局寿命,局部可见
int b = 10;
int c = 0; //b,c为局部变量,具有动态生存期
cout << "---MAIN---\n";
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
c += 8;
other();
cout << "---MAIN---\n";
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
i += 10;
other();
return 0;
}
网友评论