C++ note 2

看板NTUEE_Lab554作者 (我會更好)時間18年前 (2007/12/09 20:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
9 call by reference 呼叫參考 , return reference 回傳參考 (1)先複習一下 call by pointer class AAA { int value; public: AAA(int input=0){x=input;} friend void disp(AAA *x); }; void disp(AAA *x) { cout<<x->value<<endl; }; void main() { AAA a(4); disp(&a); } 這個例子把AAA a的address放到disp(AAA *pt)裡,disp再以pointer存取印出 (2)call by reference 呼叫參考 class AAA { int value; public: AAA(int input=0){x=input;} friend void disp(AAA &x); }; void disp(AAA &x) { cout<<x.value<<endl; } void main() { AAA a(4); disp(a); } 這裡的&代表為reference,可以視為別名 ps:這裡可以適當的使用const來限制呼叫的副函數,避免修改到原來的值 (3)以下為回傳參考 int x=10; int& change(int &x) { x+=5; return x;//回傳參考 } void main() { int &y=change(x); cout<<"x= "<<x<<endl; cout<<"y= "<<y<<endl; } 這裡輸出 x=15; y=15; 即main裡面的y和外部的x有共同的位址,兩個是一樣的東西 10 this 自己 (1)回傳自己的參考 class NUM { int x; public: NUM(int initial){x=initial;} NUM& add(int n) { x+=n; return *this; } disp() { cout<<"x= "<<x<<endl; return *this; } }; void main() { NUM a(100); a.add(50).disp().add(30).disp(); } 在這個例子中,add回傳NUM的參考,所以可以多次的呼叫add函數 (2)回傳自己的值 比較上例 class NUM { int x; public: NUM(int initial){x=initial;} NUM add(int n) //這裡沒有&了!!! { x+=n; return *this; } disp() { cout<<"x= "<<x<<endl; return *this; } }; void main() { NUM a(100); a.add(50).disp().add(30).disp(); } 在這個例子,雖然是回傳this,只是把所有NUM的東西copy一份丟回去,跟原來的東西 位址不同,輸出的結果也不同 11 constructor, destructor 建構子,解構子 (1) automatic object自動物件是存放在stack中,所以在解構時,以後進先除去 的原則 (2) lifecycle 外部物件>自動物件>副函數 12 overriding 重載/重新定義 polymorphism 多形 overriding:subclass重新定義superclass的function polymorphism:即superclass和subclass間因函數定義可不同,有不同的行為,此為多形 例: class SalesPerson { double total_amount; public: SalesPerson(double a) {total_amount=a;) double bonus() {return total_amount*0.008;} }; class SalesEngineer:public SalesPerson { public: SalesManager(double a) : SalesPerson(a) {}; double bonus() //跟superclass一樣的function,但不同定義 {return SalesPerson::bonus()+100.0;} } (1) 多形物件的指標: 父類別的指標可以指向子孫類別的物件,使用的函數為父函數 接上例 void main() { SalesPerson *p,x(20000.0); SalesEngineer y(10000.0); p=&x; cout<< p->bonus() <<endl; //160 p=&y; cout<< p->bonus() <<endl; //80,不是180 } 這種依照指標的型態來決定使用的函數稱作Early Binding,早期連結, 另外一種方式稱晚期連結Late Binding,接下來說明 (2) virtual function 虛擬函數 跟上例差不多 class SalesPerson { double total_amount; public: SalesPerson(double a) {total_amount=a;) virtual double bonus() //多了virtual 保留字 {return total_amount*0.008;} }; class SalesEngineer:public SalesPerson { public: SalesManager(double a) : SalesPerson(a) {}; double bonus() //自動繼承virtual {return SalesPerson::bonus()+100.0;} } void main() { SalesPerson *p,x(20000.0); SalesEngineer y(10000.0); p=&x; cout<< p->bonus() <<endl; //160 p=&y; cout<< p->bonus() <<endl; //180,不為80,跟上例不同 } 加上了virtual後,變成了late binding,會呼叫類別內的function,而不是依據 pointer內的function (3)abstract class 抽象類別 含存粹虛擬函數(pure virtual function)的類別稱之 (有點像是概念) 存粹虛擬函數的特徵為:函數的"指令(body)"從缺,例 class SalesPerson //因為含有存粹虛擬函數,所以為抽象類別 { float total_amount; public: SalesPerson(float a){total_amount=a;} virtual float bonus()=0; //一個存粹虛擬函式格式 } 13 Inheritance 繼承:簡單講就是子女會有父母的特性 (1)有三種繼承方式,以例子來說 public型 class square : public parallelogram super(父) public -> public sub(子) protected -> protected private -> 沒有被繼承(不能自由存取) protected型 class square : protected parallelogram super(父) public -> protected sub(子) protected -> protected private -> 沒有被繼承(不能自由存取) private型 class square : private parallelogram super(父) public -> private sub(子) protected -> private private -> 沒有被繼承(不能自由存取) ps:一個class的資料預設為private (2)建構子的繼承: 當一個新的子類別(subclass)物件被宣告的時候,會先呼叫 superclass的建構子,在用自己的建構子,以下例子說明 class A { public: A(){cout<<"constructor of A"<<endl;} ~A(){cout<<"destructor of A"<<endl;} } clss B : public A //B繼承A { public: B(){cout<<"constructor of B"<<endl;} ~B(){cout<<"destructor of B"<<endl;} } void main() { B b_object;} 則輸出為 constructor of A constructor of B destructor of B destructor of A deconstructor的呼叫順序與constructor相反,例 A繼承B B繼承C 宣告時,建構子的呼叫順序為A,B,C 刪除時,解構子的呼叫順序為C,B,A 14 array vs pointer int x[3]; int *p; p=&x[0]; //這裡也相當於 p=x; 則這裡 x[i] 等於 p[i] 等於 *(p+i) 5. 多重繼承 class son : public father , public monther 如果father,monther皆是繼承於person這個類別,則這兩個person的東西會被son 同時接收,造成衝突 To be continued -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.21.108 ※ 編輯: maxmilian 來自: 140.112.21.108 (12/10 14:06)
文章代碼(AID): #17M-AzKt (NTUEE_Lab554)