Presentation is loading. Please wait.

Presentation is loading. Please wait.

第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係.

Similar presentations


Presentation on theme: "第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係."— Presentation transcript:

1 第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係

2 13-1 常數物件與成員 - 說明 C++ 語言的 const 關鍵字可以用來修飾變 數、函數、函數參數、指標、物件和成員 函數等,例如: const 修飾的變數是宣告常 數,在函數的參數使用 const ,表示函數中 不允許更改參數值。 C++ 語言的 const 關鍵字可以用來修飾變 數、函數、函數參數、指標、物件和成員 函數等,例如: const 修飾的變數是宣告常 數,在函數的參數使用 const ,表示函數中 不允許更改參數值。 對於物件來說, const 關鍵字可以授予物件 權限,因為我們可以使用 const 關鍵字來限 制物件不能修改,或指定成員函數不能修 改物件內容。 對於物件來說, const 關鍵字可以授予物件 權限,因為我們可以使用 const 關鍵字來限 制物件不能修改,或指定成員函數不能修 改物件內容。

3 13-1 常數物件與成員 - 常數成員資料 與函數 ( 說明 ) 在 C++ 類別除了建構子和解構子外,成員資料和 函數都可以使用 const 關鍵字來修飾。例如:帳 戶類別 account 的宣告,如下所示: 在 C++ 類別除了建構子和解構子外,成員資料和 函數都可以使用 const 關鍵字來修飾。例如:帳 戶類別 account 的宣告,如下所示: class account { private: double amount; double amount; const double rate; const double rate;public: account(double a, double r); account(double a, double r); double getInterest() const; double getInterest() const; void printAccount() const; void printAccount() const;};

4 13-1 常數物件與成員 - 常數成員資料 與函數 ( 初始常數值 ) 對於類別中的常數,我們只能在建構子使 用成員初始語法( Member Initializer Syntax )來指定其值,如下所示: 對於類別中的常數,我們只能在建構子使 用成員初始語法( Member Initializer Syntax )來指定其值,如下所示: account::account(double a,double r) : rate(r),amount(a) { } 上述建構子「 : 」符號之後就是成員初始語 法,因為初始多個成員函數,所以使用「, 」 逗號分隔。 上述建構子「 : 」符號之後就是成員初始語 法,因為初始多個成員函數,所以使用「, 」 逗號分隔。

5 13-1 常數物件與成員 - 常數物件 在使用類別宣告物件變數時,也可以使用 const ,如下所示: 在使用類別宣告物件變數時,也可以使用 const ,如下所示: const date open(30, 1, 2006); 上述物件變數 open 是一個常數物件,表示 物件不允許修改,換句話說,常數物件一 定擁有常數的成員函數。 上述物件變數 open 是一個常數物件,表示 物件不允許修改,換句話說,常數物件一 定擁有常數的成員函數。

6 13-2 物件成員與巢狀類別 13-2-1 物件成員 13-2-1 物件成員 13-2-2 巢狀類別 13-2-2 巢狀類別

7 13-2-1 物件成員 -student 類別 在 C++ 類別宣告的成員資料除了可以使用資料型 態、結構和陣列變數外,也可以使用其他類別的 物件變數。例如: student 類別的宣告擁有 date 物件的成員資料,如下所示: 在 C++ 類別宣告的成員資料除了可以使用資料型 態、結構和陣列變數外,也可以使用其他類別的 物件變數。例如: student 類別的宣告擁有 date 物件的成員資料,如下所示: class student { private: int id; int id; double test1, test2, test3; double test1, test2, test3; date *birthday; date *birthday; double getAverage() const; double getAverage() const;public: student(int id, int d, int m, int y); student(int id, int d, int m, int y); void setTest(double t1, double t2, double t3); void setTest(double t1, double t2, double t3); void printStudent() const; void printStudent() const;};

8 13-2-1 物件成員 -date 類別 date 類別宣告,如下所示: date 類別宣告,如下所示: class date { private: int day, month, year; int day, month, year;public: date(int d, int m, int y); date(int d, int m, int y); void printDate() const; void printDate() const;};

9 13-2-2 巢狀類別 - 說明 巢狀類別( Nested Class )強調類別之間 的組成關係,例如:學生擁有成績資料, 所以 test 類別屬於 student 類別的一部分。 巢狀類別( Nested Class )強調類別之間 的組成關係,例如:學生擁有成績資料, 所以 test 類別屬於 student 類別的一部分。 student 類別擁有成員類別 test 的「內層類 別」( Inner Classes ),而 student 是巢 狀類別的「外層類別」( Enclosing Class ),內層類別可以位在 private 、 protected (第 15 章說明)和 public 區塊。 student 類別擁有成員類別 test 的「內層類 別」( Inner Classes ),而 student 是巢 狀類別的「外層類別」( Enclosing Class ),內層類別可以位在 private 、 protected (第 15 章說明)和 public 區塊。

