侯捷——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 :内联 对于短函数 可以定义为内联,但实际底层是否定义为内联函数 由操作系统决定