曾经因为自己的一些帖子在网上引起了大家对C++学习和使用的讨论,再回想起自己接触C++三年多,一年前鼓足勇气重新开始再次学习的情景,现在的我心中多了几份感慨,更多的是觉得自己学习的过程颇具普遍性,几次想把自己的一些心得写下来,对自己算是个总结和回顾,对别人即使谈不上帮助但相信也能算是个学习C++的案例分析吧。但开始几次提笔总是过于追求完美,想把所有的东西都写下来,但几次提笔和几次放弃后,我终于打消了“完美”的这个想法,等一下还要和自己女朋友打电话,就这一个小时内,能说多少算多少吧,毕竟我是说出来写下来了。
接触C++是在99年,那个时候自己已经有一些C语言的基础了,刚开始会用的关键字比起C来说也许只多了Class吧,那个时候在学校,也学了VC++,写了几个很简单的游戏程序,然后就因为很多琐事没有再在C++上有更多的深入,这也是我现在非常遗憾的事情,也许那个时候我能够投入进去,现在应该是能颇有小成了。
02年开始了一个新的里程,我自己有充足的来支配时间。就在那一年的暑假,开始了新的C++学习,我知道我以前的基础对于学习C++来说,几乎不会有什么更大的帮助,所以我选择了重新开始,从IF….ELSE这样的语法开始。选择的第一本书是好友友情赠送的《C++ PRIMER》,当时我只是看了不到三天,我就没有继续看了,我知道这本书非常不错,但是肯定不适合当时的我,因为从一开始就有过多的东西给我困惑,类,模板,重载……,这样东西几乎让我放弃学习C++,因为我那个时候觉得自己C还是有一定功力的,就把C搞透对我来说那个时候也是个不错的选择,但毕竟C的内涵无法让我有更多的激情,重复的东西我向来就不喜欢。然后我开始考虑++这个两种语言唯一的标示区别到底蕴涵着什么?同时我开始考虑到底程序设计语言是什么?随后我在图书馆借了本书《程序设计语言的概念和实现》,无论别人如何看待这本书但它却让我明白了很多,因为这本书最大的特点是抽象出了现代程序设计语言的各种语义和其中蕴涵的思想,让我对语言本身这个概念有了更深刻的认识,让我建立去了各种语言自身的不同的语法都代表实现一种对于所有语言都共有的语义,而一个富有逻辑的语义系列却反映出了更一般的程序设计思想。在有了这个概念后,我接触到了《C++设计与演化》这本书,在学习C++过程中这本书对我的帮助是最大的,这本书让我明白了C++的设计理念和各种语言设施所代表的实现语义,既各种纷繁的C++语言特性都是为了实现某种功能并且在不违反C++设计哲学基础上建立起来的。这样的对于C++的宏观基础,让我在以后的学习日子里受益非浅,而《C++设计与演化》这本书我也同时具有中英两种版本,每当我对很多关于C++特性困惑的时候我都会把英文版(随便炫耀一下,这本书上有B.S的亲笔签名:))拿出来,再好好的看看。就象前阵子对于C++的学习,可谓讨论颇多,我自己也再次把这本书拿出来,评价自己所持有的观点是否正确。从此我认为自己算是走入了学习C++正确道路。
10月B.S来到中国,那个时候的我对于C++可以说只是个完全初学者(呵呵,给大家举个例子,那个时候我在杭州碰到了cber,他开始告诉我他的网名,我却说你的姓名是什么?后来他写下他的名字和联系方式我却还不知道我对面站着的是个C++顶尖高手,幸亏那个时候的我还和他合影了一张相片,这算是我比较明智的地方吧,至少没有留下遗憾。)我虽然是个初学者,但我不认为我应该错过这次和大师亲密接触的机会(尤其是在反复拜读过他的书和大部分论文后),自费来到杭州(其实也花了不少那里同学的钱:))听了B.S在浙大的报告,我很早就去了,坐在第一排,整个报告会也是我第一个问问题,回想那个时候我的问题多少显的幼稚,但我告诉自己无论自己现在怎么样,这样的机会一辈子也许不会有了,所以我始终保持了十分积极,B.S的答复十分详细以至与我到后面就基本处于假听的状态:》但B.S的大师风范却让我颠倒,从此对于C++的学习我也不再功利。
学习就是积累,期间我看过《C++编程思想》,又对C++有了更感性的了解,三个月后再次拿出《C++ PIRMER》,这个时候我已经能非常明白LIPPMAN这本经典大作的巧妙用心了,它绝对不是给初学者看的,但对于入门后完全的学习和理解C++效果却十分明显,从书的一开始就直接进入C++的主题,前面五章都用类设计一个数据结构,让读者完全明白了各种用户定义类型所代表的抽象能力,然后直接进入第六章标准库中的容器类,这样的设计让读者十分清楚的建立容器和类这两个C++中十分重要的概念,之后的学习自然是非常富有满足感。以前学习编程的经验告诉我,写程序才是学习的中心,所以并且我把《C++ PRIMER》中的大部分代码都调试通过了,样例的代码连贯性也是这本书的最大的特点,而另外一大特点就是代码没有一个是可以直接通过的,都需要自己的调试,在调试这样的代码过程中更加深了我多C++的认识。不到两个月的时间就把《C++ PRIMER》初看了一遍,加之在CSDN上面和大家的交流,感觉已经建立起了对C++的完整的基本认识。
没有看过《C++程序设计语言》,算是学过C++吗?在我眼里,如果连语言的创作者的书都没有读过,如何去理解这本语言?去年12月我花了整整一个月把这本书好好的看了两遍,唯一的感觉是这本书才是真正有资格称为《C++编程思想》的。书和《C++ PRIMER》是完全的不同风格,后者告诉你的是完整C++的语法和其支持的语义。而前者是真正告诉你如何去用C++思考问题和编写符合C++设计理念的代码。你能明白C++的设计理念极其理念下的程序设计思路和代码编写规范。到今年元旦,感觉自己比起当初已经是进步不小,所以没有继续看书,而是在寒假看了几个大点规模的C++程序源代码。
之后,我也读了一些C++大家的作品,在这里需要提出来的是《C++标准程序库》和《C++沉思录》,前者写作方式通俗易懂,但全书内容却十分丰富,对于学习标准库可以说是最佳表现的作品。而后者,阅读感觉和《C++程序设计语言》一样,思想性非常强,读这样的书很累,脑子必须一直思考问题,思考作者里面提出的问题和他提出的解决方式。这本书最大的特点是非常直接的把C++语言的核心暴露出来-----三种抽象模型和极其语言设施本身对这三种抽象模型的支持。而《C++沉思录》给我的更深层思考是什么才是运用C++最合理的方式,这也是后来我发帖说明自己对于C++的学习和使用的一些见解的原始思想来源。
再后来,自己慢慢的用C++实现了一些小程序,有的是书本上的,有的是自己想的,写程序和调试的过程给我的感觉就是烦恼和满足的交替过程也许就是这样的反复过程才是程序员追求的。文章至此,多数记载了自己的历程,对很多看到这里的读者来说相信并没有什么帮助,下面我非常直接的说出自己的学习C++感受,从前面我的经历大家都可以看的出来我不是什么高手,但我保证我下面写的东西对于初学C++的是十分有帮助的,毕竟我刚刚走过那一段时的灰暗日子。
学习C++重在理解其各种语言设施所代表的语义,以及C++所能表示的语义所代表的设计思想。首先从宏观上入手,你需要明白的是C++是程序设计语言的本质。在此我把C++最重要的性质写下来:C++是一门静态类型检查,基于C内存模式,支持四种基本程序设计范型的语言。注意,这里说明了三个本质特性,静态说明了语言的类型检查性质,基于C内存模式告诉我们在C++中所有与内存有关的操作都需要程序员自己来负责,这样就带来了很多设计程序时的需要注意的地方,而理解支持的四种基本范型却是理解各种语言设施的基础。然后记住C++的最大的一点设计哲学,也是其贯穿应用C++的一条本质,我引用《C++ PRIMER》中文版前言内的一句话表示--“C++的基础是各种设施,它们让用户能够通过定义新的数据类型来扩展语言本身,这些新类型可以与内置类型一样的使用方式(如何理解这句话是关键,我的理解是:用户定义类型可以在任何使用内置类型的时候做为其替代,再具体点说就是用户定义类型可以象内置类型那样可以被声明,其对象可以被初始化,可以相互复制,可以象内置类型对象那样和很多操作符一起使用,可以被作为参数传递给函数,可以作为函数的返回值,可以作为容器的操作对象,用户定义类型可以和内置类型一样作为模板的参数),掌握这些设施(哪些设施?就是让用户定义类型可以和内置类型一样方便使用的设施,包括什么?构造,拷贝,解构函数,操作副重载.....)的第一步就是理解基本语言(什么是基本语言?就是C++中better c部分)。
在此,我还想提出一点十分重要的概念:一门语言的最本质的东西就是其类型系统,任何语言都有自己的独特的类型系统,学习C++就是学习他的类型系统。所以首先需要彻底明白什么是数据类型这个概念。这样你的思路就清楚了,你有选择,从每一种C++支持的设计范型入手学习。
结构化设计-----也就是C++中的better c部分,你需要在C的基础上学会函数重载和引用这两个最重要的语言新特心性。
基于对象----你需要建立C++最强大的概念--类,也就是用户定义类型,这其实就是数据结构里面接触的抽象数据类型的概念,以及合理构造使用类的一系列语言措施。并始终记住,在C++进行设计时用类来表示我们需要表示的概念。类也是C++抽象机制里面最核心的概念。
面向对象----在这里你需要知道继承和多态这样的OO概念,以及句柄类这样常见的设计技术,这里你需要明白你开始进入了对接口编程的阶段。同时你要学会OO思想,C++的一些设施只是为了把OO思想在语言所支持的语义中充分的表示出来。但是在这里,同时你需要明白的C++能表示的语义是受到其当初语言设计原则限制的(什么原则?静态类型检查,不为不需要的东西付出代价,选择权在程序员手上语言本身不去强迫程序员的做出选择),也就是说C++所能表示的OO思想可以称为具有C++特色的OO思想了。这样的OO思想和JAVA所代表的纯OO哪个更好?没有定论,因为他们本身的设计理念就不一样。
泛型设计----这里你需要明白最重要的一点是C++的temlate机制无论其开始建立的初衷是什么,现在他所代表的真实含义是:编译时类型推导,也就是编译时多态,由此明白了泛型的核心---把各种类型当作一种抽象条件的具体化,C++有措施可以定义抽象条件吗?没有,所以这些条件只能定义在我们自己的心中,但我们可以把具体化的类型当作一种抽象条件实现在template机制中去,从而使tempalte成为比类型推导机制更进一步的东西,那就是抽象条件的推导。也就是说,我们不再把template接受的参数看成是类型,而是把template看成是一种接受抽象条件的机制,无论其类型如何,只要这种类型满足tempalte所接受的抽象条件就可以作为参数传递进去,这样就代表了一种泛型的思想-----类型不再是根本,抽象条件才是,类型不过是抽象条件的外衣和在C++中的实现方式而已。在结合基于对象和泛型设计这两种抽象设计模式的技术上诞生的工业产品就是---STL。
最后再说点其他的想法,C++作为一门支持多种设计模型的计算机程序设计语言,其蕴涵思想可谓博大精深,熟练掌握已属不易,精通更是难如登天,但就象C++开始设计的那样,你对C++还不了解的地方并不妨碍你使用C++和用C++在你力所能及的范围内作出合理的设计。但我们应该明白,到一定程度的时候我们应该跳出去,站在一个更高的地方去重新审视C++,重新审视自己对于程序语言,对于设计思想,甚至与对于软件本质的认识是否在不断的进步?对于C++的全心投入不能成为忽略其他的技术掌握的借口,总之,面对纷繁而来的新事物我们要有自己的判断,过于浮华是我们所不耻的,但在成长的道路也决不能故步自封,做井底之蛙。
这里,终于完成了这不完美的总结,如果对你能有哪怕只是微不足道的帮助,或者即使没有帮助,你也觉得没有浪费刚才看这文章的时间话,我想我的目的就已经达到了,谢谢你的阅读,我女朋友已经久等了:》,就次止笔。
Amstrongest
21:40 05/14/03