《c++语言程序设计(郑莉第四版)课件5》由会员分享,可在线阅读,更多相关《c++语言程序设计(郑莉第四版)课件5(73页珍藏版)》请在金锄头文库上搜索。
1、第五章 C+程序的结构清华大学 郑 莉C+语言程序设计C+语言程序设计清华大学 郑莉2本章主要内容l作用域与可见性 l对象的生存期 l数据与函数 l静态成员 l共享数据的保护 l友元 l编译预处理命令 l多文件结构和工程 l深度探索C+语言程序设计清华大学 郑莉3函数原形的作用域l函数原型中的参数,其作用域始于 “(“,结束于“)“。l例如,设有下列原型声明: double area(double radius);radius 的作用域仅在于此 ,不能用于程序正文其他地 方,因而可有可无。作用域与可见性C+语言程序设计清华大学 郑莉4局部作用域l函数的形参,在块中声明的标识符,其作 用域自声明
2、处起,限于块中,例如: void fun(int a) int b = a;cin b;if (b 0) int c;. c的作用域b的作用域作用域与可见性a的作用域C+语言程序设计清华大学 郑莉5类作用域l类作用域作用于特定的成员名。l类X的成员m具有类作用域,对m的访问方式 如下: 如果在X的成员函数中没有声明同名的局部作用 域标识符,那么在该函数内可以访问成员m。通过表达式x.m或者X:m访问。通过表达式ptr-M作用域与可见性C+语言程序设计清华大学 郑莉6命名空间l命名空间可以解决类名、函数名等的命名冲突l命名空间的声明 namespace 命名空间名 各种声明(函数声明、类声明、)
3、 l例 namespace SomeNs class SomeClass . ; l特殊的命名空间 全局命名空间:默认的命名空间 匿名命名空间:对每个源文件是唯一的 具有命名空间作用域的变量也称为全局变量作用域与可见性C+语言程序设计清华大学 郑莉 命名空间作用域l一个命名空间确定了一个命名空间作用域 l引用其它命名空间作用域中的标识符 命名空间名:标识符名 例:声明一个SomeClass型的对象lSomeNs:SomeClass obj1; l将其它命名空间作用域的标识符暴露于当前 作用域 对指定标识符lusing 命名空间名:标识符名; 对所有标识符lusing namespace命名空间
4、名;lC+中标准程序库的所有标识符都被声明在std命名空 间中lUsing namespace std;lStd:cin,std:cout,std:endl;7作用域与可见性C+语言程序设计清华大学 郑莉命名空间作用域l在包含多个源文件的工程中,把命名空间常 常用来屏蔽不希望暴露给其他源文件的标识 符,这是因为每个源文件的匿名命名空间是 彼此不同的,在一个源文件中没有办法访问 其他源文件的匿名命名空间。l例 5-18作用域与可见性C+语言程序设计清华大学 郑莉9可见性l可见性是从对标识符的引用的角度来谈 的概念l可见性表示从内层作用域向外层作用域“ 看”时能看见什么。l如果标识在某处可见,则就
5、可以在该处 引用此标识符。块作用域类作用域命名空间作用域作用域与可见性C+语言程序设计清华大学 郑莉10可见性l标识符应声明在先,引用在后。l如果某个标识符在外层中声明,且在内层中 没有同一标识符的声明,则该标识符在内层 可见。l对于两个嵌套的作用域,如果在内层作用域 内声明了与外层作用域中同名的标识符,则 外层作用域的标识符在内层不可见。(同名 隐藏原则)作用域与可见性C+语言程序设计清华大学 郑莉11同一作用域中的同名标识符l在同一作用域内的对象名、函数名、 枚举常量名会隐藏同名的类名或枚举 类型名。(同名隐藏原则)l重载的函数可以有相同的函数名。作用域与可见性C+语言程序设计清华大学 郑
6、莉12#include using namespace std; int i;/在全局命名空间中的全局变量 namespace Ns int j;/在Ns命名空间中的全局变量 int main() i = 5;/为全局变量i赋值 Ns:j = 6;/为全局变量j赋值 /子块1 using namespace Ns; /当前块中可以直接引用Ns中的标识符 int i;/局部变量,局部作用域 i = 7; cout using namespace std; int i = 5; /命名空间作用域 int main() cout using namespace std; void fun(); in
7、t main() fun();fun(); void fun() static int a=1;int i=5;a+;i+;cout using namespace std; int i = 1; / i 为全局变量,具有静态生存期。 void other() static int a = 2;static int b;/ a,b为静态局部变量,具有全局寿命,局部可见。/只第一次进入函数时被初始化。int c = 10; / C为局部变量,具有动态生存期,/每次进入函数时都初始化。a += 2; i += 32; c += 5;cout using namespace std; class C
8、lock /时钟类定义 public:/外部接口 Clock(); void setTime(int newH, int newM, int newS); /三个形参均具有函数原型作用域 void showTime(); private:/私有数据成员 int hour, minute, second; ;对象的生存期Clock:Clock() : hour(0), minute(0), second(0) /构造函数void Clock:setTime(int newH, int newM, int newS) /三个形参均具有局部作用域 hour = newH; minute = newM
9、; second = newS; void Clock:showTime() cout using namespace std; int global; void f() global=5; void g() cout using namespace std; class Application public:void f();void g();private:int global; ;void Application:f() global = 5;void Application:g() cout using namespace std; class Point public: Point(
10、int x=0, int y=0) : x(x), y(y) count+; Point(Point int getX() return x; int getY() return y; void showCount() cout using namespace std; class Application public:static void f(); static void g(); private:static int global; ; int Application:global=0;void Application:f() global=5; void Application:g()
11、 cout using namespace std;class Point /Point类定义 public:/外部接口 Point(int x = 0, int y = 0) : x(x), y(y) count+; Point(Point Point() count-; int getX() return x; int getY() return y; static void showCount() /静态函数成员cout #include class Point /Point类声明 public:/外部接口 Point(int x=0, int y=0) : x(x), y(y) int
12、 getX() return x; int getY() return y; friend float dist(Point private:/私有数据成员 int x, y; ;友 元float dist( Pointdouble y = a.y - b.y;return static_cast(sqrt(x * x + y * y); int main() Point p1(1, 1), p2(4, 5);cout using namespace std; class R public:R(int r1, int r2) : r1(r1), r2(r2) void print();void
13、 print() const; private:int r1, r2; ;共享数据的保护void R:print() cout using namespace std; class A public: A(int i); void print();const int/定义一个引用 private: const int a; static const int b; /静态常数据成员 ;共享数据的保护const int A:b=10; /静态常数据成员在类外说明 和初始化 A:A(int i) : a(i) ,r(a) /常数据成员只能 通过初始化列表来获得初值 void A:print() co
14、ut #include using namespace std; class Point /Point类定义 public:/外部接口 Point(int x = 0, int y = 0): x(x), y(y) int getX() return x; int getY() return y; friend float dist(const Point /所引用对象即实参不能被修改 private:/私有数据成员 int x, y; ;共享数据的保护C+语言程序设计清华大学 郑莉float dist(const Point double y = p1.y - p2.y; return st
15、atic_cast(sqrt(x * x + y * y); int main() /主函数 const Point myp1(1, 1), myp2(4, 5); cout l按标准方式搜索,文件位于C+系统目录的include子目录下 #include“文件名“l首先在当前目录中搜索,若没有,再按标准方式搜索。l#define 宏定义指令 定义符号常量,很多情况下已被const定义语句取代。 定义带参数宏,已被内联函数取代。l#undef 删除由#define定义的宏,使之不再起作用。C+语言程序设计清华大学 郑莉58条件编译指令 #if 和 #endif#if 常量表达式/当“ 常量表达式”非零时编译程序正文 #endif .编译预处理命令C+语言程序设计清华大学 郑莉59条件编译指令#else#if 常量表达式/当“ 常量表达式”非零时编译程序正文1 #else/当“ 常量表达式”为零时编译程序正文2 #endif编译预处理命令C+语言程序设计清华大学 郑莉60条件编译指令 #elif#if 常量表达式1程序正文1 /当“