C++语言要点
最近有些想法,想跟大家分享一下,如下:所有人都知道知道C++来源于C,所以C++支持结构化编程方式,还有就是人尽皆知的OOP,可是,我想好多人不知道C++支持四种程序设计范型,分别为:结构化程序设计方式,基于对象的程序设计方式,面向对象程序设计方式,通用程序设计方式(也就是我们经常听到的泛型程序设计,经常简称gp——generic programming)。
下面分别详细介绍:
结构化程序设计——我就不用详讲啦,大学来的第一门语言就是C,只是C++提供的是一个类型安全的C,也可以说是一个C的真子集,去除了C中的好多不安全因素,个人认为这样也把C引以称道的灵活性去掉了大部分,这便是大部分C程序员用不惯C++的原因之一。具体说结构化编程就是基于功能的抽象,我们分析一个系统时,首先想的是他能干吗?然后进行功能分解,正好可以用过程去描述,但是这里也带来了另一个问题就是全局数据的滥用,扯远啦,不过这种特性很适合于OS的设计。
基于对象的程序——我想大家都听过这样一个名词:抽象数据类型,也就是数据核对数据的操作的一种抽象,也就是我们常说的类,但是这种类没有继承,仅仅是单独的一个具体类型,我们也可以叫它用户自定义数据类型。这种程序设计方式捷径了全局数据的问题,但是提供的抽象很有限,我们可以自己设计的地方不多,也就是表达能力不强,至于跟结构化程序设计或者OO结合时,才能做好的设计。
面向对象的程序设计——可以说这是一个大家伙,需要大讲特讲的东西。面向对象的里面的类都是可以继承的,这也是面向对象的精髓。我们经常听到的抽象和封装都是它的特性,类本来就是对现实世界的抽象,基于实现世界的模型,我们抽象出一种类层次结构,我们抽象出的类层次结构要能很好的模拟现实世界,虽然不要求他们完全一样,因为我们为了隐藏实现细节,常常要向层次结构中添加界面类(抽象类的一种)。继承是一种很强大的功能,我们可以复用原来的设计,然后逐步添加自己的实现,产生一种新类,既然是复用,很可能导致后面的类的界面庞大,因此这里就要求大家做好抽象和封装,隐藏大量的实现细节,提供足够的见面,不要让所有的都是public,还有就是确保一个类是一个确定的类,别设计一个四不像的类,那样可就是抽象的失败啦。还有就是派生的此次别太深,一般最多三层就好啦,太多的话不好维护,也不容易理解,这就要看设计的功力啦。在这里要提一下多重继承,这个特性在现代的C++设计中已经遭到了很多的诟骂,相信大家都知道啦,尤其让人崩溃的钻石型结构,关于多重继承其实可以用组合来实现,这里又涉及到继承和组合的使用,说实话比较难,要看大家的选择啦,不过这里有一个判断规则,就是A
is B or A has B,is的话就是继承,has的话就是组合,也就是常说的子对象,还有个小诀窍就是你可以问自己:A可以用两个、三个B吗?如果是的话肯定就是组合啦 。虚函数的功能又多强大,特别是纯虚函数,没人反对吧,看过设计模式的人都知道,几乎每一种模式都是从抽象类派生的,除了外观模式,可以这样讲正是因为抽象类的使用,OOD才到达了这样的高度,看看JAVA的语法,好多人就会明白啦,它的里面又往抽象层次上更进了一步,又提供了一种接口类,可以说抽象类为我们支持可扩展性提供了一种强有力的支持,我们可以抽象出一组公共操作作为界面,然后在需要的时候为他们添加相应的实现,这样可以更好的应变变化,甚至可以隐藏实现,我们甚至可以不用知道某个操作是谁发出的,这样无疑提高了程序的安全性和灵活性,要知道我们一直在为软件能如何应付变化而苦恼呢,希望大家可以好好理解,这确实是一种很强大的机制,在设计中经常中用到。
泛型编程——这个是我的软肋。从头说起吧,当我第一次在C++中看到模板的时候,要知道我又多么的兴奋,我当时心想还有这么好的语法啊,一开始我就把它当作一个技巧,用来代替重载,因为我觉得这样写出来的函数更好看(这样看当时的想法多么的幼稚),也曾用它写过模板类,当时自认为作用不大就不再特别关注啦,知道我第一次看到STL,我的第一感觉是惊讶,然后是震惊,后面是羡慕,心想还可以这样用呀,可是当我看了一些他们的源码之后,那可是真正的大眼对小眼,真正的迷茫,看不懂啊,开始我还以为是自己笨,资质不够,后面才知道那玩意是变态的,据说真正懂泛型编程的大陆也就不超过200人,想想吧,全国有多少C++的使用者,后面我逐渐意识到这是对模板的滥用,远远超过了它的实际效用,后来在网上也看到了别人也有这样的想法,那个人绝对不笨,相反他很厉害,真正的牛人。关于泛型编程的一些术语,我相信好多人都不怎么了解,什么模板元编程、类型化、专门化,当你看到他们写出这样的程序时,你一定会感喟到:还可以这样写呀,我真的看不到模板跟OOD有什么联系,可以他们是基于不同的两种抽象机制,一个是基于是操作的抽象,另一个是基于类型的抽象。STL要看,但是你需要知道怎么使用就是啦,因为他们毕竟是各种常用算法和数据结构的集合,使用的范围确实很广,在编程中使用它们,可以简化编程工作,成为一种强大的工具,但是如果你看不懂他们源码的话,不要郁闷,好多人跟你一样看不懂。我甚至又点反感这种用法。
送一句C++之父的话:学习C++时不要过分关于语法细节和技巧,你需要关注的是基本概念。
还有本人的一句话:希望大家的在学习C++的时候,多思考,有选择的实践。
最好希望在大家学有所成!
[[italic] 本帖最后由 a402730324 于 2007-12-8 00:08 编辑 [/italic]]