1. 程式人生 > 其它 >侯捷——c++面向物件思維

侯捷——c++面向物件思維

大學PPT老師教出來的c++,的確讓我沒有啥面向物件的思維。於是乎開始努力建立起來。首先第一步就是重學C++。 (初學者勿入)本篇是對知識點的補充,不作系統講解

侯捷老師的教學,屬於將課本整段整段的知識打散,按照自己的方式整合起來。更便於基於實踐程式碼理解面向物件思維。

一、標頭檔案宣告

在標頭檔案前後都要加宣告。標頭檔案引用  #include“ 標頭檔案.h”

 

 二、標頭檔案佈局

 

 基於以上的佈局,我們引入模板。模板是為減少程式碼冗餘,增加程式碼的可重用性。

 

 

用c++ 寫連結串列的模板 如下:

 1 template<typename T>
 2 struct
node { 3 node* pred;//前驅 4 T data;//資料域 5 int rank;//秩(從0開始) 6 node* succ;//後繼 7 node() { 8 T new_one; 9 succ = NULL; pred = NULL; 10 rank = 0; data = new_one;//隨機初始化 11 }; 12 ~node() {}; 13 };//節點 14 template<typename T> 15 class List 16 { 17 private
: 18 node<T>* header;//頭哨兵 19 node<T>* trailer;//尾哨兵 20 public: 21 int size;//大小 22 List(int n = 0) { 23 size = n; 24 header = new node<T>; trailer = new node<T>; 25 header->succ = trailer; trailer->pred = header;
26 header->rank = -1; trailer->rank = -2;//虛秩 27 node<T>* temp = NULL; 28 node<T>* cntr = header; 29 for (int i = 0; i < n; i++) { 30 temp = new node<T>; 31 temp->rank = i; 32 cntr->succ = temp; 33 temp->pred = cntr; 34 cntr = temp; 35 } 36 cntr->succ = trailer; 37 trailer->pred = cntr; 38 } 39 node<T>* at(int n) { 40 node<T>* temp = header; 41 while (temp->rank != n and temp->succ != NULL) temp = temp->succ; 42 return temp; 43 }//定位 44 T& operator [](int n) { return at(n)->data; }//返回資料 45 bool insert_pred(int n, T& e) { 46 if (n >= size) return false;//非法插入 47 node<T>* temp = at(n); 48 node<T>* cntr = new node<T>; 49 cntr->data = e; cntr->rank = n; 50 cntr->succ = temp; cntr->pred = temp->pred; 51 temp->pred->succ = cntr; temp->pred = cntr; 52 while (cntr->succ != NULL) { 53 cntr->rank += 1; cntr = cntr->succ; 54 } 55 trailer->rank = -2; size++;//擴容 56 return true; 57 }//前驅插入 58 bool insert_succ(int n, T& e) { 59 if (n >= size) return false;//非法插入 60 node<T>* temp = at(n); 61 node<T>* cntr = new node<T>; 62 cntr->data = e; cntr->rank = n; 63 cntr->pred = temp; cntr->succ = temp->succ; 64 temp->succ->pred = cntr; temp->succ = cntr; 65 while (cntr->succ != NULL) { 66 cntr->rank += 1; cntr = cntr->succ; 67 } 68 trailer->rank = -2; size++;//擴容 69 return true; 70 }//後驅插入 71 bool insert_front(T& e) { return insert_succ(-1, e); } 72 bool insert_behind(T& e) { return insert_pred(-2, e); } 73 bool remove(int n) { 74 if (n >= size) return false;//非法刪除 75 node<T>* temp = at(n); 76 node<T>* move = temp; 77 temp->pred->succ = temp->succ; 78 temp->succ->pred = temp->pred; 79 while (move->succ != NULL) { 80 move->rank -= 1; move = move->succ; 81 } 82 trailer->rank = -2; delete temp; 83 size--;//縮容 84 return true; 85 }; 86 ~List() { 87 for (int i = 0; i < size; i++) remove(i); 88 delete header; delete trailer; 89 };//析構 90 };//連結串列類

 三、建構函式

建構函式  1. 寫時,需要寫預設引數值。如下面的(double r=0, double i=0)

      2. 建構函式要規範   在引數後面 要有直接對資料的賦值    : re(r) ,im (i)

 

 

四、友元

引入友元是為了 保留封裝的安全性,同時增加訪問許可權

public:公有的,全域性都可以訪問  一般可以是 建構函式 、 取資料的get()函式

private:私有的 一般資料都定義為私有的。

friend 定義的友元函式,是除了類內函式外,能直接取資料的函式。

inline :內聯   對於短函式 可以定義為內聯,但實際底層是否定義為行內函數 由作業系統決定