购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
C++世界地图

如果我们要前往一个陌生的地方旅行,往往会有许多疑问:这个地方有哪些值得一游的景点?在哪里可以享用美食?又在哪里能找到住宿?这时,一张详尽的旅行地图就能解答这些问题。同样,对于即将踏入C++世界的我们,心中也充满了疑问:C++是什么?它从何而来?它能做什么?我如何编写我的第一个C++程序?面对这些疑问,我们同样需要一张C++的“地图”。这张地图不仅能解答这些问题,还能帮助我们清晰地认识C++的世界。

通过这张C++的“地图”,我们可以更深入地了解C++:探索其中的精彩之处,发现有趣的故事,学习有用的知识,积累宝贵的经验,同时警惕那些需要小心的陷阱。这张C++的“地图”将引导我们畅游整个C++的世界。

还等什么?让我们带上这张地图,立刻启程!

1.1 我们的第一个C++程序

在本节中我们来完成自己的第一个C++程序。

1.1.1 下载并安装Visual Studio社区版

在浏览器中访问Visual Studio社区版的官方下载网站,选择Visual Studio 2022的社区版本,单击“免费下载”按钮,即可获取Visual Studio的安装程序VisualStudioSetup.exe。

双击刚刚下载的安装程序以启动它,在安装程序的主界面上,从“工作负荷”选项卡中选择“使用C++的桌面开发”选项,然后单击“安装”按钮,安装程序将开始下载并进行安装,如图1-1所示。

图1-1 选择“使用C++的桌面开发”选项

1.1.2 创建“你好,C++”项目

在Visual Studio安装完成后,单击“启动”按钮,打开Visual Studio的主界面。在Visual Studio中,单击“文件”菜单,然后选择“新建”→“项目”命令,打开如图1-2所示的“创建新项目”对话框。在项目模板列表中,选择带有“C++”“Windows”和“控制台”标记的“控制台应用”模板,然后单击“下一步”按钮。

图1-2 “创建新项目”对话框

在“配置新项目”对话框的“项目名称”编辑框中输入“你好,C++”作为项目的名称,然后单击“创建”按钮以完成项目的创建,如图1-3所示。

图1-3 “配置新项目”对话框

Visual Studio会根据设置创建“你好,C++”项目。默认情况下,我们之前选择的控制台应用模板会为“你好,C++”应用提供一个源代码框架,我们只需要在其中添加或修改代码,即可实现程序的功能。

1.1.3 编辑代码,生成并运行C++程序

在编辑器中,将默认生成的代码文件修改为如图1-4所示的效果。

图1-4 编辑代码

编辑完成后,单击“生成”菜单中的“生成解决方案”命令。如果代码中没有错误,Visual Studio将生成第一个C++程序“你好,C++.exe”。

接着,单击“调试”菜单中的“开始执行(不调试)”命令,Visual Studio随即将打开控制台窗口并运行我们的第一个C++程序,控制台窗口中将输出“你好,C++!”字样,如图1-5所示。

图1-5 生成结果

经过几个简单的步骤,我们完成了第一个C++程序,是不是有点小激动呢?我们可以重复上面的过程,随意修改代码文件中的输出内容,然后重新生成并运行程序。程序将根据我们在代码文件中定义的内容,将其输出到控制台窗口。

想象一下,我们就像是C++世界中的创造者,拥有塑造程序形态的能力。你想让C++程序如何表现,只需在代码中定义,它就能按照你的意愿执行。

让AI帮助我们更高效地完成开发任务

随着人工智能(Artificial Intelligence,AI)技术的广泛应用,Visual Studio也集成了AI助手,以提高我们的开发效率。GitHub Copilot和IntelliCode是Visual Studio中两个强大的AI工具,它们可以帮助我们快速、准确地编写代码,深入理解代码库,并执行其他开发任务,如编写单元测试、调试和代码分析等。

