#分享 物件導向程式設計|模擬真實世界的方式|江明朝

7月1日 16:01
大家好,我是宗宗,最近剛修完『物件導向程式設計 (OOP)』 ,因此我介紹一下OOP,可能的課程內容: 一、課程大綱 前半學期 C++ Basics、Flow of Control、Function Basics、Parameters and Overloading、Arrays、Structures and Classes、Constructors and Other Tools、Operator Overloading, Friends, and References、Strings 雖然是OOP課程,但程序導向的概念也會教,像是if...else...、for loop、while loop、function這些重要觀念。C-array和pointer的關係也是重點中的重點,即使C++有自己專屬的array和vector等容器可以取代C-array,但這些容器的建構也是在C-array之上。pointer在C/C++的重要程度就不用多說了,如果能理解與使用pointer,你大概可以宣稱你學過C語言。 好讀版
(一)指標 (pointer) 跟pointer有關的概念像是:pass by address、pass by reference、reference、iterator、dynamic variable。pass by address / reference可以讓參數傳遞更有效率。reference是C++有但C沒有的,reference可以讓使用者更方便,因為& (get address)和* (dereference)編譯器會自動幫你做。 iterator會出現在C++ Standard Template Library (STL)中的標準容器中,由於C++為了追求效率,不同的容器會有不同的iterator,因此iterator也有不同的種類。iterator可以讓使用者存取容器中的元素,而pointer也可以辦得到,不過iterator比pointer有更多的功能。 dynamic variable涉及到記憶體配置 (new)和釋放 (free),變數的life time可以由使用者自己控制,但也要注意記憶體遺失或重複釋放的問題。因此C++類別中的建構子 (constructor)和解構子 (destructor)可以自動幫使用者管理資源。這種資源管理稱RAII,全稱資源取得即初始化 (Resource Acquisition Is Initialization),這是物件導向非常重要的概念之一。 更多指標介紹,請參考[筆記]陣列與指標|C++ (二)函式 (function) function也是一個重點,像是:參數傳遞、signature、scope、overloading、operator。 傳遞參數有分pass by value、pass by address、pass by reference,C/C++預設為value,指標是使用address,參考是使用reference。 C++透過函式的簽章 (signature)去分辨不同的函式,簽章的組成有函數名、參數型態、參數排列,並不含有返回型態 (return type)。然而在同一個scope中,同樣的函數名但不同signature就會有多載 (overloading)的議題存在。 多載可以使同名的函式,承載不同型態的參數列。最經典的範例是operator overloading,operator本質上也是一種函式,只不過使用上更直覺。 更多函式介紹,請參考[筆記]介面與實作、運算子多載、左值右值、參數傳遞、回傳多值|C++ 後半學期 Pointers and Dynamic Arrays、Separate Compilation and Namespaces、Streams and File I/O、Recursion、Inheritance、Polymorphism and Virtual Functions、Templates、STL、C++11 (三)物件導向 物件導向三個種要原則:封裝 (encapsulation)、繼承 (inheritance)、多型 (polymorphism)。由類別 (Class)實作封裝,基礎 (base)/衍生 (derived)實作繼承,虛擬函式實作多型。 Encapsulation 封裝:Type = Data + Operation。限制使用權限(public, protected, private),有利於debug,讓錯誤限制在某一個區塊。Inheritance 繼承:重複使用(reuse)程式碼。Polymorphism 多型:同名的函式與一樣的參數(同樣的signature),但有不同版本的函數,使用virtual,可以解決C中Switch問題。 更多類別介紹,請參考[筆記]類別、特殊函式、內嵌函式、函式物件|C++ 更多繼承介紹,請參考[筆記]繼承模式與存取權限|C++ 更多多型介紹,請參考[筆記]多型與繼承的關係|C++ 更多靜態與常數介紹,請參考[筆記]static / const成員資料與函式|C++ 更多夥伴介紹,請參考[筆記]夥伴函式與類別、不夠朋友問題|C++ (四)模板 (template) template基本上可以視為另一個獨立的程式語言,並且是圖靈完備的,是另一個更大的坑。TMP (template metaprogramming)是未來的趨勢,因為大家會希望能在complie time完成就不要在run time做,因為一支程式可能只complie一次,但run可能重複run數次。 更多TMP例子,請參考期中考第7題 二、小結 物件導向很像是人類的認知模式,人類擅長抽象化,抽象化不是指把事情弄複雜XD,抽象化反而是把事情簡化,抽象化其實就是去除多餘的細節,留下重要的東西。例如:世界上有很多種杯子,如:馬克杯、玻璃杯、塑膠杯、保溫杯、冰霸杯......等,但我們不可能為了認識杯子,而去記這麼多的細節,我們最後看完這麽多杯子,只會記得這些都是杯子。未來再看到類似杯子的東西,我們就可以認出這是杯子,而不是綠豆糕或稿紙。 而物件導向也是一樣的,會有類別 (class)與實例 (instance)。類別是抽象化的型態,是足以代表實例的特徵,你可以稱之為模型,也可以說是理型,甚至說它是概念,它是不存在於現象世界的。而實例是類別具象化的真實物體,它是真實存在的,擁有多樣化的差異,但被人類歸類於同一個類別之中。因此我才會覺得,物件導向是一個模擬真實的方式。 三、相關文章 1. 物件導向程式設計|模擬真實世界的方式|江明朝
2. AOOP Homework source code
3. [筆記]109-2高等物件導向程式設計 期中考
4. [筆記]介面與實作、運算子多載、左值右值、參數傳遞、回傳多值|C++
5. [筆記]陣列與指標|C++
6. [筆記]類別、特殊函式、內嵌函式、函式物件|C++
7. [筆記]繼承模式與存取權限|C++
8. [筆記]多型與繼承的關係|C++
9. [筆記]static / const成員資料與函式|C++
10. [筆記]夥伴函式與類別、不夠朋友問題|C++
46
回應 3
文章資訊
77 篇文章210 人追蹤
Logo
每週有 35 則貼文
共 3 則留言
明志科技大學
好文推推
國立陽明交通大學
感謝原po的用心!
國立臺灣師範大學