内容提要
本书结合十几本C++图书及教材的长处,摈弃了这些教材在阐述问题时惯有的语言拖沓、模糊不清,在组织框架时分不清主次等缺陷,从零开始,由浅入深,层层递进,细致而又详尽地讲述了C++这门大型的编程语言。
不同于其他C++书,该书为了使读者能轻松而又扎实地掌握C++这门语言,合理地安排了每个章节,并且尽量少用一些晦涩难懂的术语,因为读者很可能为了这些术语而又去查阅相关的书籍,带来了很多不便。
该书为了使读者能活学活用,学以致用,每一课都安排了一则或多则实例来帮助读者理解抽象的概念,实例也是根据难易程度来安排的,建议读者不要跳跃式的学习。
该书参考大量的资料,全面深入地描述了C++的方方面面,甚至对不常使用的国际化都有了细致而又深入地讲解,因此即使您已从事C++工作数十年以上,也能从该书中汲取新的养料。
该书适合于从未学习过任何编程语言的新手,以及学习C++多年,仍旧不得其门而入的读者,同时对正在使用C++进行开发的程序员和具有一定C++编程经验的资深程序员,都有着很好的参考价值。
前言
我在学习C++时,参阅过不下于十本的C++教材和资料,其中包括《c++ Premer》、《The C++ Programming Language》、《Effective C++》、《Design Patterns》、《International Standard for C++》、《Modern C++ Design》、《C++金典》、《Exceptional C++》以及《effective STL》等书。
也许读者看到这里后会有这样的疑问, C++真的这么难,有必要查阅这么多的教材和资料吗?
答案是C++不难,而是许多书由于组织框架和表达方式等方面的原因无意中增加了学习C++的难度。
就拿众多人推崇为圣经的c++ Premer来说,与其把它作为一本C++教材来看,不如把它当作C++字典。这是因为该书没有分清主次轻重,在读者不了解模板为何物时,将STL过早地进行讲解,而一些相对比较简单的概念,却又放到后面,导致读者要来回跳跃式地阅读,类似于查阅字典书。对于初学者来说,这样的字典式图书是不需要的,它们需要的是一本能够循序渐进指导他们快速而又扎实地掌握C++这门语言的图书,对于程序员来说,它的作用也很小,因为C++语言是这么的庞大,你无法用一部字典来概括。
同时该书,或者说国外书的特点是运用大量晦涩而又抽象的语言来解释一个概念,而要理解这些大量晦涩而又抽象的语言你又需要查阅其他相关书籍,当你彻底明白作者的意图时,你不禁错愕,这些晦涩而又抽象的语言完全可以用一句简单明了的话来代替。
这就是中国人和外国人在思维和表达上的不同,外国人喜欢用抽象的语言来解释抽象的概念,这是他们几百年来养成的习惯,而习惯了形象思维的中国人在阅读他们的书籍时自然会有些不适应。
当时我就常常这么想:要是有这么一本C++教材,既全面深入而又通俗易懂。这样读者就不至于为了搞清楚一个概念而四处查阅资料,既节省了时间又提高了学习效率。同时它的另一个好处是:只要读完该书,您就掌握了C++。
基于这个理念,我完成了该书的创作,其中的艰辛自不必说,不过令人欣慰的是,该书确实能够行之有效地帮助后来人少走许多弯路。这是由于该书不会象其他书一样首先讲述理论知识,然后讲语言特征,在概括完语言特征后再去讲解语言的基本知识,结果往往使读者纠缠于编程底层的实现,而忽略了他应该掌握的内容。
本书不再按照以往的模式,而是首先以一个最简短的C++程序讲起,通过对这个完整的程序的实际编写引申出一些相关的知识,然后在后面的教程中对该程序不断地扩大和完善,这样方才使读者不至于一上来就被C++吓坏,同时也能深刻地理解C++的各个特性的设置目的。
本书在编写过程中查阅了《c++ Premer》、《The C++ Programming Language》、《Effective C++》、《Design Patterns》、《International Standard for C++》、《Modern C++ Design》、《C++金典》、《21天学通C++》、《Exceptional C++》、《数据结构》以及《effective STL》等书,在此对这些书的作者表示敬意。第一节 C++简介
C++,这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,它的前身是C语言。
1969年,美国贝尔实验室的肯·桑普森用汇编语言编写了第一个UNIX操作系统,接着,他又根据剑桥大学的马丁·理查德设计的BCPL语言(Basic Combined Programming language,基本的组合编程语言)为UNIX设计了一种便于编写系统软件的语言,命名为B。1972—1973年间,同在贝尔实验室的丹尼斯·里奇改造了B语言,为其添加了数据类型的概念,并将其命名为C。1973年,肯·汤普森小组在PDP-11机上用C重新改写了UNIX的内核。与此同时,C语言的编译程序也被移植到IBM 360/370、Honeywell 11以时VAX-11/780等多种计算机上,迅速成为应用最广泛的系统程序设计语言。 然而,C语言也存在一些缺陷,例如类型检查机制相对较弱、缺少支持代码重用的语言结构等,造成用C语言开发大程序比较困难。 为了克服C语言存在的缺点,贝尔实验室的比扬尼·斯卓司朱夫(Bjarne Stroustrup)博士及其同事开始对C语言进行改进和扩充,将“类”的概念引入了C语言,构成了最早的C++语言(1983)。后来,斯卓司朱夫和他的同事们又为C++引进了运算符重载、引用、虚函数等许多特性,并使之更加精炼,于1989后推出了AT&T C++ 2.0版。随后美国国家标准化协会ANSI(American National Standard Instiute)和国际标准化组织ISO(International Standards Organization)一起进行了标准化工作,并于1998年正式发布了C++语言的国际标准ISO/IEC:98-14882。各软件商推出的C++编译器都支持该标准,并有不同程序的拓展。 C++支持面向对象的程序设计方法,特别适合于中型和大型的软件开发项目,从开发时间、费用到软件的重用性、可扩充性、可维护性和可靠性等方面,C++均具有很大的优越性。同时,C++又是C语言的一个超集,这就使得许多C代码不经修改就可被C++编译通过。
第二节 C++的发展过程
C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
第三节 C语言与C++有哪些不同?
对于初学者来说,仅需要明白:
“C++是在扩充了C面向对象过程功能的基础上,又增加了面向对象的功能”
就可以了。
第四节 学习C++还用学C吗?
许多初学者认为,学习C++之前一定要先学C,因此他们花费大量的时间来学习C语言,然而当他们学会了C语言,再去学C++的时候,他们才发现又有了新的障碍,因为由于C与C++在编程概念上的不同(C基于结构化编程概念,C++基于对象化编程),他们将要花费大量的时间再去忘掉C。
第五节 C++的版本以及安装问题
基于本书所有例程都是在Microsoft Visual C++ 6.0环境下测试成功,因此希望读者安装此版本的C++编译器。(当然不是此版本的也没问题)
另外,请一定要安装英文原版,否则有时在你花费大量时间调试后,发现不是你的错误,而是编译器的错误的时候,那就晚了。(大部分中文版本的C++编译器会偶尔出现不能编译的错误,这是汉化所致。)
注意:由于Microsoft Visual C++ 6.0对模板的支持不太好,本书第二十三章的内容建议使用Microsoft Visual Studio 2005来编译。