GitHub Copilot扩展:这个工具通过基于提供的上下文生成代码行或代码块,为开发过程提供了AI增强的辅助。它使用在数十亿行开源代码上训练的AI模型,在编辑器中实时提供自动完成式的代码建议。在编写代码时,我们可以通过输入代码、编写函数签名,或使用自然语言注释描述所需的功能,来获取GitHub Copilot的建议。这些建议可以直接插入代码文件中,从而加快编码速度并减少错误。

IntelliSense提供AI驱动的增强功能。这包括智能建议、上下文感知的代码完成、整行完成和API使用示例。IntelliCode通过分析当前代码上下文和模式,动态地将最相关的建议排在完成列表的顶部,并用星形图标标注,帮助我们更快地编写出准确的代码。图1-6展示了Visual Studio中IntelliCode的功能。

图1-6 IntelliCode的功能

1.2 C++是什么

通过前面1.1节的学习,我们已经完成了第一个C++程序的创建。但C++到底是什么呢?这是每个初次踏入C++世界的新手都会提出的问题。

在百科全书中,C++被定义为:“一种静态数据类型检查的、支持多种编程范式(如面向过程和面向对象)的通用程序设计语言”。虽然“静态数据类型”和“面向对象”等术语可能现在还不太理解,但至少我们知道了C++是一种语言,更确切地说,是一种用于程序设计的高级计算机语言。

就像自然语言用于表达我们的思想一样,C++作为一门程序设计语言,也是用来表达我们的思想的。只不过,它的接收对象是计算机,因此有着不同的语法和表达方式。学习英语可以让我们与外国人交流,同样,掌握了C++,我们就可以与计算机交流,让它帮助我们完成各种任务。

既然C++是一种语言,它自然有其语法规则、基本词汇和句型结构,也可以组织成段落和篇章。用自然语言描述事物是写作,而用程序设计语言描述事物则是编程。我们可以将C++视作一种新的语言来学习,不仅为了掌握编程技能,也为了与计算机进行有效的沟通。

编程是怎么回事

语言是用来描述和表达现实世界的,C++作为一门编程语言,其作用也不例外。在自然语言中,我们使用名词来指代事物,如“陈老师”“曾学生”。在C++中,这些名词对应为变量(例如teChen、stZeng);同时,每个名词都有其属性,如“老师”“学生”,在C++中则体现为变量的数据类型(如Teacher、Student)。

为了表达事物之间的关系,我们使用动词,如“指导”,并通过动词将事物连接成句子(例如“老师指导学生”)。在C++中,动词则体现为函数(如Guide()),而动词连接的句子则转化为表达式(例如teChen.Guide(stZeng);)。

将多个句子按照一定的逻辑关系组合起来,就能形成一篇文章。同样,在C++中,我们利用逻辑控制结构将多个表达式组合起来,就能形成程序。

   Teacher teChen;                         // 陈老师
   Student stZeng;                        // 曾学生
   teChen.Guide(stZeng);                 // 老师指导学生
   // 用if条件控制结构组织表达式
   if(stZeng.m_nScore >= 60)           // 如果学生的成绩大于或等于60
   {
        stZeng.m_bPass = true;       // 学生及格
   }

通过将C++编程语言与自然语言进行对比,我们可以更轻松地理解C++程序的含义。C++编程本质上是将描述现实世界的自然语言翻译成C++语言的过程。这提示我们,在编写程序之前,可以先用自然语言描述程序所要处理的事物(通常是某个数据处理过程),然后将其翻译成C++代码,从而得到最终的C++程序。

1.3 C++的“前世今生”

读史可以使人明智。

C++作为一门程序设计语言,历史悠久,堪称程序设计语言的“老前辈”。了解C++的发展历史,不仅能够加深我们对这门语言的认识,更有助于我们理解C++的本质内涵和文化,从而更有效地学习和掌握这门语言。

让我们开启一段探索之旅,回溯C++的发展历程,领略这门语言的深厚底蕴。

1.3.1 从B到C

