探索C++:第一部分的第一课,了解C++是什么

发表时间: 2015-06-12 20:32

内容简介

1、课程大纲

2、第一部分第一课:什么是C++?

3、第一部分第二课预告:C++编程的必要软件

开宗明义

亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的,你不知道如何入门?

别担心,这个系列教程就是为C++初学者准备的。

不可否认,C++是一门非常著名的语言。几乎学计算机的同学都难免要碰一下C++,中国的大学课堂一般也是先学C语言入门,然后就是Java或者C++。

C++ 这门语言的使用很广泛,特别是在游戏开发领域,C++的性能和无限可能性使得其几乎独占鳌头。

我们经常听到说C++是C语言的后继。实际上,这两门语言虽然有点像,但还是不一样的。C++加入了很多新的特性,比如面向对象的编程(OOP,Object-Oriented Programmation)。

之所以选择现在推出C++的课程,而且同步还推出了【Java探索之旅】和【Linux探索之旅】。

因为小编一直觉得,学编程,第一门语言最好是C语言。当然有的朋友有不同见解啦。

目前我的【C语言探索之旅】已经进入第三部分,还剩下不多的篇幅,会继续更新。

关于C语言的基本知识也已经讲得差不多了,所以这个时候推出C++和Java的课程,小编认为是比较合适的。

C,C++,Java这三门语言是可以做到相辅相成,融会贯通的。事实上,C++的发明受了C语言的启发,而Java的发明又受了C++的启发。

个人浅见认为:有了C语言的基础,再去学C++和Java,会轻松很多。

在这个系列课程中,我们不仅会一点点带大家领略C++的奇妙之处,后面还将带大家来认识一个C++的库:Qt。

Qt这个库非常强大,已经超越了一个库单纯的范畴,甚至可以说是一套体系。在嵌入式领域,Qt也大有可为。

什么是C++?

C++一般我们也可以写成CPP,或者C Plus Plus(Plus是英语“加上”、“更多”的意思)。所以从名字上我们就可以看出一点端倪。

既然我们有C语言,那C++岂不是意味着“在C语言的基础上再多加了一些东西”么?

其实是可以这样理解的,虽然我们一般还是会把C语言和C++看成两门不同的语言。但是确实C++的发明受了C语言的启发。

读者朋友,如果你还有兴趣继续看下去,说明你对编程有一定热情,或者有兴趣想学着编程试试。

记得之前网上有一个视频,是微软创始人比尔·盖茨、Facebook 创始人马克·扎克伯格、Twitter 联合创始人杰克·多西以及 Dropbox 联合创始人兼 CEO Drew Houston 和 Zappos CEO谢家华 等,同时也包括了体育界和政界的一些明星,比如 NBA 迈阿密热火队球星克里斯·波什和美国前总统克林顿和副总统戈尔等联合录制的一个视频,鼓励全民学编程。

编程其实没有那么难,确实人人都可以学编程的,现在编程的门槛越来越低了,网上好的教程和资源太多。新的编程语言也设计得越来越符合人的思维,简单易用。

在这一课里,我们会尝试解答大家初遇C++的一些问题。

不过不要忘了,这个课程是给初学者的,所以你并不需要担心,即使你从来没有写过一行代码,也不知道编程和程序是什么。

可以说这个系列课程不需要你预先有任何编程知识,只需要你有阅读的能力。

我们就是从零开始。当然,如果你有编程基础,那这个C++的课程会更容易学。

唯一需要大家做到的,就是循序渐进地学习这个系列课程,并且认真独立完成我们的各种练习题和项目。

准备好了么?C++这座“太行王屋山”,我们来征服它吧!

什么是程序?

程序(Program)是信息技术的基础。你在电脑上可以做各种操作,就要归功于运行在电脑里的各种程序。

在我们的【C语言探索之旅】的第一部分第一课【什么是编程】里已经做了比较详细的介绍了,但是因为这个C++的系列教程是面向初学者的,所以小编不厌其烦地再讲一遍。尽量不重复。

我们先看以下截图:

上面的截图,是小编在Windows操作系统里截取的。

可以看到,我们这里打开了三个不同的窗口,其实就对应了三个不同的程序:

  1. 火狐浏览器:可以上网,我们打开了三个不同的页面。

  2. 文件管理器:可以管理我们Windows系统里的各种文件。

  3. 记事本:Windows下的基础文本编辑器。

