220 likes | 457 Views
C/C++ 基礎程式設計班 C++: 運算 子重 載. 講師:鄒尚軒 , 8/16, 2013. 課程大綱. 重載運算 子 遞 迴. 重載運算子 (operator overloading). 在 C++ 裡 ,除了 預設的資料型態能使用運算子 外,如: int 、 double 、 char 等, 物件要使用運算子,預設上是不行的 但在許多情況 下你希望用到這些運算子,例如將 string 串接起來,或是你自己寫的物件進行相加 但為了方便以及運算 , C++ 提供 重載運算子的功能. 重載運算子.
E N D
C/C++基礎程式設計班C++: 運算子重載 講師:鄒尚軒, 8/16, 2013
課程大綱 • 重載運算子 • 遞迴
重載運算子(operator overloading) • 在C++裡,除了預設的資料型態能使用運算子外,如:int、double、char等,物件要使用運算子,預設上是不行的 • 但在許多情況下你希望用到這些運算子,例如將string串接起來,或是你自己寫的物件進行相加 • 但為了方便以及運算,C++提供重載運算子的功能
重載運算子 • 重載運算子如重載函式,在類別宣告內,定義你希望的運算子如何運作,並且實作他的行為 • 重載運算子後,同屬該類別的物件之間就可以進行運算,如相加或是相減 • 而重載運算子也可能導致誤會,例如有人將重載的+運算子實作為減法運算,因此使用上要注意
如何重載運算子 • 重載運算子的方法類似實作成員函式 • 其中#為要重載的運算子,例如要重載+,就將#換成+,以下是C++能重載的運算子:
範例 • 複習切割檔案 • 標頭檔:放置類別宣告的地方,名字常為"類別.h",通常只放置宣告 • 程式碼:實際上實作類別的地方,名字常為"類別.cpp",需要 #include "類別.h" • 範例為一個二維座標點,有 x, y 兩個值 • 因為我們不希望宣告後資料被改動,因此不需要set函式
範例:Point2D.h • Point2D.h 中只有宣告
範例:Point2D.cpp • Point2D.cpp才是真正的實作
範例:main.cpp • main.cpp使用Point2D類別範例
練習 • 承上面範例,重載*運算子,讓Point2D物件間能夠進行乘法運算 • 假設:(x1, y1)*(x2, y2)=(x1*x2, y1*y2)
可是... • cout << "p3(x, y) = (" << p3.getX() << ", " << p3.getY() << ")" << endl; • 這好長怎麼辦? • 我們想cout << "p3(x, y) = " << p3 << endl; • overloading operator <<
重載<<:Point2D.h • ostream是C++負責輸出的類別,而friend是指說跟他是好朋友,這樣他才能用Point2D裡私有的東西
重載<<:main.cpp • main.cpp使用Point2D類別範例
重載>> • 可以重載<<,當然也可以重載>> • 重載>>的方法與<<一樣,使用的是istream • 若是重載>>,則Point2D物件可透過cin等istream改變XY的值
課程大綱 • 重載運算子 • 遞迴
遞迴 • 遞迴:函式呼叫自己本身,且不停的持續下去,直到某個終止條件才停止呼叫 • 範例:
遞迴的過程 fac(5) = 120 fac(5): return 5 * fac(4) 24 fac(4): return 4 * fac(3) 6 fac(3): return 3 * fac(2) 2 fac(2): return 2 * fac(1) 1 fac(1): return 1 * fac(0) 1 fac(0): return 1
練習 • 使用遞迴實作輾轉相除法,求出兩數最大公因數 • 輾轉相除法過程:兩數 a, b • 先拿 a 除 b,得一餘數 c(=a%b) • 拿c 除 a,得一餘數 d • 拿 d 除 c,得一餘數 e • … • 直到某除數可以整除某被除數,則該除數就是(a, b)最大公因數
上次排列的提示 • 輸入長為 n 的字串,從第一個字開始排起,每次都試試看有哪些字可以排,排好一個字之後先換排下一個字,直到排完 n 個 • 排完 n 個後,就印出排列結果,並且回傳,所以第 n-1 格又可以在試試看有哪些可以排 • 一直循環下去…
本期課程到此結束 謝謝各位十天來的合作與不嫌棄以及給我的回饋,希望大家有問題多多發問!