一、指針的概念
char str[] = “ABCDEFG”; char *pc = str; //pc是指向string str的指針 short x = 33; short *px = &x; //px是指向short x的指針 cout << *pc << endl; //這條語句將打印字符‘A’ pc += 4; //指針向右移動4指向第5個字符 cout << *pc << endl; //這時這條語句將打印字符‘E’ pc--; //向左移動指針 cout << *pc << endl; //這時這條語句將打印字符‘D’ cout << *px + 3 << endl; //這條語句打印36因為=33+3
在 C 程序中,假設我們已定義了以下的幾個變量及函數: int k, tem, *P1, *P2, a[5], f(), *P3(); 以下的設定敘述(Assignment statements)中, 那些有語法上的錯誤? 并請說明其原因
1.P1 = &k; 2.P2 = a; 3.P3 = f; 4.P1 = &a[3]; 5.P1 = P2;
答案: (1) P1 = &k; P1是指針變量, 因此P1表位址,而k表示一般變量,&k表示取出k的位址,故正確. (2) P2 = a; a是數組名稱,此時可代表數組存放在內存中的起始位址,而P2為指針變量,故正確. (3) P3 = f; f代表函數的名稱,此時代表呼叫函數f,因此含有傳回值,而P3為指針變量,故此式有錯誤. (4) P1 = &a[3];P1表指針變量,代表位址,而&a[3]表取出索引(index)為3的數組元素的位址,故正確. (5) P1 = P2; P1,P2皆為指針變量代表位址,此敘述是指將P2的位址指定給P1,故正確.
結構的概念 結構是一種類型,它的成員默認是public.
struct Student //定義一個結構Student用來存放學生的資料 { int id; //編號 char name[30]; //名字 } Student s = {555, “Davis, Samuel”}; //初始化Student的實例s cout << s.id << “ “ << s.name << endl; //這條將打印“ 555 Davis,Samuel”
類的概念我想大家都應該很清楚了,我就不廢話了。
類的繼承的概念 class base { private: int a; protected: int b; public: int c; }; class sub1:public base {…}; class sub2:private base{…};
說明在base,sub1,sub2中所能取用的data members各為何.并指出這些data members的access mode(private, protected或public). Ans: class data members access mode base a private b protected c public sub1 b protected c public sub2 b private c private
虛函數和抽象類
多態 (polymorphism) 面向對象程設計的核心觀念之一就是多態--它使一群類似的行為的同名稱的方法, 但各對象可依適合自己所需的方式建構此同名動作的實行細節, C++多態的關鍵在于所謂的虛函數這一類的函數。
虛函數(virtual function) 透過虛擬函數, 衍生類可重新定義基類的成員函數, 若想在C++程式中建立虛擬函數(然後才能實行多態), 只需利用virtual關鍵字聲明函數即可(如下所示) virtual void Display(); 虛函數的用處 針對共享相同基類的那些對象, 可有較一致的使用態度, 例如, 你可能定義一個名為Shape且帶有一 個Draw虛擬成員函數的基類, 然后從它派生了Circle類和Square類, 而且它們各自帶有自己的Draw成員函數.從這些類派生建立的每個對象都可呼叫Draw成員函數; 但是編譯程式可確保各自應呼叫那個版本的Draw 函數.是基類的還是派生類的。
一個例子
重要觀念: 指向父類的指針也可用來指向子類別
#include <iostream.h> class BaseClass { public: virtual void Display( ) { cout << 100 << "\n"; } }; class DerivedClass: public BaseClass { public: virtual void Display( ) { cout << 200 << "\n"; } }; void Print(BaseClass* pbc) { pbc->Display( ); } int main( ) { BaseClass* pbc = new BaseClass; DerivedClass* pdc = new DerivedClass; Print(pbc);//顯示 100 Print(pdc);//顯示 200 return 0; }
V-table (Virtual function table) 當C++程式呼叫非虛函數, 采用與C程式呼叫函數所用方式一樣的靜態綁定來呼叫函數. 但是C++程式 若是透過指向類別的指針來呼叫虛函數時, 編譯程式則采用所謂的晚期綁定(late binding)或靜態綁定 (static binding)技術來呼叫函數. 而C++虛函數用虛函數表(virtual function table), 或稱V-表來實作動態綁定, 所謂的V-表是一 個函數指針的陣列, 這是編譯程序替每個使用虛函數的類所建制的。
純虛函數 (pure virtual function) 一個不僅可被重新定義, 而且必須被重新定義的成員函數就稱為純虛函數, 你只要指定函數一個零值 (更有效說法是一個空指針),就可將虛成員函數轉為純虛成員函數,如以下所示 virtual void PrintData() = 0;
抽象類 (abstract class) 當一個類含有至少一個純虛函數時, 此類就稱為抽象類,而你無法以此類來衍生建立對象.
C++ template classes
一般的聲明及使用 class Collection { … int A[10]; } Collection object; 模板的聲明及使用 template <class T> //注意這里 class Collection { … T A[10]; }// generic declaration Collection<int> object; //注意這里 Collection<char> object; //注意這里
|