第5章 C++程序结构
时间:2026-01-17
时间:2026-01-17
第5章 C++程序的结构 章 程序的结构
本章主要内容作用域与可见性 对象的生存期 数据与函数 静态成员 共享数据的保护 友元 编译预处理命令 多文件结构和工程
5.1 标识符的作用域与可见性5.1.1 函数原型的作用域 函数原型中的参数, 函数原型中的参数,其作用域始于 "(",结束于 。 ,结束于")"。 例如,设有下列原型声明: 例如,设有下列原型声明:double Area(double radius);
radius 的作用域仅在于此,不 能用于程序正文其它地方,因 而可有可无。
块作用域在块中声明的标识符, 在块中声明的标识符,其作用域自声明处 限于块中,例如: 起,限于块中,例如: void fun(int a) { int b(a); cin>>b; b的作用域 if (b>0) { c的作用域 int c; ...... } }
类作用域类作用域作用于特定的成员名。 类作用域作用于特定的成员名。 的成员M具有类作用域 类X的成员 具有类作用域,对M的访问 的成员 具有类作用域, 的访问 方式如下: 方式如下:如果在X的成员函数中没有声明同名的局部 如果在 的成员函数中没有声明同名的局部 作用域标识符,那么在该函数内可以访问成 作用域标识符, 员M。 。 通过表达式x.M或者 或者X::M访问。 访问。 通过表达式 或者 访问 通过表达式prt->M 通过表达式
文件作用域不在前述各个作用域中出现的声明, 不在前述各个作用域中出现的声明,具有 文件作用域, 文件作用域,这样声明的标识符的作用域 开始于声明点,结束于文件尾。 开始于声明点,结束于文件尾。
5.1.2 可见性可见性是从对标识符的引用的角度来谈 的概念 可见性表示从内层作用域向外层作用域 时能看见什么。 “看”时能看见什么。 如果标识在某处可见, 如果标识在某处可见,则就可以在该处 引用此标识符。 引用此标识符。文件作用域 类作用域 块作用域
5.1.2 作用域可见性的规则标识符应声明在先,引用在后。 标识符应声明在先,引用在后。 在同一作用域中, 在同一作用域中,不能声明同名的标识符 在没有互相包含关系的不同的作用域中声 明的同名标识符,互不影响。 明的同名标识符,互不影响。 对于两个嵌套的作用域, 对于两个嵌套的作用域,如果在内层作用 域内声明了与外层作用域中同名的标识符, 域内声明了与外层作用域中同名的标识符, 则外层作用域的标识符在内层不可见。 则外层作用域的标识符在内层不可见。
同一作用域中的同名标识符在同一作用域内的对象名、函数名、 在同一作用域内的对象名、函数名、枚举 常量名会隐藏同名的类名或枚举类型名。 常量名会隐藏同名的类名或枚举类型名。 重载的函数可以有相同的函
数名。 重载的函数可以有相同的函数名。
例 5.1#include<iostream> using namespace std; int i; //文件作用域 文件作用域 int main() { i=5; { int i; //块作用域 块作用域 i=7; cout<<"i="<<i<<endl; //输出 输出7 输出 } cout<<"i="<<i; //输出 输出5 输出 return 0; }
5.2 对象的生存期
对象从产生到结束的这段时间就是它的 生存期。在对象生存期内,对象将保持它的 生存期。在对象生存期内, 值,直到被更新为止。 直到被更新为止。
5.2.1 静态生存期这种生存期与程序的运行期相同。 这种生存期与程序的运行期相同。 在文件作用域中声明的对象具有这种生存 期。 在函数内部声明静态生存期对象, 在函数内部声明静态生存期对象,要冠以 关键字static 。 关键字
#include<iostream> using namespace std; int i=5; //文件作用域 文件作用域 int main() { cout<<"i="<<i<<endl; return 0; } i具有静态生存期 具有静态生存期
5.2.2 动态生存期块作用域中声明的,没有用 块作用域中声明的,没有用static修是的对 修是的对 象是动态生存期的对象( 象是动态生存期的对象(习惯称局部生存 期对象)。 期对象)。 开始于程序执行到声明点时, 开始于程序执行到声明点时,结束于命名 该标识符的作用域结束处。 该标识符的作用域结束处。
#include<iostream> using namespace std; void fun(); int main() 运行结果: 运行结果: { fun(); i=6, a=2 fun(); } i=6, a=3 void fun() { static int a=1; i是动态生存期 是动态生存期 int i=5; a++; a是静态生存期 是静态生存期 i++; cout<<"i="<<i<<",a="<<a<<endl; }
例5-2 变量的生存期与可见性#include<iostream> using namespace std; int i=1; // i 为全局变量,具有静态生存期。 为全局变量,具有静态生存期。 int main() { static int a; // 静态局部变量,有全局寿命,局部可见。 静态局部变量,有全局寿命,局部可见。 int b=-10; // b, c为局部变量,具有动态生存期。 为局部变量, 为局部变量 具有动态生存期。 int c=0; void other(void); cout<<"---MAIN---\n"; cout<<" i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl; c=c+8; other(); cout<<"---MAIN---\n"; cout<<" i: "<<i<<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl; i=i+10; other(); }
…… 此处隐藏:383字,全部文档内容请下载后查看。喜欢就下载吧 ……