如何数据结构
仅仅依赖C的基础,来啃这本数据结构教程是有一定难度的。教材中涉及到的面向对象概念(如类,对象,友元等),以及C中没有的的陌生C++语法(如引用,运算符重载,模板等),确实非常打击初学者的积极性。在这个过程中,学生如果闭门造车,很容易陷入各种概念和C++语法的泥潭。我将力图使大家少走弯路,把握主流,把初学者不应care的先扔一边,做到有的放矢的学习。根据你们中绝大多数同学学过C而不了解C++的客观情况,将尽可能用C程序员容易理解的方式表述各种概念,而故意忽略其与C++的一些细微差别。等你们入门以后,区分这些概念应该不会很难。
首先,要理解什么是面向对象和C++。面向对象和面向过程是一种程序设计方法,C++,java,C#等语言都支持面向对象编程;而C++是一套语法规则,具体开发时常用的Microsoft的Visual C++,被成为集成开发环境(IDE)。C++不但支持面向对象,也支持面向过程。这里,有几个要点需要解释一下。
(1)什么是面向过程?你们现在使用的C编程方式就是面向过程,所以这应该很容易理解。通俗地讲,面向过程就是在编程之前必须先搞清楚一步一步怎么做,然后实现每个步骤(函数)。下面的例子具有典型的面向过程的特点。先定义数组,再初始化,最后排序。编程时,可以先搭好框架,再具体实现。(具体实现过程略)
/* 在 main() 函数里编写好总体步骤,在 main()函数外具体实现每个步骤(略)。 */
main()
{
int array[10];
init(array, 10); /* 初始化数组 array */
sort(array, 10); /* 对数组 array 进行排序 */
}
面向过程是是很自然的思维过程,可是面向韵缶托枰?欢ㄊ奔淙ヌ寤崃恕K?堑那?鹪谀睦锬兀客?驴础?BR>
(2)什么是面向对象?面向对象就不需要一步一步做了吗?
这个问题确实值得思考。首先,任何编译型语言(如C,C++),不管用什么思考方法编程(面向过程或面向对象),编译链接后的可执行文件在执行时,必然是一步一步有过程的。那么在程序设计时,程序员是否可以不需要指定每一步的先后步骤呢?以我目前的理解,面向对象编程时还是需要一步一步来,那这不就是“面向过程”吗?一定有人会跳起来反问。
如果一开始便试图用文字来解释清楚这个问题,给初学者的感觉往往是在玩文字游戏。好吧,我们先来看个类似于C的伪程序,它用面向对象的方法实现了刚才那个数组排序问题。说它是伪程序,是因为它无法实际编译通过,只是表达了设计思想而已。
/* 面向对象的一个类C伪程序,实现了数组排序*/
main()
{
int array[10];
array.init(); /* 这个 array 真厉害,自己会初始化 */
array.sort(); /* 嘿,还能自己排序啊 */
}
让我们对比一下这两个程序。同样定义了一个int array[10],面向过程的方法在编写时采用了"强制"手段。想初始化变量array?简单,编个函数,把array放进去。想对array排序啊?简单,还是编个函数,把array放进去。嘿,想怎么着,就怎么着,一点反抗都没有。
再来看面向对象的那个类C伪程序,先定义了变量array,它可不像刚才的array。你想使用 init(array, 10)来初始化我啊?不行。我只有自己的初始化方法init(),使用方式是我的大名加上init(),中间用.隔开,你要不要使用?于是你只好凑活着用了。你想调用sort(array, 10)让我排序啊?不行,我有自己的排序方式,要用就用我的。这个array真是有个性啊,什么事情都自己干。程序员可以指定执行过程,却无法强制让它“怎么做”(当然,最终“怎么做”还是由程序员实现,但可能不是同一个程序员)。
所以,面向对象的特点就是“主动性”。具有主动行为(体现在它自带的函数)的变量我们给它一个新的名字,就叫“对象”。如何让一个变量具有主动的行为(这里的变量现在应该改称“对象”了)?可以用C++的struct结构体来实现。
struct Array
{
int arry[10];
void init()
{
for(int i=0; i<10; i++)
arry[i] = i;
};
void sort()
{
;/* 略 */
}
}array;
what?结构体里可以定义函数?C编译器的确不可以,但可以使用函数指针来达到同样功能。在C++中,这样做是允许的。所以想让这段程序在VC中编译通过,必须保证文件后缀名是.cpp(使用C++编译器),而不能是.c(使用C编译器)。
好了,我们定义了一个结构体Array,以及一个结构体对象array(小写的a)。 这样,我们可以在main()函数中这样使用array:
void main()
{
array.init();
array.sort();
}
这个程序就是刚才那个面向对象的类C伪程序的具体实现。(未完待续)
那些写的迷糊的地方大家提出来啊。