슬라이드 1

Similar documents
OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

Microsoft Word - 物件導向編程精要.doc

Strings

(procedure-oriented)?? 2

untitled

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

C/C++程序设计 - 字符串与格式化输入/输出

c_cpp

新版 明解C++入門編

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Microsoft PowerPoint - plan08.ppt

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

文档 3

无类继承.key

第3章.doc

Microsoft PowerPoint - string_kruse [兼容模式]

C/C++语言 - C/C++数据

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Strings

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

FY.DOC

untitled

ebook50-15

untitled

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

1 C++ 2 Bjarne Stroustrup C++ (system programming) 6 (infrastructure) C++ 7 Herb Sutter 8 C++ (efficiency) (flexibility) 9 (abstraction) (productivity

提问袁小兵:

Microsoft Word - ch04三校.doc

新・解きながら学ぶJava

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Factory Methods

Microsoft PowerPoint - ch6 [相容模式]

5B_sasaki.pdf

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

Wy159.mps

Microsoft Word - chap10.doc

Microsoft Word - 第3章.doc

2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

_汪_文前新ok[3.1].doc

C/C++ - 函数

C++ 程序设计 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

C/C++ - 文件IO

Microsoft Word - 中級會計學.doc

IO

Chapter 9: Objects and Classes

Microsoft Word - 01.DOC

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

绘制OpenCascade中的曲线

<BABAD3EFD1D4CEC4D1A7D7A8D2B5D1A7C9FABBF1B5C3B8F7C0E0D7CAB8F1B4D3D2B5D6A4CAE9C7E9BFF6CDB3BCC6B1ED2E786C73>

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

ch_code_infoaccess

Microsoft Word - CPE考生使用手冊 docx

Microsoft PowerPoint - plan06.ppt

INTRODUCTION TO COM.DOC

C++ 程式設計

概述

Microsoft Word htm

ebook39-5

6 喝 酒 不 開 車 勿 疲 勞 駕 駛 勿 闖 平 交 道 後 座 繫 安 全 帶 宣 導 低 頭 族 開 車 罰 則 勿 任 意 變 換 車 道 兒 童 後 座 繫 安 全 帶 財 團 法 人 臺 北 國 際 社 區 文 化 基 金 會 (ICRT 電 台 ) 安 全 上 路 停 看 聽 (

融通开放式基金月刊(2009年4月).doc

Microsoft Word - 特种水产饲料行业研究报告.docx

2015年全国射箭冠军赛.xls

Transcription:

2018-2019 年度第二学期 00106501 计算机图形学 童伟华管理科研楼 1205 室 E-mail: tongwh@ustc.edu.cn 中国科学技术大学数学科学学院 http://math.ustc.edu.cn/

附讲三 C/C++ 编程 ( 二 ) 2

C++ 特点 C++ 是面对对象 (object oriented) 编程语言 纯面向对象语言 : 指不管什么东西, 都应该存在于对象之中, 例如 JAVA 和 Small Talk 语言 三大特性 : 封装 (encapsulation) 继承 (inheritance) 多态 (polymorphism) 其它特性 : 动态生成 (dynamic creation) 异常处理 (exception handling) 泛型编程 (template) 3

面向对象的分析与设计 大英百科全书 : 人类在认识和理解现实世界的过程中普遍运用着三个构造法则 区分对象及其属性, 例如, 区分一棵树和树的大小或空间位置关系 区分整体对象及其组成部分, 例如, 区分一棵树和树枝 不同对象类的形成及区分, 例如, 所有树的类和所有石头的类的形成和区分 面向对象分析 (Object-oriented analysis, OOA) 与设计 (Object-oriented design, OOD) 方法是建立在对象及其属性 类属及其成员 整体及其部分这些基本概念的基础上 4

继承与组合 代码重用 不同层次 C 语言 : 函数 库等 C++ 语言 : 类 模板 设计模式等 如何重用已有的类? 组合 : 创建一个包含已存在类的对象的新类, 即将已存在类视为新类的属性,has-a 关系 继承 : 创建一个新类作为一个已存在类的类型, 即将新类视为已存在类的特殊类型,is-a 关系 5

组合 (has-a) //: C14:Useful.h // A class to reuse #ifndef USEFUL_H #define USEFUL_H class X int i; public: X() i = 0; void set(int ii) i = ii; int read() const return i; int permute() return i = i * 47; #endif // USEFUL_H ///:~ 6

组合 (has-a) //: C14:Composition.cpp // Reuse code with composition #include "Useful.h" class Y int i; public: X x; // Embedded object Y() i = 0; void f(int ii) i = ii; int g() const return i; int main() Y y; y.f(47); y.x.set(37); // Access the embedded object return(0); ///:~ 7

继承 (is-a) //: C14:Inheritance.cpp // Simple inheritance #include "Useful.h" #include <iostream> using namespace std; class Y : public X int i; // Different from X's i public: Y() i = 0; int change() i = permute(); // Different name call return i; void set(int ii) i = ii; X::set(ii); // Same-name function call 8

继承 (is-a) int main() cout << "sizeof(x) = " << sizeof(x) << endl; cout << "sizeof(y) = " << sizeof(y) << endl; Y D; D.change(); // X function interface comes through: D.read(); D.permute(); // Redefined functions hide base versions: D.set(12); return(0); ///:~ 9

多态 (polymorphism) 多态性 : 一般特殊结构中对象所体现的多态性, 即在一般类中定义的属性或操作被特殊类继承之后, 可以具有不同的数据类型或表现出不同的行为 为什么要使用多态性? 例如 : 在 几何图形 中定义了一个操作 绘图, 但是并不确定在执行时究竟要画一个什么图形 特殊类 椭圆 和 多边形 都继承了几何图形的绘制操作, 但其功能却不同 : 前者将画一个圆, 后者画一个多边形 这样, 当系统请求画一个几何图形时, 消息中给出的操作名称都是 绘图 ( 因而消息的书写方式可以统一 ), 而椭圆 多边形等类对象在接受到这个消息时却各自执行不同的绘图算法 10

多态 (polymorphism) 与多态性的实现相关的 C++ 语言功能有 : 重载 (overload): 函数 运算符重载等 动态绑定 (dynamic binding): 虚函数 (virtual function) 运行时类型信息 (run-time information) Evolution of C++ programmers Better C Object-based C++ True object-oriented programming: if you don t use virtual functions, you don t understand OOP yet. 11

多态 (polymorphism) //: C15:Instrument4.cpp // Extensibility in OOP #include <iostream> using namespace std; enum note middlec, Csharp, Cflat // Etc. class Instrument public: virtual void play(note) const cout << "Instrument::play" << endl; virtual char* what() const return "Instrument"; // Assume this will modify the object: virtual void adjust(int) 12

多态 (polymorphism) class Wind : public Instrument public: void play(note) const cout << "Wind::play" << endl; char* what() const return "Wind"; void adjust(int) class Percussion : public Instrument public: void play(note) const cout << "Percussion::play" << endl; char* what() const return "Percussion"; void adjust(int) class Stringed : public Instrument public: void play(note) const cout << "Stringed::play" << endl; char* what() const return "Stringed"; void adjust(int) 13

多态 (polymorphism) class Brass : public Wind public: void play(note) const cout << "Brass::play" << endl; char* what() const return "Brass"; class Woodwind : public Wind public: void play(note) const cout << "Woodwind::play" << endl; char* what() const return "Woodwind"; // Identical function from before: void tune(instrument& i) //... i.play(middlec); 14

多态 (polymorphism) // New function: void f(instrument& i) i.adjust(1); // Upcasting during array initialization: Instrument* A[] = new Wind, new Percussion, new Stringed, new Brass, 15

多态 (polymorphism) int main(void) Wind flute; Percussion drum; Stringed violin; Brass flugelhorn; Woodwind recorder; tune(flute); tune(drum); tune(violin); tune(flugelhorn); tune(recorder); f(flugelhorn); int NumA = sizeof(a)/sizeof(*a); for (int i = 0; i < NumA; i++) tune((*a[i])); return(0); ///:~ 16

多态 (polymorphism) C++ 如何实现动态绑定 (dynamic binding) 或延迟绑定 (late binding)? 虚函数表 : 编译器对每个包含虚函数的类创建一个表 (VTABLE), 用于放置虚函数地址, 并秘密的置一个指针 (VPTB) 指向该表 当通过基类指针调用虚函数时, 编译器静态的取得 VPTB, 通过它查找函数地址, 进行调用 关键点 : 基类指针调用虚函数, 接口的统一, 行为的多态 虚函数 : 除了函数调用时有一点额外的开销外, 一切皆好! 17

运行时类型识别 运行时类型识别 (run-time type identification, RTTI): 在我们只有一个指向基类的指针或引用时确定一个对象的准确类型 两种使用方法 : Typeid:typeid() 带有一个参数, 可以是一个对象引用或者指针, 返回全局 typeinfo 类的产量对象的一个引用, 编译器实现 安全类型向下映射 (type-safe downcast): 类继承的顺序, 向上映射 (upcast) 总是安全的, 譬如一个 circle* 到 shape*, 而 shape* 到 circle* 则不然, 语法 :circle* cp = dynamic_cast<circle*>(sp), 其中 shape* sp = new circle RTTI 的实现依赖于虚函数表中的信息 尽量使用虚函数, 必要时才使用 RTTI 18

Thanks for your attention! 19