zoukankan      html  css  js  c++  java
  • [C++程序语言设计笔记一]面向对象编程抽象,继承,重写基本介绍

        今天是个不错的日子,不仅有人收了我做徒弟从此传授我有关C++的一些知识,由于前一段时间喜欢上了外挂的研究也用到了一些MFC的知识及一些Windows APIs编程,但是对C++还是没有从根本上认识。我从来没有过一个真正意义上的计算机老师(那些只会拿着课件给我念的不算),由于一路走来都只有我一个人,身边的人也全是学习科研的,美其名曰:生物工程,我想考过大学的人都知道这个科目的热度有多大---全国十大骗人专业之首。我放弃了我的专业的所有,一头投向计算机中,这可能也是由于我在高中就开始玩“黑客技术”以及我对计算机的敬仰之情所致。说了这么多,都是要感谢这位师傅,而且还是个女生,虽然我们是在网路上认识.....前一段时间看了《Windows核心编程》没有深入了解,谁都知道一本比较好的书没看个几遍是很难懂得他的精髓的,和我学习.NET一样(我看了红皮人头书WROX出版的《.NET入门经典》总共四遍,第一遍不知道说什么;第二编好像是这样;第三遍基本上懂一点;第四遍他才真正把我从VB中给带到C#过来而一发不可自拔,其实中间版本也有更替了现在应该是第4版了吧<怀疑中>)。今天师傅就推荐了一本《C++程序语言设计》今晚下班回来我就慢慢的读起,C++之父的著作应该不错,从今后的一些文章中我会记录一些我对C++的理解,我要把他从0开始的学期。开了他的写作方法不愧为一代大师,看的很爽很容易把我带入状态。
       
        C++中有头文件和实现文件共同来完成一个类或其他的方法,更术语一点是一个是声明,一个是定义,声明是让人能够在不同的程序页面或不同的DLL之间知道你到底有多少东西,这里也可以这样解释你到底想让人知道多少;而定义是你声明的函数(方法)是怎样完成一件事情的,也就是方法的实现。在《C++程序语言设计》中举了个堆栈的例子,例如我们在Stack.h中声明了一个类,而在Stack.cpp中实现了这个类的方法(当然要include头文件),当我们在其他页面中要用到Stack类时就要引用到Stack.h文件,如下图所示:
        下面我们来看看Stack.h的定义:
    class Stack
    {
    public:
        Stack(int s);
        ~Stack(void);

    private:
        const int max_size;
        char* v;
        int top = 0;

    public:
        void push(char c);
        char pop();
        class Overflow{};//异常
        class Underflow{};//异常
        class BadSize{};//异常
    };
        下面是实现Stack.h的Stack.cpp的定义:
     1 #include "Stack.h"
     2 
     3 Stack::Stack(int s)
     4 {
     5     top = 0;
     6     if(s < 0 || s > 10000)
     7         throw BadSize();
     8 
     9     max_size = s;
    10     v = new char[s];
    11 }
    12 
    13 Stack::~Stack(void)
    14 {
    15     delete[] v;
    16 }
    17 
    18 Stack::push(char c)
    19 {
    20     if(top == max_size)
    21         throw Overflow();
    22         
    23     v[top] = c;
    24     top++;
    25 }
    26 
    27 Stack::pop()
    28 {
    29     if(top = 0)
    30         throw Underflow();
    31     top--;
    32     return v[top];
    33 }

        从上面我们就可以看出了怎样定义一个类,这个只是堆栈的一种,可能不同类型的堆栈他们的push和pop的方法实现的不一样,这样我们为了能够提供给多个类型使用面向对象的特性“继承”。把Stack类定义为一个抽象类型,而实现抽象类型中的方法的不同类型也称为多态类型。我们需要借助关键字virtual来声明,例如我们只要把上面的push和pop方法的声明改成如下所示:

        virtual void push(char c)=0;
        
    virtual char pop()=0;

        从上面我们可以看到声明后带着“=0”这个表示在继承的子类中必须重写此方法[如果你熟悉C#的话,我觉得这就是抽象abstract]。当然当我们应用到其他函数中是可以声明一个引用变量如下所示:

    void f(Stack& s);
     
        这样将继承的子类实例引用到f的参数中就可以实现了[C#和这个很像,也许C#就是从这边接过来的东西,我是.NET的开发人员对此也比较熟悉就不多说了]。当我们子类继承基类时具有几个访问权限,通常我们使用的都是public关于这个我们在以后还会碰到这里就不多说了,要继承一个基类,必须包含基类的头文件,并在声明类的时候通过":"来实现继承如:ListStack:public Stack,子类的实现方式和其他一样。

        看大师的书真的很爽,不知不觉被他引入了。慢慢的由浅入深一个一个概念孕育而生,今天理解了这些东东我想也应该完成任务了,OK关电脑睡觉!再次谢谢师傅的推荐!
  • 相关阅读:
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_03 斗地主案例(单列)_2_斗地主案例的代码实现
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_03 斗地主案例(单列)_1_斗地主案例的需求分析
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_6_泛型通配符
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_5_定义和使用含有泛型的接口
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_4_定义和使用含有泛型的方法
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_3_定义和使用含有泛型的类
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_2_使用泛型的好处
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_1_泛型的概念
    为什么企业编写代码时禁止使用制表符
    header('Location:'.C('VIP_HX').'/CmdId/'.$CmdId.'/user_id/'.$user_id.'/Token/'.$Token);
  • 原文地址:https://www.cnblogs.com/xdotnet/p/cplusplus_pdl_notes_one.html
Copyright © 2011-2022 走看看