清华大学C++教案

上传人:san****019 文档编号:21175500 上传时间:2021-04-25 格式:PPT 页数:57 大小:249.26KB
收藏 版权申诉 举报 下载
清华大学C++教案_第1页
第1页 / 共57页
清华大学C++教案_第2页
第2页 / 共57页
清华大学C++教案_第3页
第3页 / 共57页
资源描述:

《清华大学C++教案》由会员分享,可在线阅读,更多相关《清华大学C++教案(57页珍藏版)》请在装配图网上搜索。

1、1第五章 C+程序的结构清 华 大 学 郑 莉 C+语 言 程 序 设 计 C+语言程序设计清华大学 郑莉 2 本章主要内容l 作 用 域 与 可 见 性l 对 象 的 生 存 期l 数 据 与 函 数l 静 态 成 员l 共 享 数 据 的 保 护l 友 元l 编 译 预 处 理 命 令l 多 文 件 结 构 和 工 程 C+语言程序设计清华大学 郑莉 3 函数原形的作用域l 函 数 原 型 中 的 参 数 , 其 作 用 域 始 于(, 结 束 于 )。l 例 如 , 设 有 下 列 原 型 声 明 :double Area(double radius);radius 的 作 用 域 仅

2、在 于 此 ,不 能 用 于 程 序 正 文 其 它 地方 , 因 而 可 有 可 无 。作用域与可见性 C+语言程序设计清华大学 郑莉 4 块作用域l 在 块 中 声 明 的 标 识 符 , 其 作 用 域 自 声 明 处起 , 限 于 块 中 , 例 如 :void fun(int a) int b(a); cinb; if (b0) int c; . c的 作 用 域 b的 作 用 域作用域与可见性 C+语言程序设计清华大学 郑莉 5 类作用域l 类 作 用 域 作 用 于 特 定 的 成 员 名 。l 类 X的 成 员 M具 有 类 作 用 域 , 对 M的 访 问 方式 如 下 :

3、如 果 在 X的 成 员 函 数 中 没 有 声 明 同 名 的 局 部 作 用域 标 识 符 , 那 么 在 该 函 数 内 可 以 访 问 成 员 M。 通 过 表 达 式 x.M或 者 X:M访 问 。 通 过 表 达 式 prt-M作用域与可见性 C+语言程序设计清华大学 郑莉 6 文件作用域l 不 在 前 述 各 个 作 用 域 中 出 现 的 声 明 ,具 有 文 件 作 用 域 , 这 样 声 明 的 标 识 符的 作 用 域 开 始 于 声 明 点 , 结 束 于 文 件尾 。作用域与可见性 C+语言程序设计清华大学 郑莉 7 可见性l 可 见 性 是 从 对 标 识 符 的

4、引 用 的 角 度 来 谈的 概 念l 可 见 性 表 示 从 内 层 作 用 域 向 外 层 作 用 域“ 看 ” 时 能 看 见 什 么 。l 如 果 标 识 在 某 处 可 见 , 则 就 可 以 在 该 处引 用 此 标 识 符 。 块 作 用 域类 作 用 域文 件 作 用 域 作用域与可见性 C+语言程序设计清华大学 郑莉 8 可见性l 标 识 符 应 声 明 在 先 , 引 用 在 后 。l 如 果 某 个 标 识 符 在 外 层 中 声 明 , 且 在 内 层 中没 有 同 一 标 识 符 的 声 明 , 则 该 标 识 符 在 内 层可 见 。l 对 于 两 个 嵌 套 的

5、作 用 域 , 如 果 在 内 层 作 用 域内 声 明 了 与 外 层 作 用 域 中 同 名 的 标 识 符 , 则外 层 作 用 域 的 标 识 符 在 内 层 不 可 见 。作用域与可见性 C+语言程序设计清华大学 郑莉 9 同一作用域中的同名标识符l 在 同 一 作 用 域 内 的 对 象 名 、 函 数 名 、枚 举 常 量 名 会 隐 藏 同 名 的 类 名 或 枚 举类 型 名 。l 重 载 的 函 数 可 以 有 相 同 的 函 数 名 。作用域与可见性 C+语言程序设计清华大学 郑莉 10 #includeusing namespace std;int i; /文 件 作

