分类: C/C++
2008-05-19 21:25:32
来源: |
|
C++入门解惑——为什么学习C++ 为什么学习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是一个相当好(而且大概也是最权威)的资料集。 |