10 13-2-2 巢狀類別 - 範例 class student { // student 外層類別宣告 private: int id; int id; class test { // test 內層類別宣告 class test { // test 內層類別宣告 private: private: double score; double score; public: public: double getScore() const { return score; } double getScore() const { return score; } void setScore(double s) { score = s; } void setScore(double s) { score = s; } }; }; test quiz; test quiz;public: student(int no) : id(no) {} student(int no) : id(no) {} void setScore(double t); void setScore(double t); void printStudent() const; void printStudent() const;};

11 13-2-2 巢狀類別 - 存取說明 內層類別如果位在 private 區塊,其存取範圍只限 外層類別之內;如果位在 public 區塊,其存取範 圍是全域。 內層類別如果位在 private 區塊,其存取範圍只限 外層類別之內;如果位在 public 區塊,其存取範 圍是全域。 內層類別如果位在 private 區塊,外層類別的成員 並不能存取或呼叫內層類別宣告成 private 的成員, 只能存取宣告成 public 的成員。例如: printStudent() 成員函數不能直接存取成員資料 score ,需要呼叫 test 類別的 getScore() 成員函 數,才能取得成績資料。 內層類別如果位在 private 區塊,外層類別的成員 並不能存取或呼叫內層類別宣告成 private 的成員, 只能存取宣告成 public 的成員。例如: printStudent() 成員函數不能直接存取成員資料 score ,需要呼叫 test 類別的 getScore() 成員函 數,才能取得成績資料。 內層類別如果位在 public 區塊,外層類別的成員 同樣不能存取或呼叫內層類別宣告成 private 的成 員,不過 public 成員的存取範圍則是全域。 內層類別如果位在 public 區塊,外層類別的成員 同樣不能存取或呼叫內層類別宣告成 private 的成 員,不過 public 成員的存取範圍則是全域。

12 13-3 靜態成員資料與函數 - 說明 在 C++ 的類別宣告中,宣告成 static 的變 數和函數是屬於類別。 在 C++ 的類別宣告中,宣告成 static 的變 數和函數是屬於類別。 當建立物件時,並不會替每一個物件建立 獨立的靜態成員資料與函數,所有此類別 建立的物件,都是使用同一份靜態成員變 數和呼叫同一個靜態函數。 當建立物件時,並不會替每一個物件建立 獨立的靜態成員資料與函數,所有此類別 建立的物件,都是使用同一份靜態成員變 數和呼叫同一個靜態函數。

13 13-3 靜態成員資料與函數 - 宣告類別 的靜態成員資料與函數 靜態成員資料與函數是使用 static 關鍵字進行宣 告。例如: student 類別新增靜態變數 teacherNo 、 count 和靜態成員函數 getStudentCount() ,如下所示: 靜態成員資料與函數是使用 static 關鍵字進行宣 告。例如: student 類別新增靜態變數 teacherNo 、 count 和靜態成員函數 getStudentCount() ,如下所示: class student { private: ……… ……… static int count; static int count;public: ………… ………… static int teacherNo; static int teacherNo; static int getStudentCount() { return count; }; static int getStudentCount() { return count; };};

14 13-3 靜態成員資料與函數 - 初始靜態 資料 在 ANSI-C++ 類別宣告中的靜態資料都只 有宣告,並沒有真正定義變數和指定初值, 我們需要額外初始類別的靜態變數,其位 置是在類別宣告外的全域變數,如下所示: 在 ANSI-C++ 類別宣告中的靜態資料都只 有宣告,並沒有真正定義變數和指定初值, 我們需要額外初始類別的靜態變數,其位 置是在類別宣告外的全域變數,如下所示: int student::count = 0; int student::teacherNo = 200; 上述程式碼使用範圍運算子「 :: 」來定義靜 態變數和指定初值。 上述程式碼使用範圍運算子「 :: 」來定義靜 態變數和指定初值。

15 13-3 靜態成員資料與函數 - 存取靜態 資料與呼叫靜態函數 在程式碼存取類別的靜態變數和呼叫靜態 函數時,也需要使用範圍運算子,如下所 示: 在程式碼存取類別的靜態變數和呼叫靜態 函數時,也需要使用範圍運算子,如下所 示: cout << "\n 學生數 (student): " << student::getStudentCount(); student::getStudentCount(); student::teacherNo = 201;

16 13-4 朋友關係 13-4-1 朋友函數 13-4-1 朋友函數 13-4-2 朋友類別 13-4-2 朋友類別

17 13-4 朋友關係 - 說明 C++ 語言的朋友關係可以分為朋友函數 ( Friend Functions )和朋友類別 ( Friend Class )兩種。程式是使用 friend 關鍵字來宣告和建立函數和類別間的 朋友關係。 C++ 語言的朋友關係可以分為朋友函數 ( Friend Functions )和朋友類別 ( Friend Class )兩種。程式是使用 friend 關鍵字來宣告和建立函數和類別間的 朋友關係。 朋友關係是 C++ 語言一種功能十分強大的 功能,因為朋友函數或類別擁有權限,可 以存取其他類別隱藏的成員資料,不過, 在使用上需要十分注意。 朋友關係是 C++ 語言一種功能十分強大的 功能,因為朋友函數或類別擁有權限,可 以存取其他類別隱藏的成員資料,不過, 在使用上需要十分注意。

18 13-4 朋友關係 - 特點 朋友關係是由類別所授予:類別 A 授予函數 b() 或 類別 B 擁有朋友關係,而不是 b() 或 B 向 A 取得朋友 關係。 朋友關係是由類別所授予:類別 A 授予函數 b() 或 類別 B 擁有朋友關係,而不是 b() 或 B 向 A 取得朋友 關係。 朋友關係是單方向:如果 A 認定 B 是朋友,並不表 示 B 是 A 的朋友。 朋友關係是單方向:如果 A 認定 B 是朋友,並不表 示 B 是 A 的朋友。 朋友關係無法繼承:如果 A 是 B 的朋友,並不表示 繼承自 A 的類別 C 是 B 的朋友,關於繼承的說明請 參閱第 15 章。 朋友關係無法繼承:如果 A 是 B 的朋友,並不表示 繼承自 A 的類別 C 是 B 的朋友,關於繼承的說明請 參閱第 15 章。 朋友關係沒有遞移性( Transitive ):如果 A 是 B 的朋友, B 是 C 的朋友,並不表示 A 是 C 的朋友。 朋友關係沒有遞移性( Transitive ):如果 A 是 B 的朋友, B 是 C 的朋友,並不表示 A 是 C 的朋友。

19 13-4-1 朋友函數 - 說明 對於不屬於 C++ 類別的成員函數或一般函 數來說,函數並不能存取類別宣告成 private 或 protected (在第 15 章說明)區 塊的成員,如果函數需要存取 private 或 protected 成員,在 C++ 語言可以使用 friend 關鍵字授予其他函數的朋友關係,即 朋友函數。 對於不屬於 C++ 類別的成員函數或一般函 數來說,函數並不能存取類別宣告成 private 或 protected (在第 15 章說明)區 塊的成員,如果函數需要存取 private 或 protected 成員,在 C++ 語言可以使用 friend 關鍵字授予其他函數的朋友關係,即 朋友函數。 不過,朋友函數並不是類別的成員函數, 但是授予朋友關係後,朋友函數可以存取 類別位在 private 和 protected 區塊宣告的 成員。 不過,朋友函數並不是類別的成員函數, 但是授予朋友關係後,朋友函數可以存取 類別位在 private 和 protected 區塊宣告的 成員。

20 13-4-1 朋友函數 - 一般函數的朋友函 數 第 5 章的函數也可以成為類別的朋友函數。例如: 類別 circle 授予 getRadius() 函數成為它的朋友函 數,如下所示: 第 5 章的函數也可以成為類別的朋友函數。例如: 類別 circle 授予 getRadius() 函數成為它的朋友函 數,如下所示: class circle { private: int radius; int radius;public: circle(int r) : radius(r) {} circle(int r) : radius(r) {} void print(point &p); void print(point &p); friend int getRadius(circle &c); friend int getRadius(circle &c);};

21 13-4-1 朋友函數 - 成員函數的朋友函 數 類別的成員函數也可以宣告成朋友函數。例如: 在 point 類別授予 circle 類別的 print() 成員函數為 朋友關係,如下所示: 類別的成員函數也可以宣告成朋友函數。例如: 在 point 類別授予 circle 類別的 print() 成員函數為 朋友關係,如下所示: class point { private: int x, y; int x, y;public: …… …… friend void circle::print(point &p); friend void circle::print(point &p);};


Download ppt "第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係."

Similar presentations


Ads by Google