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

  • 相关阅读:
    declare handler 声明异常处理的语法
    mysql存储过程获取sqlstate message_text
    mongoTemplate操作内嵌文档
    mysql索引之七:组合索引中选择合适的索引列顺序
    mongoDB的操作总结
    explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二
    状态模式
    代码重构----使用java有限状态机来消除太多的if else判断
    断路器(CircuitBreaker)设计模式
    断路器之一:Hystrix 使用与分析
  • 原文地址:https://www.cnblogs.com/sylvia1111/p/16063401.html
Copyright © 2020-2023  润新知