6、用 域int main() i=5; int i; /块 作 用 域 i=7; couti=iendl; /输 出 7 couti=i; /输 出 5 return 0;作用域与可见性例 5.1 C+语言程序设计清华大学 郑莉 11 对象的生存期对 象 从 产 生 到 结 束 的 这 段 时 间 就 是它 的 生 存 期 。 在 对 象 生 存 期 内 , 对 象 将保 持 它 的 值 , 直 到 被 更 新 为 止 。 C+语言程序设计清华大学 郑莉 12 静态生存期l 这 种 生 存 期 与 程 序 的 运 行 期 相 同 。l 在 文 件 作 用 域 中 声 明 的 对 象 具 有 这

7、种生 存 期 。l 在 函 数 内 部 声 明 静 态 生 存 期 对 象 , 要冠 以 关 键 字 static 。对象的生存期 C+语言程序设计清华大学 郑莉 13 #includeusing namespace std;int i=5; /文 件 作 用 域int main() couti=iendl; return 0;i具 有 静 态 生 存 期对象的生存期例 C+语言程序设计清华大学 郑莉 14 动态生存期l 块 作 用 域 中 声 明 的 , 没 有 用 static修是 的 对 象 是 动 态 生 存 期 的 对 象 ( 习 惯称 局 部 生 存 期 对 象 ) 。l 开 始

8、于 程 序 执 行 到 声 明 点 时 , 结 束 于命 名 该 标 识 符 的 作 用 域 结 束 处 。对象的生存期 C+语言程序设计清华大学 郑莉 15 #includeusing namespace std;void fun();void main() fun(); fun();void fun() static int a=1; int i=5; a+; i+; couti=i,a=aendl; 运 行 结 果 :i=6, a=2i=6, a=3i是 动 态 生 存 期a是 静 态 生 存 期对象的生存期例 C+语言程序设计清华大学 郑莉 16 例5-2 变量的生存期与可见性#inc

9、ludeusing namespace std;int i=1; / i 为 全 局 变 量 , 具 有 静 态 生 存 期 。void main(void) 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: cendl; c=c+8; other(); cout-MAIN-n; cout i: i a: a b: b c: c

10、endl; i=i+10; other(); 对象的生存期 void other(void) static int a=2; static int b; / a,b为 静 态 局 部 变 量 , 具 有 全 局 寿 命 , 局 部 可 见 。 /只 第 一 次 进 入 函 数 时 被 初 始 化 。 int c=10; / C为 局 部 变 量 , 具 有 动 态 生 存 期 , /每 次 进 入 函 数 时 都 初 始 化 。 a=a+2; i=i+32; c=c+5; cout-OTHER-n; cout i: i a: a b: b c: cendl; b=a; 17 运 行 结 果 :

11、-MAIN- i: 1 a: 0 b: -10 c: 0-OTHER- i: 33 a: 4 b: 0 c: 15-MAIN- i: 33 a: 0 b: -10 c: 8-OTHER- i: 75 a: 6 b: 4 c: 15 18 C+语言程序设计清华大学 郑莉 19 例5-3具有静态、动态生存期对象的时钟程序#includeusing namespace std;class Clock /时 钟 类 声 明public: /外 部 接 口Clock();void SetTime(int NewH, int NewM, int NewS); /三 个 形 参 均 具 有 函 数 原 型

12、作 用 域void ShowTime();Clock()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;Second=NewS;void Clock:ShowTime() coutHour:Minute:Secondendl; 20 Clock globClock; /声

13、 明 对 象 globClock, /具 有 静 态 生 存 期 , 文 件 作 用 域void main() /主 函 数 coutFirst time output:endl;/引 用 具 有 文 件 作 用 域 的 对 象 :globClock.ShowTime(); /对 象 的 成 员 函 数 具 有 类 作 用 域globClock.SetTime(8,30,30);Clock myClock(globClock); /声 明 具 有 块 作 用 域 的 对 象 myClockcoutSecond time output:endl;myClock.ShowTime(); /引 用