我们可以看到,这三个程序设计的目的都是很明确的,各司其职:浏览器负责上网浏览网页,文件管理器管理电脑的文件,记事本使我们可以编辑文档。

我们也可以举一些大家熟悉的游戏,比如超级玛丽(SuperMario),百战天虫(Worms,超级好玩的... 小编你又不淡定了),星际争霸(Starcraft),等等。这些也都是程序。

上面的截图就是星际争霸的游戏画面。怎么样?很酷炫吧。是不是也想要学好编程去开发游戏了?

星际争霸2的地图编辑器就是用C/C++来写的。而一般编写单机 PC/主机游戏现在都是 C++ 加上一个脚本语言(比如 Lua,这地方不需要脚本引擎多么高性能,够用就好)。

所以,是不是对于C++的兴趣又浓厚了一点呢?当然,游戏,我们开发是好,玩游戏丧志我们是绝对不推荐的。

小编以过来人的经验告诉大家,自己写游戏绝对比你玩游戏有成就感一万倍。

运行自己写的游戏,那酸爽~,不言而喻。而且会开发游戏之后,你也自然不会沉迷游戏了。

扯回正题。

我们上面举了三个程序的例子,又给大家看了一个星际争霸(也是程序)的游戏截图。可能大家会认为,程序就是都能看得见的。但其实并不尽然,并不是所有程序都是可见的。比如一些后台运行的服务(service),或者很多系统程序(比如防火墙等)都是不可见的。虽然不可见,但是这些程序还是兢兢业业地为你工作噢。

虽然可能上面的星际争霸的截图让你很想马上学会C++编程,然后开发属于自己的游戏。但是不要急,一口气是吃不成一个胖子的,只能吹胀一头牛。

像星际争霸这样复杂的大型游戏,需要十多个人(不都是编程,也需要美工,动画制作等)全时间工作几年才能开发出来。所以一开始我们要有耐心,可以从一些小程序开始(游戏是一种程序)。

在这个系列课程中,小编会带大家一起开发一些C++程序,也会有游戏。

编程语言

你的计算机(电脑)真的是一个奇怪和复杂的家伙,这样说已经算很给它面子了。我们给它传递命令,只能输送给它0或1(因为电脑里面有大大小小的数不胜数的晶体管,而它们被用来做“开关”,0和1正好可以用来表示开启或关闭的两个状态,所以电脑最底层其实都是0和1这样的二进制码)。

打个比方,我要让电脑做以下的事:“为我打开一个文件夹”。我实际上输给电脑的是(是我随便写的,我并不知道怎么转换这句话到二进制码):

010100111011001100111101010

正如你看到的,这就是你的电脑所会的语言,被称为“二进制语言”。它也只会这门语言,可以看到这门语言完全不容易理解。

所以,我们的第一个真正的问题来了:

怎么和电脑对话呢,难道只能用0和1吗?

你的电脑既不讲中文也不讲英语。所以难道我们也要学这门“二进制语言”吗?

幸亏不用。假如用这门语言编写星际争霸这样的游戏,那大概需要1千年吧。

为了简单起见,我们的计算机学者们就想到:先用其他简单一些、便于理解的语言(有点像中间人那样)编写程序,之后再把它翻译成电脑的二进制语言。

这类语言就被统称为“编程语言”。

当然最不容易的,就是要编写这样一个“翻译”程序。幸亏计算机学者们已经把这样的翻译程序写好了,我们也没必要重新做了(着实松了一口气)。所以我们要做的就是告诉电脑:“为我打开一个文件夹”,这句话会被翻译成电脑的二进制码:

010100111011001100111101010

今天,全球存在上百种编程语言,如果你百度或者Google一下,就可以找到一个编程语言的列表。

我们就不一一列举了。这些编程语言不尽相同,各有特色,但是都有一个共同的目的:

使我们可以用比二进制码更简单的方式和电脑“对话”。

一般的编程语言都是这样工作的:

  1. 我们用一门编程语言(例如C++)的指令来写我们的程序(源代码)

  2. 这些源代码被一个《翻译》程序翻译成电脑能理解的二进制码

  3. 电脑就能读取最终的二进制码,来执行我们要它执行的事啦

