C++语言程序设计 第五章C++程序的结构 清华大学郑莉
第五章 C++程序的结构 清华大学 郑 莉 C++语言程序设计
C++语言程序设计 清华大学郑莉 本拿主要内容 ●作用域与可见性 ·对象的生存期 ● 数据与函数 ● 静态成员 。共享数据的保护 ●友元 ● 编译预处理命令 多文件结构和工程 ·深度探索
C++语言程序设计 清华大学 郑莉 2 本章主要内容 ⚫ 作用域与可见性 ⚫ 对象的生存期 ⚫ 数据与函数 ⚫ 静态成员 ⚫ 共享数据的保护 ⚫ 友元 ⚫ 编译预处理命令 ⚫ 多文件结构和工程 ⚫ 深度探索
C++语言程序设计 清华大学郑莉 函数原形的作用域 作 用 ● 函数原型中的参数,其作用域始于 域 ”(”,结束于)”。 与 ·例如,设有下列原型声明: 可 double area(double radius); 见 性 radius的作用域仅在于此, 不能用于程序正文其他地方, 因而可有可无
C++语言程序设计 清华大学 郑莉 3 函数原形的作用域 ⚫ 函数原型中的参数,其作用域始于 "(",结束于")"。 ⚫ 例如,设有下列原型声明: double area(double radius); radius 的作用域仅在于此, 不能用于程序正文其他地方, 因而可有可无。 作 用 域 与 可 见 性
C++语言程序设计 清华大学郑莉 局部作用域 作 用 ● 函数的形参,在块中声明的标识符,其作 用域自声明处起,限于块中,例如: 域 void fun(int a){ 与 int b a; a的作用域 可 cin >b; 见 if (b >0) int c; 性 c的作用域 b的作用域 □
C++语言程序设计 清华大学 郑莉 4 局部作用域 ⚫ 函数的形参,在块中声明的标识符,其作 用域自声明处起,限于块中,例如: void fun(int a) { int b = a; cin >> b; if (b > 0) { int c; ...... } } c的作用域 b的作用域 作 用 域 与 可 见 性 a的作用域
C叶+语言程序设计 清华大学郑莉 类作用域 作 用 ● 类作用域作用于特定的成员名。 域 ●类x的成员m具有类作用域,对血的访问方式 与 如下: 可 如果在X的成员函数中没有声明同名的局部作用 见 域标识符,那么在该函数内可以访问成员m: 性 通过表达式x.m或者X:m访问。 通过表达式ptr->M a
C++语言程序设计 清华大学 郑莉 5 类作用域 ⚫ 类作用域作用于特定的成员名。 ⚫ 类X的成员m具有类作用域,对m的访问方式 如下: –如果在X的成员函数中没有声明同名的局部作用 域标识符,那么在该函数内可以访问成员m。 –通过表达式x.m或者X::m访问。 –通过表达式ptr->M 作 用 域 与 可 见 性
C++语言程序设计 清华大学郑莉 命名空间 作 用 ·命名空间可以解决类名、函数名等的命名冲突 域 ● 命名空间的声明 namespace命名空间名{ 与 各种声明(函数声明、类声明、…) 可 。例 见 namespace SomeNs 性 class Someclass {...} ● 特殊的命名空间 全局命名空间:默认的命名空间 匿名命名空间:对每个源文件是唯一的
C++语言程序设计 清华大学 郑莉 6 命名空间 ⚫ 命名空间可以解决类名、函数名等的命名冲突 ⚫ 命名空间的声明 namespace 命名空间名 { 各种声明(函数声明、类声明、……) } ⚫ 例 namespace SomeNs { class SomeClass { ... }; } ⚫ 特殊的命名空间 – 全局命名空间:默认的命名空间 – 匿名命名空间:对每个源文件是唯一的 作 用 域 与 可 见 性
C++语言程序设计 清华大学郑莉 命名空间作用域 作 用 ·一个命名空间确定了一个命名空间作用域 域 引用其它命名空间作用域中的标识符 命名空间名:标识符名 与 例:声明一个SomeClass型的对象 可 SomeNs:SomeClass objl; 将其它命名空间作用域的标识符暴露于当前 见 作用域 性 对指定标识符 。using命名空间名:标识符名; 对所有标识符 ●using namespace命名空间名;
C++语言程序设计 清华大学 郑莉 命名空间作用域 ⚫ 一个命名空间确定了一个命名空间作用域 ⚫ 引用其它命名空间作用域中的标识符 – 命名空间名::标识符名 – 例:声明一个SomeClass型的对象 ⚫ SomeNs::SomeClass obj1; ⚫ 将其它命名空间作用域的标识符暴露于当前 作用域 – 对指定标识符 ⚫ using 命名空间名::标识符名; – 对所有标识符 ⚫ using namespace命名空间名; 7 作 用 域 与 可 见 性
C+语言程序设计 清华大学郑莉 可见性 作 ● 可见性是从对标识符的引用的角度来谈 用 的概念 域 与 ·可见性表示从内层作用域向外层作用域 “看”时能看见什么。 可 见 如果标识在某处可见,则就可以在该处 性 引用此标识符 名空间作用域 类作用域 块作用域
C++语言程序设计 清华大学 郑莉 8 可见性 ⚫ 可见性是从对标识符的引用的角度来谈 的概念 ⚫ 可见性表示从内层作用域向外层作用域 “看”时能看见什么。 ⚫ 如果标识在某处可见,则就可以在该处 引用此标识符。 块作用域 类作用域 命名空间作用域 作 用 域 与 可 见 性
C++语言程序设计 清华大学郑莉 可见性 作 用·标识符应声明在先,引用在后。 域。如果某个标识符在外层中声明,且在内层中 与 没有同一标识符的声明,则该标识符在内层 可 可见。 见。对于两个嵌套的作用域,如果在内层作用域 内声明了与外层作用域中同名的标识符,则 外层作用域的标识符在内层不可见
C++语言程序设计 清华大学 郑莉 9 可见性 ⚫ 标识符应声明在先,引用在后。 ⚫ 如果某个标识符在外层中声明,且在内层中 没有同一标识符的声明,则该标识符在内层 可见。 ⚫ 对于两个嵌套的作用域,如果在内层作用域 内声明了与外层作用域中同名的标识符,则 外层作用域的标识符在内层不可见。 作 用 域 与 可 见 性
C++语言程序设计 清华大学郑莉 同一作用域中的同名标识符 作 用 ·在同一作用域内的对象名、函数名、 域 枚举常量名会隐藏同名的类名或枚举 与 类型名。 可 ●重载的函数可以有相同的函数名。 见 性 10
C++语言程序设计 清华大学 郑莉 10 同一作用域中的同名标识符 ⚫ 在同一作用域内的对象名、函数名、 枚举常量名会隐藏同名的类名或枚举 类型名。 ⚫ 重载的函数可以有相同的函数名。 作 用 域 与 可 见 性