資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.

Slides:



Advertisements
Similar presentations
第 2 章 初探 C++.
Advertisements

程序设计实习 3月份练习解答
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
類別與物件 Class & Object.
第7单元 面向过程编程—— 继承与多态.
第八章 类和对象.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
資料大樓 --談指標與陣列 綠園.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
函數(一) 自訂函數、遞迴函數 綠園.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
哈夫曼编码.
第12章 樹狀搜尋結構 (Search Trees)
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
第3章 继承和派生.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
五、链 表 1、单链表 2、双向链表 3、链表应用.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
資料結構使用Java 第9章 樹(Tree).
Inheritance -II.
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++程式設計入門 變數與運算子 作者:黃建庭.
C++大学基础教程 第10章 运算符重载 北京科技大学 2019/5/7 北京科技大学.
面向对象技术 练习 ffh.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
辅导课程十一.
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
Chapter 2 Entity-Relationship Model
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
题目详细要求、参考资料及更新发布于: 第二周 链表与指针 题目详细要求、参考资料及更新发布于:
Presentation transcript:

資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010

大綱 使用類別(Class)建立資料結構 使用繼承(Inheritance)建立資料結構

類別(Class) 類別class是C++中用來封裝資料的關鍵字,當您 使用類別來定義一個物件(Object)時,您考慮這個 物件可能擁有的「屬性」(Property)與「方法」 (Method)成員 屬性是物件的靜態描述 方法是可施加於物件上的動態操作 您使用類別定義出這個物件的規格書,之後就可 依這個規格書製作出一個個的物件實例,並在製 作過程中設定個別物件的專屬特性資料。 要訣: 屬性(該類別的變數)要存放的資料 (每個物件有自己的屬性) 方法(該類別的函式)寫要執行的程式 (用方法控制屬性)

如何設計類別? 思考 (以功能角度) 進階思考 (以使用者角度) 每個物件需要什麼資料?  宣告屬性 每個物件需要什麼資料?  宣告屬性 每個物件需要什麼方法來操作資料?  設計方法 進階思考 (以使用者角度) 如何讓使用類別宣告物件的人方便簡單使用。 如何避免使用類別宣告物件的人因用到不該用的資料而產生 錯誤。