1967年,著名的计算机科学家丹尼斯·里奇(Dennis Ritchie)加入了美国AT&T的贝尔实验室。起初,里奇和他的同事肯·汤普森(Ken Thompson)开始研究DEC PDP-7这种早期计算机。他们发现,使用汇编语言在该机器上编程非常困难,因为汇编语言是一种接近计算机底层的低级程序设计语言,它使用助记符代替机器语言的操作码,并用地址符号或标号代替地址码。汇编语言编写的程序需要通过汇编程序转换成机器语言后才能被计算机执行。尽管汇编语言通过助记符和地址符号简化了一定的编程工作,但由于其与计算机底层的接近性,编写的程序难以阅读和理解,开发效率较低。

为了解决这一问题,汤普森设计了一种高级程序语言以替代汇编语言,并命名为B语言。然而,B语言存在设计上的局限,特别是在面对内存限制时。1973年,里奇对B语言进行了改进,创造了具有更强大系统控制能力和更高效率的新语言,命名为C语言,象征着它是B语言的后继者。

B语言又是从哪里来的

C语言来自B语言,那么B语言是否来自A语言呢?B语言之前并不存在A语言,它是汤普森从BCPL简化而来的。BCPL是剑桥大学CPL的简化版本,即Basic CPL。关于B语言的名字由来,传言有两个版本。一说“B”是作者为了纪念自己的妻子,因为他妻子名字Bonnie的第一个字母是B。另有说法称,B指代BCPL。

1978年,里奇与另一位杰出的计算机科学家布莱恩·克尼汉(Brian Kernighan)合作出版了 The C Programming Language 一书。该书的出版标志着C语言开始在全球范围内广泛应用,这个版本的C语言被称为K&R C。1989年,C语言被美国国家标准学会(American National Standards Institute,ANSI)标准化,标准编号为ISO/IEC 9899:1989,而非ANSI X3.159—1989。

尽管K&R C发布后C语言不断引入新特性,但直到20世纪90年代末,C语言的标准才有了重大更新,即ISO 9899:1999,这个版本通常被称为C99,并于1999年发布。ANSI在2000年3月采纳了这个新标准。

1.3.2 从C到C++

语言的发展是一个逐步递进的过程。1979年4月,来自贝尔实验室的Bjarne Stroustrup博士接受了一项任务—尝试分析UNIX的内核。由于当时缺乏合适的工具,内核的模块化工作进展缓慢。同年10月,Stroustrup博士设计了一个名为Cpre的预处理程序,该工具用于在源程序文件被最终编译之前进行预处理。Cpre为C语言引入了类似Simula语言的类机制,这种机制通过抽象和封装将数据和操作封装成类(这一概念将在本书的第6章中详细介绍)。

在这个过程中,Stroustrup博士萌生了创建一门新语言的想法。贝尔实验室对此表示出了浓厚的兴趣,并支持他组织开发团队进行研究。最初,这门新语言被称为C with Classes,后来更名为C++。当时,C语言已经在程序设计语言中占据主导地位,而C++面临的挑战是如何在运行时间、代码和数据紧凑性方面与C语言相媲美,同时避免应用领域的限制。

为了应对这些挑战,C++继承了C语言的优点,并借鉴了其他语言的特性,例如从Simula借鉴了类的概念,从Algol 68借鉴了操作符重载和引用等。这一系列的借鉴使得C++融合了多种语言的优势,完成了从C到C++的演变。

C++经历了长期的发展。2000年左右,随着标准模板库(STL)的引入和泛型编程的发展,C++达到了一个新的高峰。2011年,C++11标准的发布带来了易用性和性能上的显著改进,包括线程库等现代软件开发所需的特性。

许多程序员从C语言转向C++学习,C语言的基础知识和编程经验在C++中依然适用。然而,C++的独特之处在于其面向对象的特性和标准模板库。C++的这两个“+”号代表了它超越C语言的面向对象特性和强大的STL。对于有C语言背景的程序员来说,在学习C++时,应该在复用C语言知识的同时,重点学习和理解面向对象编程和STL,以掌握C++的精髓。

1.3.3 更简单、更高效:C++23让C++续写传奇

