为什么学习C++
0.Why Shall I Learn C++?
C++作为一门较为成熟重量级的语言,吸引了许许多多编程学习者。单从市面上编程书籍中C++的书所占的比例即可见一斑。当然,近年来随着Java、C#的兴起与逐渐发展,也出现了一些不同的声音,认为C++并非高效应用编程的首选,而且硬件的迅速发展也会使虚拟平台的速度劣势淡化,而其优良的可移植性及安全性将使之成为新的语言主流……
但无论怎么说,C++强大灵活的语言机制、深邃的内涵、广博丰富的外延使它成为一个时代的经典语言,其中体现出的编程思想的美感使深入学习过它的人为之感叹;且不论过时与不过时的老掉牙问题,单从学习的角度说,这是一门非常值得品味的语言,尽管我认为无论过去、现在还是将来,天底下不存在哪一门语言非学不可才能成为高手(思想最重要,“不会XXX语言不算真正的高手”之类的言论实在无聊之至),然而假如在这个时代你错过了C++,我还是有一点点遗憾,毕竟你错过了一个共享经典的机会(一点点而已,可能有些主观,呵呵)。至于实用性,自然,C++不是唯一的选择(Andrew Koenig 曾在《C++沉思录》中多次强调C++设计的最终基准是实用性,但我们很多人在开发桌面应用程序时似乎更喜欢VB、DELPHI等RAD)。总言之,这个方面我们允许会有多种选择,但从思想的深化(学习方面)角度上说,C++或许会给你相当多的启发,即使你实际开发中更喜欢使用其它语言的RAD.
1.本系列的定位1.Position
这个系列主要是面向C++的“纯”初学者,他们头一回接触C++,甚至同时也是头一回走进Programming的世界。现在市面上C++的好书很多,网络又发达,所以现今的初学者比较有福气,不像当初,找得一本C++书已经是挺“可以”了,哪里知道什么好与不好,书再烂,怀疑的也是自己的脑子(恐怕连“烂书”这个词还没发明吧)。现在不同,读者不难找到一本轻便抑或详尽的书籍结合自身情况学习。但毕竟书籍本身要考虑到内容组织的系统化,因而不可避免地,暂时或者永久性地存在一些读者热切想知道但却未出现的盲点,或者是略有提及但却不深入。假如身边有位老师,自然不成问题,但或许更多的爱好者们都是像我这样自己“过来”的(呵呵),遇到茫然之处便头脑发痒,自己又搔不着,多少有些许不爽。本系列的目的就是“搔痒”,痒非必是伤,因此解决的可能是一些过来人看来无关紧要的甚至“弱智”的问题,但我相信这都是许许多多的初学者都非常想了解却无从寻觅的东西。至于哪些是“东西”哪些不是,可能判断有些主观,我暂且从自己学习的曲线中搜寻;同时也非常希望朋友们针对自己入门过程中的困惑与我通过邮件联系(kusk@163.com),至于本人,同样也是一位初学者,只不过可能混的时间久了,稍有些经验而已,但错误可能会出现,也非常欢迎指正提出:你的关注将是我最大的动力^_^
2.什么是C++
2.What is C++?
可能现在还会有许多初学者分不清C++、VC、MFC、C++ Builder这些基本的概念,经常听到类似于“VB还不够强,我明天要开始学VC”这样的言论,有些书店也还是错误地赫然挂着“Visual C++语言”、“C++ Builder语言”的分类牌。其实C++指的仅仅是一门计算机语言,它规定了书定程序的语法,例如:如何使用变量、常量,如何撰写语句,如何让计算机作出判断,如何让某些特定的功能反复执行若干次(循环),如何把一些复杂的“打包”成一个简单的模块(函数/子程序)以便调用,等等。可以说,语言是独立于计算机的,它只是一系列人为制定的规则,如果你愿意的话自然也可以拿出纸笔自己设计一门D++之类的新语言。
不过单有规则还不行,要真正能写出程序并投入运行,你应该让计算机学会用上你的D++语言。目前的计算机绝大多数只能直接识别二进制的机器语言,所以通常的作法是写一个负责翻译的程序,它可以自动地把你输入的D++程序转化成二进制程序,这样计算机就可以执行它了。这个负责翻译的程序,通常我们称为编译器。当一门语言流行开之后,会有一些软件厂商注意到:噫,D++似乎很受欢迎啊,我们应当立刻推出D++的编译器占领市场。于是各个厂商推出了自己的D++编译器,为了区分,不同厂商的编译器都有不同的名字,例如,可能会是“Visual D++”、“D++ Builder”、“Better D++”等等。
通常最原始的编译手段是命令行方式,假如我想编译一个hello.dpp的源程序,那么我可能要进入DOS命令行方式,假如编译器的名字是dpp32,我需要键入类似于dpp32 hello.dpp hello.exe之类的麻烦的东西指示它。假如有多个源文件,还要作更新编译、链接等动作,可能还要根据不同的需要加上许多晦涩难记的参数,这样一来就会十分麻烦。好一点的话可以写一个称为maikfile的文件,它可以把这些设定储存好,让编译器自己识别而不必每次键入。但命令行方式的来回切换还是不够快捷,因此聪明的编译厂商通常会为我们特别设计一个称为“集成编译环境(IDE)”的编译平台:它可以看作一个附加了许多方便我们使用D++的功能的编辑软件,例如,我们可以不必切换回命令行方式后动编译,而只要单击“编译”图标或者按下相应的快捷键,编译器就会自动为我们编译,当然我们也可以在这个软件中设定编译的选项。此久,这个编辑软件还特别加入了一些好用的功能,比如它会聪明地将D++程序中的关键字显示成另一种颜色,数字又是另一种颜色……这样做的好处是便于我们分析程序,及时发现输入错误,等等。强大的编译环境还集成了代码分析、跟踪调试等功能,比命令行模式好用多了。但别忘了,真正“造”出程序的,还是那些最原始的命令行程序。
除此以外,由于现在的操作系统日趋复杂,如果从零开始编制程序,往往要做许多重复而无用的劳动。因此各个编译厂商通常会在编译平台中提供一套已经完成的程序库,用于构建程序的相关联模块的集合称为应用程序框架,Windows下常见的应用程序框架有MFC、VCL等,还有一些跨平台框架,如Qt.框架可能集成在编译平台中,也可以单独发行。当然,框架的使用是可选择的,VC中附带了MFC,你可以使用它,也可以不用。
3.学习编程的一般步骤3.How to Learn Progrmming Step by Step
学习语言到应用编程,大约可以分为三步:1.学习语言的语法、标准库、思想;2.学习相关操作系统的API(应用程序编程接口);3.学习类库使用。有一定经验后,三者可以交替进行,相互加深。此外还要学习一些基础理论,像设计模式、算法与数据结构等。
附:另外几个常见的概念——答neverdown1983网友问
问:标准库和类库有什么区别? 那个应用程序编程接口(API)能不能解释一下?谢谢了!
我想先说说库(Library)吧,想必这个概念诸位都有所了解,在下多罗嗦几句再说一下:所谓库,就是许多程序代码的集合:编程的时候,会有许多常用的功能,如果每个用到这些功能的程序都要从头写一遍,则会出现无谓地重复劳动;因此人们把这些常用的功能编写好,并按一定的逻辑关系组织、封装起来,便于编程时直接调用,就成为了库。
库中的程序模块是怎么放置的呢?
嗯,首先,我们很自然会想到把那些常用的功能封装成一个个相应的函数,这样程序要用到这些功能的时候,我们就调用相应的函数。这些函数组成的库自然可以叫做函数库,显然函数库的思想是面向过程的;其次,我们也可以把要实现的任务封装成一个个类(class),例如要某个库包含文件操作的功能,设计者可能会写一个File类,它或许会有open、close、reset、read、write等方法,内部也可能会有一些保存文件信息的数据结构,等等。这些由各种类组成的库称为类库,它是面向对象的。
因此,按组织思想分,库可以分为函数库、类库等。
至于标准库与非标准库,则是另一种分类方式。如果某个库是C++语言标准所“规定”要有的,如STL(即标准模板库,我们在C++中常用的vector、list之类的容器以及相关算法都属于STL的一部分),是语言中的一部分,则称为C++的标准库(被标准化了的,无论VC、C++ Builder还是其它什么C++编译平台,都要求包含它才算是“真正”的C++)。当然,标准库的范围比较窄,除此之外的诸如MFC、VCL、Qt等都是其它软件厂商(或组织)自己编写的,不是C++标准所规定(单纯介绍C++的书也不会介绍它们),不是语言的一部分,所以不是标准库。
应用程序编程接口(Application Programming Interface)是操作系统为程序员提供的功能。你要在一个操作系统上编写程序,一举一动都要依赖操作系统:你要读一个文件,或者在屏幕上画一个点,最终都是要求操作系统替你实现的,而这些“要求”的方式,或者说是“与操作系统打交道”的方式,就是通过编程接口。在DOS中,程序员要实现的功能最终是通过中断的方式“告诉”操作系统,从而让其替你完成的,因此可以说中断是DOS系统的API;到了更复杂的Windows系统,由于中断过于简单与低级,所以Windows为程序员提供的是一系列的函数,这些函数已经被编译好,大多放在各个随系统一起安装好的。dll文件中,大多数情况下,Windows下的编译器会将我们的程序与这些函数库链接好;很自然地,它们就被称为API函数。Windows的API函数成千上万,与DOS区区十几几十条的中断相比实在是复杂多了,从而提供了比DOS更多、更完善的服务。不过学习的时候不可能把这些函数的名称、调用方法、参数表之类全部记得一清二楚,一般对部分最常用的函数有个大概的掌握就可以;其它的一般是随用随查,这方面MSDN是一个相当好(而且大概也是最权威)的资料集。