170 likes | 257 Views
Class. 2005/05/25. 類別的所有成員 ( 所有變數跟方法 ) 預設皆為 private 。 私有成員 (private) 只能在該類別的方法內存取 , 公共成員 (public) 則可以被該類別的所有物件存取。. 成員變數. 成員函數. 類別宣告. 宣告一個類別就建立了一個新型態. class Cat { public: int itsAge; int itsWeight; void Meow(); };. 類別名稱. 結束分號. 函數. 函數是一個能處理資料並返回一個值的副程式. 函數宣告 :
E N D
Class 2005/05/25
類別的所有成員(所有變數跟方法)預設皆為private。私有成員(private)只能在該類別的方法內存取, 公共成員(public)則可以被該類別的所有物件存取。 成員變數 成員函數 類別宣告 • 宣告一個類別就建立了一個新型態. classCat { public: int itsAge; int itsWeight; void Meow(); }; 類別名稱 結束分號
函數 • 函數是一個能處理資料並返回一個值的副程式. • 函數宣告: 返回值型態 函數名稱 ( 參數 ) ; 例: int Area(int length, int width); 每個函數都有返回型態,如未明顯指出,返回型態是int. 如果函數沒有返回值,返回型態應設為void. • 定義函數: 返回值型態 函數名稱 ( 參數 ) { } 例: int Area(int length, int width) { //陳述句 return (length * width); }
類別---定義物件 • 物件是將類別實體化,如此才有配置記憶體空間,程式才能透過物件來存取類別中的成員變數與函數。 Cat Test; /*定義了類別為Cat的物件Test*/ 物件名稱 類別名稱 Memory space int itsAge; int itsWeight; void Meow(); Test
類別---存取類別成員 • 使用點運算子(.)來存取物件的成員 Test . itsAge = 5; • 呼叫成員函數 Test . Meow ();
類別中的成員 • 類別的成員變數通常會預設為私有(private) • 必須建立公共(public)的存取方法函數,來存取私有成員變數 class Cat { }; public: int GetAge(); void SetAge(int age); private: int itsAge;
範例1 getCircumfrence()已經沒有傳入參數,因為它已經是Circle 的一份子,所以可以直接存取radius變數,而不需透過物件成員運算子(ex. c.radius) • class Circle • { • public: • float x0,y0; • float radius; • float getCircumfrence() { return 2.0*3.14159*radius; } • }; getCircumfrence()的宣告和定義都放在類別之內,這種宣告的方式稱為inline 函式宣告,優點是執行效率較高,但是編譯時產生的執行檔較冗長.
兩個冒號 Cat :: 成員函式放在類別之外 • 也被稱為函數定義。 • 成員函數定義以類別名開始,然後是兩個冒號、函數名以及參數。 前面需加返回值型態 int GetAge() { } return itsAge;
範例2 • class Circle • { • public: • float x0,y0; • float radius; • float getCircumfrence(); • }; • float Circle::getCircumfrence() • { • return 2.0*3.14159*radius; • } 表示getCircumfrence()屬於Circle 的成員。
#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; } 範例3
#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; } 範例4
建構子(建立者constructor) • 類別有一個特別的成員函數,稱為建構子。用來初始化類別中的成員資料。 • 建構子可以接收參數,但不能返回值,即使是void,也不能。 • 建構子是一個與類別同名的類別方法。 • 沒有宣告建構子時,編譯器將自動產生一個預設的建構子。 • 預設的建構子沒有參數,而且什麼也不做。 • 物件作實體化時,會自動啟動建構子。 • 一定要設成public 。
宣告Cat 類別 類別名稱 傳入的參數 在public中寫一個預設建構子 Cat() 與類別同名的類別方法 注意: 建構子無返回值,連void也不能有。 將 initialAge的值指定給成員變數 itsAge 用建構子初始化 • 我們可以自己寫預設建構子,並且在預設建構子中寫一個用於初始化類別的函數體。 兩個冒號 class Cat (int initialAge) { }; Cat :: Cat pubilc: private: { } Cat(); itsAge = initialAge; int itsAge;
類別名稱 否定號加類別名 解構子(破壞者destructor) • 每當宣告建構子時,就應同時宣告一個解構子。 • 沒有宣告解構子時,編譯器將自動產生一個。 • 解構子總是帶有類別名,前面是一個否定號(~)。 • 不可作overloading 。 兩個冒號 Cat :: ~Cat() { }
型 態 不 同 型態、參數 數目都不同 多載函數 • C++允許建立多個同名函數,這就叫做函數重載 。 • 這些函數的參數必須不相同,或者是參數型態不同,或者是參數數目不同,或者是兩者都不同 。 int myFunction(int , int) int myFunction(long , long) int myFunction(long)
宣告 Cat類別 預設建構子 接收1整數變數的建構子 多載建構子 • 建構子與類別的成員函數都可以像函數一樣重載。 class Cat { } public: private: Cat( ); Cat(int initialage); int itsAge;
建立參考(將位址傳入) • 建立參考時,需使用另一個物件名來初始化 。 • 對參考所做的一切會真正地作用到目標之上 。 • 建立參考: 先寫目標物件的型態, 然後是參考運算子(&), 再加上參考名﹝可以是任何合法的變數名﹞ 範例:建立一個對整數變數的參考 int intOne; int & rSomeRef = intOne;