侯捷——c++面向物件思維
阿新 • • 發佈:2022-03-27
大學PPT老師教出來的c++,的確讓我沒有啥面向物件的思維。於是乎開始努力建立起來。首先第一步就是重學C++。 (初學者勿入)本篇是對知識點的補充,不作系統講解
侯捷老師的教學,屬於將課本整段整段的知識打散,按照自己的方式整合起來。更便於基於實踐程式碼理解面向物件思維。
一、標頭檔案宣告
在標頭檔案前後都要加宣告。標頭檔案引用 #include“ 標頭檔案.h”
二、標頭檔案佈局
基於以上的佈局,我們引入模板。模板是為減少程式碼冗餘,增加程式碼的可重用性。
用c++ 寫連結串列的模板 如下:
1 template<typename T> 2 structnode { 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 :內聯 對於短函式 可以定義為內聯,但實際底層是否定義為行內函數 由作業系統決定