[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的定义:
从上面我们就可以看出了怎样定义一个类,这个只是堆栈的一种,可能不同类型的堆栈他们的push和pop的方法实现的不一样,这样我们为了能够提供给多个类型使用面向对象的特性“继承”。把Stack类定义为一个抽象类型,而实现抽象类型中的方法的不同类型也称为多态类型。我们需要借助关键字virtual来声明,例如我们只要把上面的push和pop方法的声明改成如下所示:
从上面我们可以看到声明后带着“=0”这个表示在继承的子类中必须重写此方法[如果你熟悉C#的话,我觉得这就是抽象abstract]。当然当我们应用到其他函数中是可以声明一个引用变量如下所示:
这样将继承的子类实例引用到f的参数中就可以实现了[C#和这个很像,也许C#就是从这边接过来的东西,我是.NET的开发人员对此也比较熟悉就不多说了]。当我们子类继承基类时具有几个访问权限,通常我们使用的都是public关于这个我们在以后还会碰到这里就不多说了,要继承一个基类,必须包含基类的头文件,并在声明类的时候通过":"来实现继承如:ListStack:public Stack,子类的实现方式和其他一样。
看大师的书真的很爽,不知不觉被他引入了。慢慢的由浅入深一个一个概念孕育而生,今天理解了这些东东我想也应该完成任务了,OK关电脑睡觉!再次谢谢师傅的推荐!
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的定义:{
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{};//异常
};
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 }
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;
virtual char pop()=0;
从上面我们可以看到声明后带着“=0”这个表示在继承的子类中必须重写此方法[如果你熟悉C#的话,我觉得这就是抽象abstract]。当然当我们应用到其他函数中是可以声明一个引用变量如下所示:
void f(Stack& s);
这样将继承的子类实例引用到f的参数中就可以实现了[C#和这个很像,也许C#就是从这边接过来的东西,我是.NET的开发人员对此也比较熟悉就不多说了]。当我们子类继承基类时具有几个访问权限,通常我们使用的都是public关于这个我们在以后还会碰到这里就不多说了,要继承一个基类,必须包含基类的头文件,并在声明类的时候通过":"来实现继承如:ListStack:public Stack,子类的实现方式和其他一样。
看大师的书真的很爽,不知不觉被他引入了。慢慢的由浅入深一个一个概念孕育而生,今天理解了这些东东我想也应该完成任务了,OK关电脑睡觉!再次谢谢师傅的推荐!