技术在不断进步,C++也在不断发展。自从Stroustrup博士发明并实现C++语言以来,在面向对象语言迅速发展的时代背景下,C++凭借其面向对象的特性、对C语言的良好兼容性以及接近C语言的性能效率,在工业界占据了重要地位,被誉为程序设计语言中的无冕之王。随着时间的推移,C++不断引入新特性,例如STL和Boost程序库的出现,以及泛型程序设计的流行,这些都使得C++成为TIOBE编程语言排行榜上的常客,并成为业界最流行的程序设计语言之一。

然而,随着硬件技术的发展,尤其是多核技术的出现,以及Java、C#等新语言的涌现,C++面临了挑战,其在某些应用领域的影响力有所减弱。特别是在微软推出.NET Framework之后,C++的地位不断下滑,被后来居上的C#抢了风头。很多钟情于C++的程序员不禁感叹:“C++老矣,尚能编否?”尽管如此,C++在操作系统编程、游戏开发、电信金融业务、服务器端开发等领域仍具有不可替代的优势,并且许多关键系统和应用程序仍在使用C++开发和维护。

为了应对现代程序设计语言的发展和业界需求,C++积极吸收现代编程语言的成果,推出了C++11、C++14、C++17、C++20以及C++23等一系列新标准。

C++11是自1998年C++首次被ISO标准化以来变化最大的一个新标准。随后的标准主要在以下两个方面对C++进行了革命性的改进和增强。

● 易用性:C++曾以其语法的复杂性而著称,但新标准通过引入如auto类型推断、Lambda表达式等特性,显著提高了C++的易用性。特别是C++23中引入的范围for循环,简化了迭代器或索引的使用。

● 性能:C++一直以其高性能著称,新标准通过增加新的语法特性、改写标准库等手段进一步提升性能。C++23标准引入了模块支持,提高了编译速度。对右值引用和移动语义的完全支持减少了资源浪费,标准库的大规模改写提升了性能表现。并行计算的全面支持,如线程和互斥量,使得C++能够充分利用多核CPU的计算资源。

C++23及其之前的新标准,在增强性能的同时改善了易用性,使C++成为一门既快速又易于使用的程序设计语言。这些新特性为C++注入了新的活力,预示着C++的持续复兴和繁荣。

1.4 三分天下:C++世界版图

C++语言的发展过程,不仅是一个特性不断增加、内容不断丰富的过程,更是一个在应用领域不断攻城略地的过程。在其40余年的发展过程中,C++在多个应用领域得到了广泛的应用和发展。无论是在最初的UNIX/Linux操作系统上,还是在Windows操作系统上,甚至是在最近兴起的嵌入式系统中,C++都具有不可替代的地位,如图1-7所示。

图1-7 C++世界“三分天下”

1.4.1 Windows系统下的C++开发

自1985年Windows 1.0发布以来,C++与Windows操作系统结下了不解之缘。不仅Windows操作系统的底层是使用C/C++开发的,而且Windows操作系统上运行的大多数大型软件也都是使用C++开发的。可以说,Windows操作系统中流淌着C++的血液。虽然现在Windows操作系统上的程序设计语言种类繁多,但C++凭借其自身得天独厚的优势和深厚的历史积淀,在Windows平台上仍然拥有不可撼动的地位。

1.得天独厚的优势

Windows操作系统本身是用C/C++开发的,这使得C++与Windows之间有着天然的亲近关系,因此调用Windows API时,C++具有独特的优势。API是指Application Programming Interface(应用程序编程接口),通常是操作系统或编程框架预先定义的一些函数,便于程序员调用系统所提供的功能。因此,在开发与Windows操作系统相关的程序时,往往会优先考虑选择C++语言。

2.历史的积淀

由于历史的原因,许多运行在Windows操作系统上的应用程序都是使用C++开发的,这些应用程序现在依然需要继续维护和升级。因此,C++在Windows操作系统上有着先发优势。

1.4.2 UNIX/Linux系统下的C++开发

