学习C++(一)
我现在理解的C++
/*种种原因,很多精力要投入到java的学习和使用中去了,想形成一个学习C++的系列文章,没有什么风格,也没有什么时间表,想到哪就去写。这里把以前自己另外一个ID发表的一篇文章的一部分作为这个系列的第一篇,算是开头吧。*/
学习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。