一、簡介
- 學校:國立中山大學
- 課程:高等物件導向程式設計 (Advanced Object-Oriented Programming, AOOP)
- 教授:江明朝
- 系所:資訊工程所
- 學分:3學分
- 學期:109-2
- 宗宗的學期總成績:A- (83)
二、評分
- 程式作業:70%
- 期中考試:20%
- 期末考試:10%
作業1是用C和C++實作Dynamic stack,目的是為了展示不只有物件導向語言 (C++)能實作OOP,程序導向的語言 (C)也能實作OOP,只不過會比較麻煩。作業2要運用C++ commond line,輸入tar file path給C++,並在C++中處理tar file格式並輸出tar file內容。作業3實作複數類別,目的要練習operator overloading、friend function。作業4實作一個簡易的詞法分析器 (lexer),老師會給JAVA版本的code,要自己轉換成C++,是作業中最難的。作業5.1實作自定義操作子 (user-defined manipulators),作業5.2實作模板類別的階層 (class template hierarchy),這涉及到general / specialized template class。
更多作業內容,請參考AOOP Homework source code,但切勿抄襲,請自己寫~
更多考試內容,請參考[筆記]109-2高等物件導向程式設計 期中考
三、老師評價
江明朝 |
我覺得江老師的學經歷蠻勵志的,大家可以去看他的專訪,因為他學士是管理科學,碩博士才是計算機科學,後來有去矽谷工作,最後才在中山教書。某種意義上,也算是中途有換過領域的學者,這和很多一路都是念相關科系的學者很不一樣。
教學風格蠻美式的,每堂課第一句話大概是『同學有沒有問題』,有時會問一些問題。雖然是進階課程,但前半段還是會講一些基礎的東西,整體內容上比較偏『基礎概念』。注意基礎不代表簡單,而代表運作原理。我覺得些基礎知識在『寫』程式上不見得有顯著的幫助,但在『設計』程式上幫助就蠻大的。因此老師會更著重在why?而非what?
四、課程分析
前半學期
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)和釋放 (delete),變數的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題
(五)小結
而物件導向也是一樣的,會有類別 (class)與實例 (instance)。類別是抽象化的型態,是足以代表實例的特徵,你可以稱之為模型,也可以說是理型,甚至說它是概念,它是不存在於現象世界的。而實例是類別具象化的真實物體,它是真實存在的,擁有多樣化的差異,但被人類歸類於同一個類別之中。因此我才會覺得,物件導向是一個模擬真實的方式。
留言
張貼留言