Part5 数据的共享与保护 5.1标识符的作用域与可见性 5.2对象的生存期
5.1标识符的作用域与可见性
作用域是一个标识符在程序正文中有效的区域。
作用域分类:(由小到大)
1 函数原型作用域(从形参表的左括号到形参表的右括号)
如:double area(double radius);
2 局部作用域(块作用域)
如:void fun(int a) { int b = a; cin >> b; if (b > 0) { int c; ...... } }
3 类作用域
类的成员具有类作用域,其范围包括类体和非内联成员函数的函数体。
如果在类作用域以外访问类的成员,要通过类名(访问静态成员),或者该类的对象名、对象引用、对象指针(访问非静态成员)。
4 文件作用域
5 命名空间作用域(详见第10章)
//5_1.cpp #include using namespace std; int i; //全局变量,文件作用域 int main() { i = 5; //为全局变量i赋值 { int i; //局部变量,局部作用域 i = 7; cout << "i = " << i << endl;//输出7 } cout << “i = ” << i << endl;//输出5 return 0; }
5.2对象的生存期
对象从产生到结束的这段时间就是它的生存期。
在对象生存期内,对象将保持它的值,直到被更新为止。
静态生存期:
1 这种生存期与程序的运行期相同。
2 在文件作用域中声明的对象具有这种生存期。
3 在函数内部声明静态生存期对象,要冠以关键字static 。
动态生存期:
1 块作用域中声明的,没有用static修饰的对象是动态生存期的对象(习惯称局部生存期对象)。
2 开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。
//5-2变量的生存期与可见性 #include<iostream> using namespace std; int i = 1;//i为全局变量,且有静态生存期 void other(){ static int a = 2;//a,b为静态局部变量,有全局寿命,局部可见。 static int b; int c = 10;//c为局部变量,具有动态生存期,每次进入函数时都初始化。 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; 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; }