我们用一张图来总结一下:

这个《翻译》程序的正式名字是:编译器(英语是 Compiler)。这是一个必不可少的工具(当然,对于解释型语言,如Python,就需要解释器了,我们暂不深究,大家可以百度一下:编译型语言和解释型语言。但其实最基本的原理是一样的:都是需要有一个《翻译》程序把源代码翻译成二进制码)。

那么,我们如何在这上百种编程语言中选取一种来学习呢?哪一个是最好的呢?C++是好的选择吗?

其实,一个程序员通常会几种编程语言,很少有只会一种的。

就好像我们会说中文,但一般也会英语吧,有的人更厉害,会好几种语言。

当然了,初学编程,我们并不需要几种语言同时一起学,那会分散注意力。

一开始,我们只要学一种就好了,等融会贯通了以后,学其他的就简便很多。就好比你英语好,那么学习法语就会比只会中文的人学法语更轻松。

好消息是你可以随自己喜欢,想先学哪种就先学哪种。虽然小编个人推荐先从C语言开始,当然从C++或Java开始也未尝不可。你从Python开始也可以。

不过既然这个系列课程是关于C++的(小编你没忘记就好),那么我们就来看看C++相比于其他编程语言的独有特色吧。

C++与其他语言的比较

在上百种编程语言中,不可讳言,有些确实比较著名,而有些却几乎没人知道。

这和人类的语言是类似的:总有那么几种语言如英语,法语,西班牙语,德语,中文是比较流行的,而爪哇语,毛里求斯语,或者非洲某部落的语言,就很少有人学习了。

C++毫无疑问是最流行的编程语言之一,在著名的 http://langpop.com/ 网上有很多编程语言的排名,以图表的形式:

上图是Google搜索的关键字数。可以看到:C语言,Java和C++是前三名。

问题就来了:是否应该将一门语言的流行程度作为编程首选语言的考虑因素呢?

虽然并不是一定的,但确是一个考量因素。因为有些语言很有意思或者设计得很好,但使用不是太多,比如Lisp语言。

但是如果一门编程语言使用不广泛,就有个缺点:

[技术支持少。不容易找到能为你答疑解惑的人。]

这也是C++适合作为首选语言的原因。你在这条路上不会孤单,有很多仁人志士为你保驾护航。

当然了,除了流行性,编程语言之间的比较还有另一个标准:高级语言还是低级语言。

我们说有些语言是高级语言,另一些则是低级语言。当然这里的“高级”与“低级”并不是说好与不好的区别,而是偏离二进制码(电脑的机器语言)越远就越高级,或者说越接近人类思维模式就越高级。

一般来说,高级语言使用更简便,编程更快捷。而低级语言往往相对难一些,不过更易于控制电脑。所以说这是双刃剑。

那么C++呢?

可以C++归为“低级语言”。但再声明一次,这决不是说它比较低等。

“高级语言”和“低级语言”是一种比较而言,如果和二进制码或者汇编语言相比,那么C语言和C++也算是高级语言了。

虽然说C++编程可以是很复杂的,但是C++却非常强大,而且运行速度很快。

下图是一个语言层次的展示:

可以看到,在上图中,有一种语言最接近机器的二进制码语言,那就是汇编(英语是Assembly),也是大家有空值得学习的语言,学习汇编不需要太深入,入门就好,可以使你更好地理解内存机制,指针是怎么回事,还有电脑工作的一些原理。

推荐王爽的《汇编语言》这本书,写得很好。不枯燥,而且由浅入深。

C++的优势

  1. 很流行:我们从之前的图表已经看出,C++跻身全球最流行的编程语言前列。所以我们可以很轻松地在网上找到很多C++的技术文档,编程实践,也有很多C++的论坛,你可以提问,查找资料。

  2. 运行速度快:算是运行速度非常快了。这从C++是游戏领域热门语言就可知晓,因为很多大型游戏需要极快的运行速度。当然除了游戏,C++还被用于金融行业和军事的程序。

  3. 可移植性,跨平台性:一个同样的C++程序几乎可以不加修改地运行在Windows,Linux和Mac OS操作系统上,其他系统也类似。我们省去了重写程序的麻烦。

  4. 有很多第三方库:第三方库,有点类似语言的插件,或者扩展。对于编程语言来说,它一定自带了标准的库可供调用。比如一些基本的输入输出函数,是语言本身的标准库里定义好的。关于库和函数,我们之后的课程再讨论。Qt就是一个很著名的C++第三方库。我们可以用Qt来编写图形界面的程序,游戏,等等。

  5. 有多种编程方式:我们可以用面向过程的方式编写C++程序,也可以用其面向对象的特性,还有STL这样的标准模板库。这些多样的形式使得C++异常灵活和强大,但是也比较复杂。之后我们都会学到。

