C++\u7269\u4ef6\u5c0e\u5411\u53ca\u589e\u9032\u6548\u7387\u7a0b\u5f0f\u6280\u5de7.pdf - \u524d\u8a00 \u672c\u7bc7\u6559\u5b78\u6587\u7ae0\u5206\u70ba\u5169\u500b\u90e8\u5206\u3002 \u7b2c\u4e00\u500b\u90e8\u5206\u662f\u5c0d\u57fa\u790e\u7684 C

C++u7269u4ef6u5c0eu5411u53cau589eu9032u6548u7387u7...

This preview shows page 1 - 5 out of 44 pages.

前言 本篇教學文章分為兩個部分。 第一個部分是對基礎的 C++ 物件導向程式作文獻的整理與說明,而物件導向是 C C++ 差異最大的地方,所以建議大家在進入物件導向程式之前,可以先複習 C C++ 更基礎的資料結構、控制結構、函數或指標的使用與宣告,這可以使我們 更透徹地了解物件導向程式與非物件導向程式的差異。 第二個部分是介紹一些可以增進程式生產效率的技巧,像利用最佳化編譯器可以 簡單使程式運行速度增加;利用前置處理器可以使 debug 更加的容易;利用資料 流重導向與讀檔的技巧使我們在分析大量程式結果更加簡單;利用撰寫腳本讓程 式可以自動化的執行;選擇適當的資料結構與運算子讓變數讀寫或計算更快速。 Part 1. C++ 物件導向程式技巧 1. Classes ( 類別 ) 類別是將資料以及函數組織在同一個結構的方法。類別的關鍵字為 class ,功能 C 語言的 struct 類似,不過 C 語言中的 struct 只能包含資料,不能包含函數。 class 宣告的形式如下: 其中, class_name 是用戶定義的類別名稱,而 object_name 是一個或多個宣告的 物件名稱。 class 宣告的內部包含可以是資料或函數的成員,以及表示權限範圍 的標示 permission labels ,權限範圍標示可以是以下三個關鍵字任意一個: private:, public: protected: 它們的意義如下所示: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name;
Image of page 1
private class private 成員,只有同一個 class 的其他成員或該 class friend” class 可以使用這些成員。 protected class protected 成員,只有同一個 class 的其他成員,該 class 的“ friend” class ,或該 class derived classes ( 子類別 ) 可以使用這些成員。 public class public 成員,任何可以看到這個 class 的地方都可以使用這 些成員。 如果我們在定義一個 class 成員的時候沒有宣告其允許範圍,這些成員將被默認 private 範圍。 例如: 上面例子定義了一個 class CRectangle 和宣告了該 class 的物件變數 rect 。這個 class 4 個成員:屬於 private 部分的兩個整數變數 x y ( 因為 private 是默 認的允許範圍 ) ;以及屬於 public 部分的兩個函數: set_values() area() ,這裡 只包含了函數的 prototype ( 原型 ) 注意 class 名稱與物件 (object) 名稱的不同:在上面的例子中, CRectangle class 名稱 ( 即用戶定義的類型名稱 ) ,而 rect 是一個屬於 CRectangle 類型的物件名稱。 它們的區別就像下面例子中類型名 int 變數名 a 的區別一樣: int 就相當於是 class 名稱,而 a 是屬於 int 的物件名稱。 在程式中,我們可以通過使用物件名後面加一點再加成員名稱(同使用 C structs 一樣),來引用物件 rect 的任何 public 成員,就像它們只是一般的函數或變數。 例如: 但我們不能夠引用 x y ,因為它們是該 class private 成員,它們只能夠 在該 class 的其它成員中被引用。下面是關於 class CRectangle 的一個較完整的例 子: rect.set_value (3,4); myarea = rect.area(); int a; class CRectangle { int x, y; public: void set_values (int,int); int area (void); } rect;
Image of page 2
上面程式碼中,使用範圍運算子 ( 雙冒號 :: ) 在一個 class CRectangle 之外定義該 class 函數成員 set_values(). 。注意,我們在 class CRectangle 內部已經定義了函數 area() 的內容,因為這個函數非常簡單。而對函數 set_values() ,在 class 內部只 是定義了它的原型 prototype ,而其操作內容是在 class 之外定義的。這種在 class 之外定義其成員的情況必頇使用範圍運算子 :: 範圍運算子 (::) 宣告了被定義的成員所屬的 class 名稱,並賦予被定義成員適當 的範圍屬性,這些範圍屬性與在 class 內部定義成員的屬性是一樣的。例如,在 上面的例子中,我們在函數 set_values() 中引用了 private 變數 x y ,這些變數 只有在 class 內部和它的成員中才是可見的。 class 內部直接定義完整的函數,和只定義函數的原型而把具體實現放在 class 外部的唯一區別在於,在第一種情況中,編譯器 (compiler) 會自動將函數作為 inline 考慮,而在第二種情況下,函數只是一般的 class 成員函數。 我們把 x y 定義為 private 成員 ( 記住,如果沒有特別宣告,所有 class 的成 員均默認為 private ) ,原因是我們已經定義了一個設置這些 private 變數值的函數 (set_values()) 。這樣一來,能保護 private 成員在程式的其它地方就沒有辦法直 接使用它們。也許在一個這樣簡單的例子中,你無法看到這樣保護兩個變數有什 麼意義,但在比較複雜的程式中,這是非常重要的,因為它使得變數不會被意外 修改 (只能在允許使用此物件的範圍內修改)。 使用 class 的一個更大的好處是我們可以用它來定義多個不同物件 (object) 。例如, area: 12 // classes example #include <iostream.h> class CRectangle { int x, y; public: void set_values (int,int); int area (void) {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); }
Image of page 3
接著上面 class CRectangle 的例子,除了物件 rect 之外,我們還可以定義物件 rectb 注意 : 調用函數 rect.area() 與調用 rectb.area() 所得到的結果是不一樣的。這是因 為每一個 class CRectangle 的物件都擁有它自己的變數 x y ,以及它自己的 函數 set_value() area() 這是基於物件 ( object) 物件導向程式設計 (object-oriented programming) 的概 念的。這個概念中,資料和函數是物件 (object) 的屬性 (properties) ,而不是像以前 在結構化程式設計
Image of page 4
Image of page 5

  • Left Quote Icon

    Student Picture

  • Left Quote Icon

    Student Picture

  • Left Quote Icon

    Student Picture