第九章 物件導向-進階
9.1 “This” 指標 this 指標: 指向物件本身所在的位置: 當程式碼只有一份時,不同的物件需要 一個自己的指標指向自己,用以區別. Compiler會自己加入,this指標.
9.1 “This” 指標 例: 編譯器會自己修改成 實際呼叫時 class String { char *data; ….. Void show( ) { cout << data;} } String s1=“Ken”, s2=“Sue”; s1.show( ); s2.show( ); void show( String *this) {cout << this ->data;} show(&s1); show(&s2); 實際呼叫時
9.1 “This” 指標 例: 編譯器認得this / this指標的範例一 #include <iostream.h> class Baby { private : char Name[16]; // 注意這兒,我宣告的大小是16 public : void Demo() cout << "Address = " << this << endl; } }; // 主程式 void main() Baby Julia, Amy; Julia.Demo(); Amy.Demo(); 編譯器認得this
9.1 “This” 指標 結果: Address = 0x0064FDD8 Address = 0x0064FDE8
9.1 “This” 指標 例: // this指標的範例二 #include <iostream.h> #include <string.h> class Baby { private : char Name[16]; public : Baby( char *name ) strcpy( this->Name, name ); } void Demo() cout << "我的名字叫" << this->Name << endl; };
9.1 “This” 指標 例: // 主程式 void main( ) { // 主程式 void main( ) { Baby Julia( "Julia" ), Amy( "Amy" ); Julia.Demo( ); Amy.Demo( ); }
9.1 “This” 指標 例: this的功能 // this指標的範例三 #include <iostream.h> class MYINT { private : int nData; public : MYINT( int data = 0 ) nData = data; } void Assign( MYINT a ) nData = a.nData; void Show( ) cout << nData << endl; } MYINT& Add1( ) { ++nData; return *this; }; // 主程式 void main() MYINT a = 5, b = 3; a.Assign( b.Add1( ) ); //相當於a = ++b; a.Show( ); //要顯示4在螢幕上
9.2 虛擬指標 例: 虛擬函數(virtual) 在編譯時就依宣告 的型別連接函數
9.2 虛擬指標 例: 虛擬函數(virtual) 在編譯時並不做連接 執行時才做 函數的連接
9.2 虛擬指標 例: 虛擬函數(virtual) Overloaded (重載) : 編譯時決定呼叫的函數 Polymorphism(多型): 執行時才決定呼叫的函數
9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) 不應該產生一個 instant為shape virtual viod Shape::Show( ) { cout<<“爸爸是抽象類別”<<endl; }
9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) ? Main( ) { Shape Graph; Graph.Show; }
9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) virtual viod Shape::Show( )=0 { cout<<“爸爸是抽象類別”<<endl; }
9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) Shape2.cpp
9.2 純粹虛擬函數 9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) Baby.cpp
9.2 純粹虛擬函數 9.2 純粹虛擬函數 例: 純粹虛擬函數(abstract class) vptr vFunc1 GrandFather::vFunc1( ) cData vFunc2 GrandFather::vFunc2( ) fGrandFather vptr vFunc1 GrandFather::vFunc1( ) cData vFunc2 Father::vFunc2( ) fGrandFather fFather
9.3 friend 函數 例: friend 函數 class A { private: int privateA; } class B A memberA; public: viod Demo( ) { memberA.privateA=5;} };
9.3 friend 函數 例: friend 函數 class A { private: friend class B; int privateA; } class B A memberA; public: viod Demo( ) { memberA.privateA=5;} };
9.3 friend 函數 例: friend 函數 calss A { private: int privateA; public: friend void Assign( A Data1, A Data2) Data1.privateA=Data2.private2; }