当然,说了这么多C++的优点,并不是说C++就一定没有缺陷,它也有自己的缺点,特别是其复杂性。就像C语言有不少缺陷和陷阱一样。

正如上面所说,C++算是和C语言一样比较偏底层的语言,这也给了我们直接操作内存的能力,但是能力越大,责任越大。假如未能正确使用C++,那么我们的程序很容易卡死或者潜伏危机。

但也没什么好怕的,这个系列课程就是为了让大家能够很好地控制C++这个很厉害的“熊孩子”。

C++程序之初见

为了给大家展示C++程序到底大致是个啥样子,我们就给出一段代码,是最基本的:在屏幕上显示 Hello World 这两个英文单词(也就是“你好,世界”):

#include <iostream>

using namespace std;

int main()

{

cout << "Hello World!" << endl;

return 0;

}

是不是和C语言的Hello World例程很像呢。

C++的一点历史

要说C++的历史,就先要回顾一下编程的历史。编程的历史虽然不是long long time ago(很久很久以前),那也是long time ago(很久以前)了。

一开始,计算机先驱们编程的时候,可没有今天那么好的条件呀。那时候哪有鼠标和键盘啊,那时候只能用“打孔卡”这样的东西:

打孔卡是一块纸板,在预先知道的位置利用打洞与不打洞来表示数字消息。

摘录维基百科的一点小科普:

====================

1801年,法国人约瑟夫·玛丽·雅卡尔发明了打孔卡用在控制织布机织出的图案。1880年代,美国人口调查局职员霍列瑞斯发明了用于人口普查数据的穿孔卡片及机器,并用于1890年美国人口普查,仅6周就完成了统计。而此前1880年美国人口普查的数据全靠手工处理,历时7年才得出最终结果。霍列瑞斯创建的公司,发展为今日的IBM。1890年代至20世纪初,穿孔卡广泛运用在商业和相关文书。20世纪期间,打孔卡应用在单位记录机作为输入端、处理和计算机程序。早期的数字电脑运用打孔机已输入信息的打孔卡当做计算机程序和数据的主要输入媒介。

1928年,IBM发明的80列、矩形孔卡片,成为事实上的标准。其工作原理如下:编号为0至9,总计10行;以及一块区域,用于第11、第12行(注意,没有编号为第10的行)。每列的穿孔组合用于表示单个字符。

====================

IBM计算机科学做出如此大贡献。不愧是“蓝色巨人”,百年老字号。

语言的演化史

打孔卡在今天看来当然是极为没有效率的工具了,但在当时确实是好发明。

时代在进步,我们的编程工具和编程语言也在进步。

  • 1958年:那个时候的电脑可不像今天这么小巧,最大的可以达到一间房子那么大,重达好几吨,耗电好几十千瓦,耗资几十万美元。那个时候出现了一种叫做Algol的编程语言。

  • 1960至1970年:计算机先驱发明了新的语言,叫做CPL,后来又发展成为BCPL。后来被称为B语言。

  • 1970年:然后老爷子Dennis Ritchie(丹尼斯.里奇)来踢馆了,发明了影响后世的重要的C语言。目前仍是使用最多的语言,而且在嵌入式领域举足轻重。著名的操作系统都是C语言写的:Unix,Linux,Windows,Mac OS,等。

  • 1983年:又过了十几年,我们本课程的主角:C++ 诞生了。C++其实是在C的基础上加了很多新的东西,使其变得更加强大,也能够用更多的形式编程。

那么问题来了:如果C++被称为C语言的一种“演化版本”,那么为什么这么多人还仍旧使用C语言呢?为什么不直接选择更完善的C++呢?