類別(Class) 宣告一個類別 (類似定義一個結構struct) 語法: class 類別名稱 {   public:    類別名稱(); //建構式, 用來做物件的初始化    ~類別名稱(); //解構式, 用來做物件的善後工作    公開的方法或屬性;   protected: // 只有在同一繼承架構中可以使用的資料    受保護的方法或屬性;   private: // 只有在此類別中可以使用的資料    私有的方法或屬性; };

資料的權限 三種資料的權限設定 在類別封裝時,有一個基本原則是:資訊的最小 化公開。如果屬性可以不公開就不公開。 public: 「公開成員」表示以下所定義的成員可以使用物件名 稱直接被呼叫,稱之為 protected: 「受保護成員」表示以下所定義的成員只可在同 一繼承架構下之類別中可以使用。 private:「私有成員」表示以下所定義的成員只可在自己的類 別中可以使用。 在類別封裝時,有一個基本原則是:資訊的最小 化公開。如果屬性可以不公開就不公開。 如果要取得或設定物件的某些屬性,也是儘量透 過公開方法成員來進行。

建構式與解構式 建構式(Constructor) 解構式(Destructor) 在定義類別時,您可以使用「建構函式」來進行物件的初始 化。 在物件釋放資源之前,您也可以使用「解構函式」來進行一 些善後的工作。

類別的方法之描述 實作一個類別方法的內容(類似寫一個函式) 除了寫在類別定義中, 也可拿到類別定義以外的地 方描述 語法: 資料型態 類別名稱::方法名稱( 參數1, 參數2, … ,參數n ) {   程式碼; }

物件的產生與使用 使用類別定義物件 (類似定義一個變數) 語法: 物件可透過 . 來使用或存取該方法或屬性(類似C語 言的結構struct) 類別名稱 物件名稱; 類別名稱 物件名稱( 參數1, 參數2, … , 參數n ); 物件可透過 . 來使用或存取該方法或屬性(類似C語 言的結構struct) 若為物件指標,可透過 ->來使用或存取該方法或 屬性

範例:製作一個2D座標類別 製作以下程式範例: Point2D.h Point2D.h: 定義類別 Point2D.cpp: 設計類別的方法 main.cpp: 主程式 Point2D.h class Point2D { public: Point2D(); //建構式 Point2D(int x, int y); //可傳入初始值的建構式 void set(int x, int y); //設定點座標 void print(); //印出點座標 protected: int X; //X座標 int Y; //Y座標 };

範例:製作一個2D座標類別 Point2D.cpp main.cpp #include <iostream> using namespace std; #include "Point2D.h" Point2D::Point2D() { X = 0; Y = 0; } Point2D::Point2D(int x, int y) X = x; Y = y; void Point2D::set(int x, int y) void Point2D::print() cout << "(" << X << "," << Y << ")" << endl; #include <iostream> using namespace std; #include "Point2D.h" int main() { Point2D p1; Point2D p2(5, 10); p1.set(20, 30); p1.print(); p2.print(); return 0; }

範例: C++鏈結串列 將第二章之鏈結串列範例改用C++之類別實作 class LinkedList node * head node (LinkedList.h , LinkedList.cpp , LinkedList_main.cpp) class LinkedList node * head node node node 10 20 30 int data node * NULL next

練習: C++樹狀結構 將第六章之二元搜尋樹範例改用C++之類別實作 class BinarySearchTree root node 5 (BinarySearchTree.h , BinarySearchTree.cpp , BinarySearchTree_main.cpp) class BinarySearchTree root node 5 data left right 4 6 NULL NULL NULL NULL

大綱 使用類別(Class)建立資料結構 使用繼承(Inheritance)建立資料結構

繼承(Inheritance) 「繼承」(Inheritance)是物件導向程式設計的 一種進階觀念,繼承就是物件的再利用,當定義 好一個類別後,其他類別可以繼承這個類別的成 員資料和函數。 語法: class 子類別名稱: 繼承權限 父類別名稱 { … }; 在繼承的關係中 被繼承的類別: 「父類別」(Parent class)或「基礎類別」(Base class), 繼承父類別的類別: 「子類別」(Child class)或「衍生類別」(Derived class)

範例:製作一個3D座標類別 製作以下程式範例: Point3D.h Point2D.h: 定義2D類別 (使用之前的Point2D範例) Point2D.cpp: 設計2D類別的方法 (使用之前的Point2D範例) Point3D.h: 定義3D類別 Point3D.cpp: 設計3D類別的方法 main.cpp: 主程式 Point3D.h #include "Point2D.h" class Point3D: public Point2D { public: Point3D(); //建構式 Point3D(int x, int y, int z); //可傳入初始值的建構式 void set(int x, int y, int z); //設定點座標 void print(); //印出點座標 private: int Z; //Z座標 };

範例:製作一個3D座標類別 Point3D.cpp main.cpp #include <iostream> using namespace std; #include "Point3D.h" Point3D::Point3D() { Z = 0; } Point3D::Point3D(int x, int y, int z) : Point2D(x, y) Z = z; void Point3D::set(int x, int y, int z) Point2D::set(x, y); void Point3D::print() cout << "(" << X << "," << Y << "," << Z << ")" << endl; #include <iostream> using namespace std; #include "Point3D.h" int main() { Point3D p1; Point3D p2(5, 10, 20); p1.set(20, 30, 40); p1.print(); p2.print(); return 0; }

範例:C++堆疊 使用C++鏈結串列以繼承方式實作堆疊 class Stack class LinkedList node * head (Stack.h , Stack.cpp , Stack_main.cpp) class Stack class LinkedList node * head node node node 10 20 30 int data node * NULL next

練習:C++佇列 使用C++鏈結串列以繼承方式實作佇列 class Queue node * rear class LinkedList (Queue.h , Queue.cpp , Queue_main.cpp) class Queue node * rear class LinkedList node * head node node node 10 20 30 int data node * NULL next