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

 

posted @ 2022-03-27 16:45  sylvia11  阅读(344)  评论(0编辑  收藏  举报