14、具 有 块 作 用 域 的 对 象 21 程 序 的 运 行 结 果 为 :First time output:0:0:0Second time output:8:30:30 22 C+语言程序设计清华大学 郑莉 23 数据与函数l 数 据 存 储 在 局 部 对 象 中 , 通 过 参 数 传递 实 现 共 享 函 数 间 的 参 数 传 递 。l 数 据 存 储 在 全 局 对 象 中 。l 将 数 据 和 使 用 数 据 的 函 数 封 装 在 类 中 。数据与函数 C+语言程序设计清华大学 郑莉 24 使用全局对象#includeusing namespace std;int glob

15、al;void f() global=5;void g() coutglobalendl;int main() f(); g(); /输 出 “5” return 0;数据与函数 C+语言程序设计清华大学 郑莉 25 将函数与数据封装#includeusing namespace std;class Application public: void f(); void g(); private: int global;void Application:f() global=5;void Application:g() coutglobalendl; int main() Application

16、 MyApp; MyApp.f(); MyApp.g(); return 0;数据与函数 C+语言程序设计清华大学 郑莉 26 静态成员l 静 态 数 据 成 员 用 关 键 字 static声 明 该 类 的 所 有 对 象 维 护 该 成 员 的 同 一 个 拷贝 必 须 在 类 外 定 义 和 初 始 化 , 用 (:)来 指 明所 属 的 类 。l 静 态 成 员 函 数 类 外 代 码 可 以 使 用 类 名 和 作 用 域 操 作 符来 调 用 静 态 成 员 函 数 。 静 态 成 员 函 数 只 能 引 用 属 于 该 类 的 静 态数 据 成 员 或 静 态 成 员 函 数

17、。静态成员 C+语言程序设计清华大学 郑莉 27 例5-4 具有静态数据成员的 Point类#include using namespace std;class Pointpublic:Point(int xx=0, int yy=0) X=xx; Y=yy; countP+; Point(Point int GetX() return X;int GetY() return Y;void GetC() cout Object id=countPendl;private:int X,Y;static int countP;静态成员 Point:Point(Point Y=p.Y;countP+

18、;int Point:countP=0; void main() Point A(4,5);coutPoint A,A.GetX(),A.GetY();A.GetC();Point B(A);coutPoint B,B.GetX(),B.GetY();B.GetC(); 28 C+语言程序设计清华大学 郑莉 29 静态成员函数举例#includeusing namespace std;class Application public: static void f(); static void g(); private: static int global;int Application:glo

19、bal =0; void Application:f() global=5;void Application:g() coutglobalendl;int main() Application:f(); Application:g(); return 0;静态成员 C+语言程序设计清华大学 郑莉 30 静态成员函数举例class A public: static void f(A a); private: int x;void A:f(A a) coutx; /对x的 引 用 是 错 误 的 couta.x; /正 确静态成员 C+语言程序设计清华大学 郑莉 31 具有静态数据、函数成员的 P

20、oint类#include using namespace std;class Point /Point类 声 明public: /外 部 接 口Point(int xx=0, int yy=0) X=xx;Y=yy;countP+;Point(Point /拷 贝 构 造 函 数int GetX() return X;int GetY() return Y;static void GetC() cout Object id=countPendl;private: /私 有 数 据 成 员int X,Y; static int countP;静态成员 Point:Point(Point Y=p

21、.Y;countP+;int Point:countP=0;void main() /主 函 数 实 现 Point A(4,5); /声 明 对 象 AcoutPoint A,A.GetX(),A.GetY();A.GetC(); /输 出 对 象 号 , 对 象 名 引 用Point B(A); /声 明 对 象 BcoutPoint B,B.GetX(),B.GetY();Point:GetC(); /输 出 对 象 号 , 类 名 引 用 32 C+语言程序设计清华大学 郑莉 33 友元l 友 元 是 C+提 供 的 一 种 破 坏 数 据 封 装和 数 据 隐 藏 的 机 制 。l