因为不是每个人都需要C++带来的额外功能的,C语言更接近底层,所以Windows,Linux和Mac OS这样的操作系统都是用C语言为基础来设计的。

还有一个原因:C++确实比C语言要复杂一些。如果我可以用水果刀削苹果,那何必用青龙偃月刀呢。

C++的设计者

1983年,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普。一直记不住这位前辈的名字,有点难记啊,不过他有个简称,就是B.S,还好不是倒过来。。。还是我们C语言的老爷子Dennis Ritchie 好记 :P)发明了C++语言。原因是他对C语言的局限性有些不满意,想要发明一门有更多可能性的语言。

摘录百度百科的介绍:

====================

Bjarne Stroustrup 于1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责人,AT&T、贝尔实验室和ACM成员,现任德州农工大学计算机系首席教授。1979年,B. S开始开发明一种语言,当时称为“C with Classes”(带类的C),后来演化为C++。1998年,ANSI/ISO C++标准建立,同年,B. S推出了其经典著作《The C++ Programming Language》的第三版。

C++语言是以C语言为基础的,支持C语言的所有语法和几乎所有的技术,因此也有人把C++语言看作是C语言的超集。同时C++语言支持面向对象程序设计方法的所有概念,它是一种非常实用的、功能极为强大的程序语言,相对而言较难掌握。

====================

事实证明,他做到了,C++确实很丰富和强大。这也使得很多后继的编程语言受到C++的启发,比如Java。

虽然C++这门语言一把年纪了,但是现在仍旧不断在被更新。

C++经典书籍

  1. 《The C++ Programming Language》(《C++程序设计语言》):也就是C++之父Bjarne Stroustrup写的书籍,还有比这更权威的么?不过对初学者可能有点难,就好像Dennis Ritchie写的《C程序设计语言》也是初学有点难。不仅对语言,而且对语言周边的一些如发展史、语义哲学都有比较详细的描述。对语言的描述较为全面,同时包含一部分和程序库相关联的知识,并有一定深度,适合有一定编程语言基础的初学者,翻译质量不错,价格适中。

  2. 《C++ Primer Plus》:适合C++初学者的书籍。和《C Primer Plus》类似都是不错的入门教材。覆盖面较全,章节安排比较合理,由浅入深,也很容易,因此失去了一些深度。价格比较便宜,但翻译质量略有不足。

  3. 《C++ Primer》:久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。比《C++ Primer Plus》要难。

  4. 《Effective C++》:C++牛人的大手笔,以条款的形式回答了程序员在使用C++时经常提出的“应该注意些什么?”,“应该避免什么?”,“应该怎样去解决?”,“为什么?”等问题。C++程序员想要让自己的水平上升到更高的档次,此书必看。价格稍贵,有一定难度,不适合初学者。

就推荐这四本吧,其他书籍还有很多。其实你能把这四本好好看完、学懂,那你就是C++牛人了。如果你英语好,那推荐看原版。

最后,不建议看谭浩强(不管是他的C语言书还是C++书,都不推荐,学究味重,代码风格和编码思想不好(不良代码风格毁一生),也常有错误,总之越看越晕。)也就是“老谭酸菜”的书。纯属个人浅见。

总结

  1. 程序使得我们可以在电脑上做几乎任何事情:上网,编辑文档,操作文件,玩游戏,等等。

  2. 为了实现各种程序,我们需要用计算机能懂得的指令来写。而编程语言就是来做这个活的,对应的指令我们称为源代码(source code)。

  3. 每种编程语言的语法都不一样,但是最终给电脑执行前,都要先“翻译”成二进制码,因为我们的电脑兄只认得0和1组成的二进制码。这个将编程语言翻译成二进制码的工具被称为“编译器”,每种语言有对应的编译器。

  4. 在众多的编程语言中,C++是很流行和执行速度相对快的一门语言了。可以说C++是C语言的演进,因为在C语言所提供的基础编程概念上,它还加进了面向对象的编程模型和其他元素,我们之后的课程会介绍面向对象这一卓越的思想。

第一部分第二课预告

今天的课就到这里,一起加油吧!

下一课我们学习:C++编程的必要软件

您若觉得本文不错,请点击“分享”

新朋友请关注「程序员联盟」微信搜公众号 ProgrammerLeague

小编微信号: frogoscar

小编邮箱: enmingx@gmail.com