如果说在Windows操作系统下C++还有其他的竞争者,那么在UNIX/Linux操作系统下,C++几乎是开发语言的不二选择。

作为程序设计语言,C++在UNIX/Linux操作系统下的优势非常明显。首先,UNIX/Linux操作系统本身是用C/C++语言开发的,这使得操作系统本身对C++开发非常友好。另外,UNIX/Linux操作系统上的大多数应用都是服务器端的,这些应用强调高性能和高安全性,而这恰恰是C++语言的强项。大多数UNIX/Linux上的应用都是使用C/C++开发的。例如,著名的网络Web服务器Apache、数据库服务器MySQL等。因此,如果在UNIX/Linux操作系统上开发应用,既要求高性能又要求高开发效率,C++无疑是首选的开发语言。

1.4.3 嵌入式系统下的C++开发

随着各类数码产品的普及,嵌入式系统开发已成为一个热门领域。嵌入式系统的硬件限制对开发语言提出了特殊要求。例如,由于执行单元的指令集有限,需要使用语法简洁的开发语言;内存容量较小,要求开发语言能够有效管理内存;CPU主频较低,要求生成的代码高效且占用空间小;同时,为了提升开发效率,通常倾向于采用高级语言。

C/C++语言凭借其特性,很好地满足了这些要求。C/C++的语法相对简单,易于在嵌入式系统上实现;它们接近硬件层面,允许精细的内存管理;编译后的可执行代码体积小、执行效率高;作为高级语言,C/C++也保证了开发效率。

因此,C/C++已成为嵌入式系统开发中的主流选择之一,尽管不是“唯一选择”,但它们的适用性和效率在该领域内是无可比拟的。

1.5 如何学好C++

既然C++如此强大,那么我们如何学好C++呢?

几乎每个C++初学者都会问及这个问题。然而,这个问题并没有一个标准答案。笔者暂且作为一个C++世界的“导游”,为读者介绍一些知识和经验,让读者少走弯路,沿着正确的方向前进,享受C++学习之旅的乐趣。只要把握好“多读多写多思考”的原则,至于具体的学习方法,则需要读者自己去寻找。

1.5.1 “多读多写多思考”是学好C++的唯一途径

C++是一门实践性很强的技术,我们不可能仅靠看几本书就学好C++。记得当年学习英语的时候,老师总是强调“多听多说多读多写”的重要性。对于编程语言而言,虽然没有“听”和“说”,但是“多读”和“多写”同样适用,再加上“多思考”,这是学好C++的唯一途径。

1.多读

多读,就是多阅读和学习别人的优秀代码,特别是一些优秀的开源软件(例如文本编辑器程序Notepad++、FTP文件传输程序FileZilla等)的源代码。通过阅读这些源代码,不仅可以学习到具体的语言知识和开发技巧,还可以领悟其设计思想和编程风格等。正所谓“熟读唐诗三百首,不会作诗也会吟”。向高手学习,是成为高手的捷径。

2.多写

多写,就是多进行开发实践。编程是一门技艺,源于实践,也必须回到实践中去。纸上谈兵是无法学好编程的。多写包括很多方面,例如在开发环境中完成书本上的范例程序,重新实现网络上的例程,开发一些小程序等。多读只是学习别人的知识和经验,多写才能将这些知识和经验转化为自己的。同时,通过多写可以在实践中发现许多在“多读”过程中隐藏的问题,使我们的认知和理解更加深刻。通过自己编写程序和调试程序,可以获得宝贵的第一手开发经验,培养自己的动手能力,从而成为一名真正的程序员。

3.多思考

遵循“多读多写”的原则,固然可以帮助我们成长为一名出色的开发程序员,但要成为一名专业的软件工程师,这还远远不够。

“多读多写”主要提升了我们的代码实现能力,但专业软件工程师的角色远不止于此。我们必须具备系统设计的能力,能够对问题进行深入的抽象、分析,并设计出有效的算法来解决问题。而“多思考”则是培养这种设计能力的关键。