22、通 过 将 一 个 模 块 声 明 为 另 一 个 模 块 的友 元 , 一 个 模 块 能 够 引 用 到 另 一 个 模块 中 本 是 被 隐 藏 的 信 息 。l 可 以 使 用 友 元 函 数 和 友 元 类 。l 为 了 确 保 数 据 的 完 整 性 , 及 数 据 封 装与 隐 藏 的 原 则 , 建 议 尽 量 不 使 用 或 少使 用 友 元 。 友 元 C+语言程序设计清华大学 郑莉 34 友元函数l 友 元 函 数 是 在 类 声 明 中 由 关 键 字 friend修 饰 说 明 的 非 成 员 函 数 , 在 它 的 函 数体 中 能 够 通 过 对 象 名 访 问

23、private 和 protected成 员l 作 用 : 增 加 灵 活 性 , 使 程 序 员 可 以 在封 装 和 快 速 性 方 面 做 合 理 选 择 。l 访 问 对 象 中 的 成 员 必 须 通 过 对 象 名 。 友 元 C+语言程序设计清华大学 郑莉 35 例5-6 使用友元函数计算两点距离#include #include using namespace std;class Point /Point类 声 明 public: /外 部 接 口Point(int xx=0, int yy=0) X=xx;Y=yy;int GetX() return X;int GetY()

24、 return Y;friend float Distance(Point private: /私 有 数 据 成 员int X,Y; ; 友 元 double Distance( Point double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy);int main() Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); coutThe distance is dendl; return 0; 36 C+语言程序设计清华大学 郑莉 37 友元类l 若 一 个 类 为 另 一 个 类 的 友 元

25、 , 则 此 类的 所 有 成 员 都 能 访 问 对 方 类 的 私 有 成员 。l 声 明 语 法 : 将 友 元 类 名 在 另 一 个 类 中使 用 friend修 饰 说 明 。 友 元 C+语言程序设计清华大学 郑莉 38 友元类举例class A friend class B; public: void Display() coutxendl; private: int x;class B public: void Set(int i); void Display(); private: A a; 友 元 void B:Set(int i) a.x=i;void B:Displa

