Download presentation
Presentation is loading. Please wait.
1
C/C++基礎程式設計班 C++:物件導向程式設計 類別的使用 (Class)
講師:鄒尚軒, 8/15, 2013
2
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
3
物件導向 以物件為基礎的程式設計方式,將程式中各個 互動的部分視為物件 物件最重要的概念:資料封裝(Encapsulation)
資料封裝是指:將物件的資料以及運作都藏於物件 之中,使用者並不知曉物件如何運作 而定義物件的屬性(Attribute)以及行為(Method)是程 式設計師的工作 而物件便是依照類別這份規格表所產生的實體
4
物件的例子 真實世界:一台電腦就是一個物件 C++世界:string str,str就是一個物件,string是 類別
他有CPU、記憶體、硬碟等屬性 他能放音樂、放影片、玩遊戲等這些行為 可是我們不知道它裡面是怎麼跑的 C++世界:string str,str就是一個物件,string是 類別 他有字串內容、長度這些屬性 他能回報長度、回傳子字串等行為
5
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
6
類別(class) 類別(class)是C++中用來定義物件屬性與行為的設 計圖 使用類別定義物件時,考慮物件可能有的「屬性」 和「行為」
屬性是物件擁有的一些靜態特性 行為是可以對物件或是物件本身的一些動作 定義類別後,我們便可以利用它產生物件 要訣: 屬性:宣告存放的資料(成員資料) 行為(方法):實作物件的行為(成員函式)
7
類別的宣告 宣告類似結構 class 類別名稱 { public: //公開可用的部分 類別名稱(); //建構子
~類別名稱();//解構子 公開的方法或是資料 private: //只有類別本身可使用的 受保護的資料或是方法; protected: //繼承類別才能使用的 // 這不會教 };
8
物件的產生與使用 物件使用前需要宣告,與一般變數無異 語法: 宣告物件後,可使用 . 來存取或使用類別的資 料或方法
類別名稱 物件名稱; 類別名稱 物件名稱(參數1, 參數2...); 宣告物件後,可使用 . 來存取或使用類別的資 料或方法 若為物件指標,需使用 -> 來使用物件的資料或 是方法 使用方法皆類似C的結構
9
一個簡單的範例 #include <iostream> #include <string>
#include <cstdlib> using namespace std; class Dog { public: int year; string type; Dog(string t, int y) { type = t; year = y; } void bark() { cout << "Hello world." << endl; int howOld() { return year; string whatType() { return type; }; int main() { Dog dog("馬爾濟斯", 2); dog.bark(); cout << dog.howOld() <<endl; cout << dog.whatType() <<endl; system("pause"); return 0;
10
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
11
如何設計類別 第一步:物件的規格 第二步:物件的封裝 第三步:物件的關係(內容較進階) 物件需要哪些資料 物件需要哪些行為
那些資料需要公有、那些卻得是私有 第三步:物件的關係(內容較進階) 物件間的關係 ...
12
物件需要哪些資料 定義一個物件所需要的資料需要符合他的屬性, 例如:狗需要品種以及年齡 這些資料在C++中稱為成員資料
成員資料代表一個物件的屬性及他的內容 如:string裡面存的字串就是成員資料 成員資料可以是任何型態、結構類型甚至是類 別型態的變數或物件 宣告方法與一般宣告變數、結構、物件一樣
13
物件需要哪些行為 定義某些行為,讓物件可以透過這些行為改變 成員資料,或是做出一些動作,此稱成員函式
成員函式可宣告於類別內,在類別外實作,也 可在類別內直接實作,另外成員函式可以重載 語法與函式類似: //類別內實作 資料型態 方法名稱( 引數1, 引數2, … , 引數n ) { 程式碼; } //類別內宣告,類別外實作 資料型態 類別名稱::方法名稱( 引數1, 引數2, … , 引數n ) { 程式碼; }
14
練習 設計一個Rectangle(長方形)類別,須包含: 成員資料: 成員函式:
int length, width; //長寬 成員函式: int area(); //回傳面積 產生長方形物件(eg. Rectangle rect;)後,使用 rect.length = 10;,設定好長寬,再以計算面積 的函式回傳面積並印出來
15
練習範例解答 #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: int length, width; int area() { return length*width; } }; int main() { Rectangle rect1; rect1.length = 20; rect1.width = 10; cout << "Area = " << rect1.area() << endl; system("pause"); return 0;
16
如何設計類別 第一步:物件的規格 第二步:物件的封裝 第三步:物件的關係(內容較進階) 物件需要哪些資料 物件需要哪些行為
那些資料需要公有、那些卻得是私有 第三步:物件的關係(內容較進階) 物件間的關係 ...
17
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
18
想想看 若是網路上所有的帳戶都是一個個物件,那你 希望被別人看到或改變自己的資料嗎? 所以設定好權限是很重要的
帳號:可能需要被別人看到,但不希望人家改變 密碼:絕對不能讓別人看到,也不能讓別人改動 個人資料:有些可以讓別人看到,有些則不能 所以設定好權限是很重要的
19
C++的資料權限 public:公開的資訊,屬於public的成員資料、 函式都可以直接被外界使用,而這些成員我們 稱之「公開成員」
private:私人的資訊,屬於private的成員資料、 函式,都只能在這個類別內使用,外界無法碰 觸,稱之「私有成員」 C++資料封裝的原則:資訊最小化公開,能不 公開就不公開,需要公開時盡量使用方法(成員 函式)進行
20
C++的資料權限 想要使用或改變物件內的資料,有個簡單的小 原則:get and set
get:建立get成員函式,回傳私有資料,並且這份 回傳的資料必須是副本(跟原本的資料沒關係) set:建立set成員函式,讓使用者透過set函式,對 私有的資料進行有限的更動,通常一個set函式只能 針對一項成員資料進行更動 若不想更動物件內容時,可捨去set函式
21
例如.... #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: int length, width; int area() { return length*width; } }; int main() { Rectangle rect1; rect1.length = 20; rect1.width = 10; //可以被外界作任意更改 cout << "Area = " << rect1.area() << endl; system("pause"); return 0;
22
範例 #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: void setWidth(int w) { width = w; } int getWidth() { return width; void setLength(int l) { length = l; int getLength() { return length; int area() { return length*width; private: int length, width; }; int main() { Rectangle rect1; rect1.setLength(20); rect1.setWidth(10); cout << "Area = " << rect1.area() << endl; system("pause"); return 0;
23
練習 設計一個Circle(圓)類別,其中包含: 成員資料: 成員函式: int radius; //半徑
void setRadius(int r);//設定半徑 int getRadius();//取得半徑 double area();//回傳面積,圓面積=半徑x半徑x3.14
24
如何設計類別 第一步:物件的規格 第二步:物件的封裝 第三步:物件的關係(內容較進階) 這裡就已經是物件的很大的基礎了 物件需要哪些資料
物件需要哪些行為 第二步:物件的封裝 那些資料需要公有、那些卻得是私有 第三步:物件的關係(內容較進階) 物件間的關係 ... 事實上,第三步要前兩步都非常熟悉後才能使用及理解,而且這部分有永遠吵不完的架.....
25
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
26
建構子與解構子 在建立物件時,可以利用類別所定義的建構子 (constructor)初始化物件
而在物件釋放或消失前,可以利用類別定義的 解構子(destructor)進行善後的工作,如:釋放記 憶體
27
建構子 假設希望一開始就有一個長寬各為20、10的長 方形,我們應該如何處理? 建構子的宣告:類別名稱(參數1,參數2...)
使用建構子初始化 建構子的宣告:類別名稱(參數1,參數2...) 注意:建構子沒有回傳值!
28
範例 #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: Rectangle(int l, int w) { width = w; length = l; } void setWidth(int w) { int getWidth() { return width; void setLength(int l) { int getLength() { return length; int area() { return length*width; private: int length, width; }; //建立物件的方法: // Rectangle rect1(20, 10);
29
重載建構子 當你只有宣告有傳入參數的建構子時,建立物 件的時候必定要傳入參數,也就是要初始化物 件
但若是我有時候想要傳入參數,有時候又不想 怎麼辦? 解法:重載沒有參數的建構子 Rectangle()
30
範例 #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: Rectangle() { length = width = 0; } Rectangle(int l, int w) { width = w; length = l; void setWidth(int w) { int getWidth() { return width; void setLength(int l) { int getLength() { return length; int area() { return length*width; private: int length, width; }; //建立物件的方法: // Rectangle rect1(20, 10); // Rectangle rect2; // rect1 初始邊長 20 與 10 // rect2 初始邊長 0 與 0
31
解構子 在物件消失或是結束後,裡面有動態記憶體配 置的空間,我們需要釋放這些空間 解構子的宣告:~類別名稱()
使用解構子 解構子負責善後 解構子的宣告:~類別名稱() 注意:解構子沒有回傳值,也沒有參數
32
範例 #include <iostream> #include <cstdlib>
using namespace std; class Rectangle { public: Rectangle() { length = width = 0; } Rectangle(int l, int w) { width = w; length = l; ~Rectangle() { cout << "Q___Q\n"; void setWidth(int w) { int getWidth() { return width; void setLength(int l) { int getLength() { return length; int area() { return length*width; private: int length, width; }; // 物件結束時會印出哭臉
33
課程大綱 物件導向 類別 類別的構成 類別的成員 類別的權限 建構子與解構子 程式的分割
34
程式碼的分割 當在設計程式時,若是程式的函式、類別、資 料等程式碼非常多時,我們會將宣告與實作分 開至不同檔案
如:stdio.h:這裡面只有宣告,實作在別的地方 *.h:標頭檔,只放置宣告的檔案 *.c/*.cpp:實作檔,編譯時會加入整隻程式一起 編譯
35
範例:分割Rectangle Rectangle.h Rectangle.cpp class Rectangle { public:
#include "Rectangle.h" Rectangle::Rectangle() { length = width = 0; } Rectangle::Rectangle(int l, int w) { width = w; length = l; void Rectangle::setWidth(int w) { int Rectangle::getWidth() { return width; void Rectangle::setLength(int l) { int Rectangle::getLength() { return length; int Rectangle::area() { return length*width; class Rectangle { public: Rectangle(); Rectangle(int l, int w); void setWidth(int w); int getWidth(); void setLength(int l); int getLength(); int area(); private: int length, width; };
36
範例:分割Rectangle main.cpp #include <iostream>
#include "Rectangle.h" using namespace std; int main() { Rectangle rect(20, 10); cout << "Area = " << rect.area() << endl; system("pause"); return 0; }
Similar presentations