简单来说,优秀程序的每个组成部分—无论是类还是函数—都是为了解决特定问题而精心设计的。面对优秀的代码,我们需要深入思考:它解决了什么问题?为何要采取这种设计?是否有更佳的解决方案?通过这样的思考,我们才能真正理解优秀代码的精髓,并在遇到类似问题时,能够借鉴并创造出同样出色的代码。

在这个过程中,我们也应该认识到,没有任何一门程序设计语言是仅靠阅读一两本参考书就能掌握的,正如没有人仅通过阅读《小说概论》就能学会写小说一样。我们需要不断地阅读、学习、思考他人的优秀代码,并且不断地亲自动手实践,坚持不懈地编码,才能真正掌握一门程序设计语言。

1.5.2 和百度等搜索引擎做朋友

在开发实践中,与其说程序是编出来的,倒不如说是“搜”出来的。在开发过程中遇到问题时,搜索引擎成为我们得力的助手。

如果遇到C++的语法细节问题,可以通过百度等搜索引擎来查找相关的教程和指南;当对某个函数的用法感到困惑时,搜索官方文档或社区讨论可以帮助我们理解其用法;面对常见的开发任务,例如文件操作,搜索现有的示例代码可以为我们提供解决问题的思路;甚至在遇到棘手的问题时,通过搜索是否有其他人遇到过类似问题及其解决方案,也能为我们提供极大的帮助。

网络是一个资源丰富的宝库,而搜索引擎则是我们挖掘这些资源的工具。善于利用搜索引擎,与它们建立良好的“伙伴关系”,可以帮助我们更有效地学习和应用C++。不过,也要注意辨别搜索结果的质量,优先选择权威的资源和社区。

此外,除利用搜索引擎外,我们还可以参与技术论坛、订阅专业博客、阅读最新的技术文章、观看教学视频等,这些都是扩展我们知识面和技能的宝贵途径。

1.5.3 使用配备GPT-4的Microsoft Copilot这一AI小助手

在利用百度搜索时,我们经常需要从数以万计的搜索结果中筛选出所需的答案,这无疑显得有些烦琐。而使用Copilot,则仿佛身边拥有了一位博学多识的小助手,随时待命解答疑惑。在编程中遇到的任何难题,都可以通过简单的聊天形式向Copilot提问,它会即刻提供答案,从而避免了我们从海量搜索结果中苦苦寻找答案的烦恼。

例如,在开发中需要确定上个月的起始日期,但对此功能如何实现尚无头绪时,我们可以直接咨询Copilot,它会即时提供解决方案及相应代码,供我们直接使用。善用Copilot这一助手能够显著提升开发效率,如图1-8所示。

图1-8 Microsoft Copilot小助手

1.5.4 C++词典cplusplus.com

学习英语,少不了一本英语词典。同样,学习C++语言,也离不开一本C++词典。

cplusplus.com就是一本C++词典。它涵盖了C++的基础知识(包括C++概述、发展历史及常见问题解答等)、技术文档(介绍C++的特性和提供教程)、标准库索引(详细阐述了标准库中关键的类、函数和对象,并附有简明的示例)以及论坛等资源。在学习过程中,我们经常需要查阅特定库函数的用法或类的成员函数等信息,这些内容在cplusplus.com上都能找到最权威的解释,并附有简洁的示例,使用方法清晰易懂。因此,拥有了cplusplus.com,便仿佛手握一本万能的参考书,轻松解决学习中的各种问题。

1.6 本章练习

1.在计算机上,下载并安装Visual Studio社区版,然后创建一个C++控制台项目,编写程序代码,让程序编译运行后在屏幕上输出“你好,C++!”的字样。

2.访问Microsoft Copilot(https://copilot.microsoft.com/),学会利用网络和AI助手解决编程过程中遇到的各种问题。 6kSaU4C5Xp93cQJXmjfOvBRQvuu77SyQSPXeV7Z5syEQ9UX6Dts+kG6IDf6ChhWo

点击中间区域
呼出菜单
上一章
目录
下一章
×