26、y() a.Display(); 39 C+语言程序设计清华大学 郑莉 40 友元关系是单向的如 果 声 明 B类 是 A类 的 友 元 , B类 的成 员 函 数 就 可 以 访 问 A类 的 私 有 和 保 护数 据 , 但 A类 的 成 员 函 数 却 不 能 访 问 B类 的 私 有 、 保 护 数 据 。 C+语言程序设计清华大学 郑莉 41 常类型 常 类 型 的 对 象 必 须 进 行 初 始 化 , 而 且 不 能被 更 新 。l 常 引 用 : 被 引 用 的 对 象 不 能 被 更 新 。const 类 型 说 明 符 void display(const doublein

27、t main() double d(9.5); display(d); return 0;void display(const double 共享数据的保护 C+语言程序设计清华大学 郑莉 43 常对象举例class A public: A(int i,int j) x=i; y=j; . private: int x,y;A const a(3,4); /a是 常 对 象 , 不 能 被 更 新 共享数据的保护 C+语言程序设计清华大学 郑莉 44 用const修饰的对象成员l 常 成 员 函 数 使 用 const关 键 字 说 明 的 函 数 。 常 成 员 函 数 不 更 新 对 象

28、的 数 据 成 员 。 常 成 员 函 数 说 明 格 式 :类 型 说 明 符 函 数 名 ( 参 数 表 ) const;这 里 , const是 函 数 类 型 的 一 个 组 成 部 分 ,因 此 在 实 现 部 分 也 要 带 const关 键 字 。 const关 键 字 可 以 被 用 于 参 与 对 重 载 函 数 的区 分l 通 过 常 对 象 只 能 调 用 它 的 常 成 员 函 数 。l 常 数 据 成 员 使 用 const说 明 的 数 据 成 员 。 共享数据的保护 C+语言程序设计清华大学 郑莉 45 例5-8 常成员函数举例#includeusing name

29、space std;class R public: R(int r1, int r2)R1=r1;R2=r2; void print(); void print() const; private: int R1,R2; 共享数据的保护 void R:print() coutR1:R2endl;void R:print() const coutR1;R2endl;void main() R a(5,4); a.print(); /调 用 void print() const R b(20,52); b.print(); /调 用 void print() const 46 C+语言程序设计清华大

30、学 郑莉 47 例5-9 常数据成员举例#includeusing namespace std;class Apublic:A(int i);void print();const intprivate:const int a;static const int b; /静 态 常 数 据 成 员; 共享数据的保护 const int A:b=10; A:A(int i):a(i),r(a) void A:print() couta:b:rendl; void main()/*建 立 对 象 a和 b, 并 以 100和 0作 为 初 值 , 分 别 调 用 构 造函 数 , 通 过 构 造 函

31、数 的 初 始 化 列 表 给 对 象 的 常 数 据 成员 赋 初 值 */ A a1(100),a2(0); a1.print(); a2.print(); 48 C+语言程序设计清华大学 郑莉 49 编译预处理命令l#include 包 含 指 令 将 一 个 源 文 件 嵌 入 到 当 前 源 文 件 中 该 点 处 。#include l按 标 准 方 式 搜 索 , 文 件 位 于 C+系 统 目 录 的 include子目 录 下#include文 件 名 l首 先 在 当 前 目 录 中 搜 索 , 若 没 有 , 再 按 标 准 方 式 搜 索 。l#define 宏 定 义

32、 指 令 定 义 符 号 常 量 , 很 多 情 况 下 已 被 const定 义 语 句取 代 。 定 义 带 参 数 宏 , 已 被 内 联 函 数 取 代 。l#undef 删 除 由 #define定 义 的 宏 , 使 之 不 再 起 作 用 。 C+语言程序设计清华大学 郑莉 50 条件编译指令 #if 和 #endif#if 常 量 表 达 式 /当 “ 常 量 表 达 式 ” 非 零 时 编 译 程 序 正 文 #endif. 编译预处理命令 C+语言程序设计清华大学 郑莉 51 条件编译指令#else #if 常 量 表 达 式 /当 “ 常 量 表 达 式 ” 非 零 时

33、编 译 程 序 正 文 1#else /当 “ 常 量 表 达 式 ” 为 零 时 编 译 程 序 正 文 2#endif 编译预处理命令 C+语言程序设计清华大学 郑莉 52 条件编译指令 #elif#if 常 量 表 达 式 1 程 序 正 文 1 /当 “ 常 量 表 达 式 1”非 零 时 编 译#elif 常 量 表 达 式 2 程 序 正 文 2 /当 “ 常 量 表 达 式 2”非 零 时 编 译#else 程 序 正 文 3 /其 它 情 况 下 编 译#endif 编译预处理命令 C+语言程序设计清华大学 郑莉 53 条件编译指令#ifdef 标 识 符 程 序 段 1#el

34、se 程 序 段 2#endif如 果 “ 标 识 符 ” 经 #defined定 义 过 , 且未 经 undef删 除 , 则 编 译 程 序 段 1, 否 则编 译 程 序 段 2。 编译预处理命令 C+语言程序设计清华大学 郑莉 54 条件编译指令#ifndef 标 识 符 程 序 段 1#else 程 序 段 2#endif如 果 “ 标 识 符 ” 未 被 定 义 过 , 则 编 译 程序 段 1, 否 则 编 译 程 序 段 2。 编译预处理命令 C+语言程序设计清华大学 郑莉 55 多文件结构(例5-10)l 一 个 源 程 序 可 以 划 分 为 多 个 源 文 件 : 类

35、声 明 文 件 ( .h文 件 ) 类 实 现 文 件 ( .cpp文 件 ) 类 的 使 用 文 件 ( main()所 在 的 .cpp文 件 )l 利 用 工 程 来 组 合 各 个 文 件 。 C+语言程序设计清华大学 郑莉 56 不使用条件编译的头文件/main.cpp#include file1.h#include file2.hvoid main() /file1.h#include head.h /file2.h#include head.h /head.h class Point 多文件结构 C+语言程序设计清华大学 郑莉 57 使用条件编译的头文件/head.h#ifndef HEAD_H #define HEAD_H class Point #endif 多文件结构

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!