Download presentation
Presentation is loading. Please wait.
1
Class 2005/05/25
2
類別宣告 class Cat { public: int itsAge; int itsWeight; void Meow(); };
宣告一個類別就建立了一個新型態. 類別名稱 class Cat { public: int itsAge; int itsWeight; void Meow(); }; 類別的所有成員(所有變數跟方法)預設皆為private。 私有成員(private)只能在該類別的方法內存取, 公共成員(public)則可以被該類別的所有物件存取。 成員變數 成員函數 結束分號
3
函數 函數是一個能處理資料並返回一個值的副程式. 函數宣告: 返回值型態 函數名稱 ( 參數 ) ; 例:
返回值型態 函數名稱 ( 參數 ) ; 例: int Area(int length, int width); 每個函數都有返回型態,如未明顯指出,返回型態是int. 如果函數沒有返回值,返回型態應設為void. 定義函數: 返回值型態 函數名稱 ( 參數 ) { } 例: int Area(int length, int width) { //陳述句 return (length * width);
4
類別---定義物件 Cat Test; /*定義了類別為Cat的物件Test*/
物件是將類別實體化,如此才有配置記憶體空間,程式才能透過物件來存取類別中的成員變數與函數。 Cat Test; /*定義了類別為Cat的物件Test*/ 物件名稱 類別名稱 Memory space int itsAge; int itsWeight; void Meow(); Test
5
類別---存取類別成員 Test . itsAge = 5; Test . Meow (); 使用點運算子(.)來存取物件的成員
呼叫成員函數 Test . Meow ();
6
類別中的成員 類別的成員變數通常會預設為私有(private) 必須建立公共(public)的存取方法函數,來存取私有成員變數
class Cat { }; public: int GetAge(); void SetAge(int age); private: int itsAge;
7
範例1 class Circle { public: float x0,y0; float radius;
getCircumfrence()已經沒有傳入參數,因為它已經是Circle 的一份子,所以可以直接存取radius變數,而不需透過物件成員運算子(ex. c.radius) class Circle { public: float x0,y0; float radius; float getCircumfrence() return 2.0* *radius; } }; getCircumfrence()的宣告和定義都放在類別之內,這種宣告的方式稱為inline 函式宣告,優點是執行效率較高,但是編譯時產生的執行檔較冗長.
8
成員函式放在類別之外 也被稱為函數定義。 成員函數定義以類別名開始,然後是兩個冒號、函數名以及參數。 :: int Cat GetAge()
前面需加返回值型態 int Cat GetAge() { } return itsAge;
9
範例2 class Circle { public: float x0,y0; float radius;
float getCircumfrence(); }; float Circle::getCircumfrence() return 2.0* *radius; } 表示getCircumfrence()屬於Circle 的成員。
10
範例3 #include<iostream.h> #include<string.h>
class Reader //宣告類別 { private: char name[10]; public: long index; char *get_name() return name; } void set_name(char *); }; void Reader::set_name(char *i_name) { //Reader的成員函數,作字串copy strcpy(name,i_name); int main() { Reader A_Reader; char name[10]; cout<<"Please enter your name:"; cin>>name; A_Reader.index=1; A_Reader.set_name(name); cout<<"Your name is "; cout<<A_Reader.get_name(); cout<<"(index"<<A_Reader.index; cout<<")\n"; return 0; }
11
範例4 #include<iostream.h> #include<string.h>
class String1 //宣告類別 { private: char *str; int len; public: void show_string(); void set_string(char *); }; void String1::show_string() cout<<"string:"<<str << " \nlength:"<<len<<endl; } void String1::set_string(char *i_string) { len=strlen(i_string); str=new char[len+1]; strcpy(str,i_string); } int main() String1 A_String; char i_string[12]="Hello Kitty"; A_String.set_string(i_string); A_String.show_string(); return 0;
12
建構子(建立者constructor) 類別有一個特別的成員函數,稱為建構子。用來初始化類別中的成員資料。
建構子可以接收參數,但不能返回值,即使是void,也不能。 建構子是一個與類別同名的類別方法。 沒有宣告建構子時,編譯器將自動產生一個預設的建構子。 預設的建構子沒有參數,而且什麼也不做。 物件作實體化時,會自動啟動建構子。 一定要設成public 。
13
用建構子初始化 我們可以自己寫預設建構子,並且在預設建構子中寫一個用於初始化類別的函數體。 宣告Cat 類別
類別名稱 兩個冒號 傳入的參數 class Cat { }; Cat :: Cat 與類別同名的類別方法 (int initialAge) pubilc: private: 在public中寫一個預設建構子 Cat() 注意: 建構子無返回值,連void也不能有。 { } Cat(); itsAge = initialAge; int itsAge; 將 initialAge 的值指定給成員變數 itsAge
14
解構子(破壞者destructor) 每當宣告建構子時,就應同時宣告一個解構子。 沒有宣告解構子時,編譯器將自動產生一個。
解構子總是帶有類別名,前面是一個否定號(~)。 不可作overloading 。 兩個冒號 否定號加類別名 類別名稱 Cat :: ~Cat() { }
15
多載函數 C++允許建立多個同名函數,這就叫做函數重載 。
這些函數的參數必須不相同,或者是參數型態不同,或者是參數數目不同,或者是兩者都不同 。 型 態 不 同 int myFunction(int , int) int myFunction(long , long) 型態、參數 數目都不同 int myFunction(long)
16
多載建構子 建構子與類別的成員函數都可以像函數一樣重載。 class Cat { public: Cat( ); private: }
宣告 Cat類別 class Cat { } 預設建構子 public: private: Cat( ); Cat(int initialage); 接收1整數變數的建構子 int itsAge;
17
建立參考(將位址傳入) 建立參考時,需使用另一個物件名來初始化 。 對參考所做的一切會真正地作用到目標之上 。 建立參考:
先寫目標物件的型態, 然後是參考運算子(&), 再加上參考名﹝可以是任何合法的變數名﹞ 範例:建立一個對整數變數的參考 int intOne; int & rSomeRef = intOne;
Similar presentations