C-1 结束了吗?
恭喜!你已经顺利完成了所有教程!花点时间犒劳一下自己吧(填入你喜欢的事情)。
现在,长舒一口气后,你可能正在问自己:“接下来该做什么?”。
接下来该做什么?
到目前为止,你应该已经对 C++ 语言的核心内容有了扎实的理解。这为你继续向其他相关领域进军奠定了良好的基础。因此,如果你对某个领域特别感兴趣,现在正是检验自己是否具备足够知识来涉足该领域的绝佳时机。
不过,对于大多数用户来说,我认为有几个自然的下一步。
数据结构、算法和设计模式
如果你还没有学习过这些内容,我强烈建议你学习。
数据结构data structure是一组数据及其一组用于访问或操作该数据的明确定义的方法。编程中最常用的数据结构是数组,它将若干同类型的元素存储在连续的内存空间中。你可以通过数组索引直接访问(或修改)数组中的元素,从而对数组内的数据进行操作。在课程中,我们还介绍了栈数据结构,它提供了 push、pop 和 top 函数来访问栈中的数据。
算法algorithm是一组自包含的操作,通常用于处理数据结构中的数据或根据这些数据计算输出结果。例如,当你遍历数组以查找中位数时,就是在执行一个算法。二分搜索是一种用于判断给定值是否存在于已排序数组中的算法。排序程序(如选择排序和冒泡排序)则是用于对数据集进行排序的算法。
多年来,数学家和计算机科学家们提出了一套相当标准的可复用数据结构和算法,这些对构建更复杂的程序非常有用。它们都存在各种权衡取舍。例如,数组访问数据和排序速度很快,但添加或删除元素的速度较慢。另一方面,链表访问数据和排序速度较慢,但添加或删除元素的速度非常快(前提是你已经知道这些元素的位置)。
这为什么重要?让我们打个比方。如果你打算盖一栋房子,如果你愿意,你可以从头开始制作所有的工具。但这将花费很长时间,而且你很可能会搞砸不少事情,不得不重头再来(你试过自己做锤子吗?我也没有)。此外,如果你使用了不合适的工具,质量就会受到影响(试着用扳手钉钉子)。
更常见的情况是,你会去当地的五金店买几样工具:锤子、水平仪、木工角尺等等……然后在网上查阅一些教程,学习如何正确使用它们。这些工具将极大地加快你的建房进度。
在编程中,数据结构和算法也起着同样的作用:它们是工具,只要你懂得如何使用,就能极大地加快你高质量地完成任务的速度。
好消息是,这些数据结构和算法中的许多已经在标准库中实现了。在之前的教程中,你已经接触过其中的一些:例如 std::array、std::vector、std::stack、std::string 和 std::sort 等。学习如何有效且恰当地使用它们,是极具价值的。
如果你时间(或耐心)有限,至少也要学会使用最常见的数据结构和算法。但如果你有兴趣,不妨尝试从零开始自己重现这些数据结构。这确实是练习编写可复用代码的好机会,而且当你需要某些标准库中没有的功能时,这将对你大有帮助。不过之后还是把它们扔掉,直接使用标准库中的现成实现吧。 😃
数据结构和算法为我们提供了存储和操作数据的优秀工具。然而,我们还可以向工具箱中添加另一种工具,它能帮助我们编写出更好的程序。设计模式design pattern是对常见软件设计问题的可复用解决方案。
例如,我们经常需要遍历某些聚合数据结构(如数组或链表)中的元素,例如为了找出最大值或最小值。但若为了掌握遍历方法而必须理解聚合类型的具体实现,就会增加复杂度,特别是当我们不得不为每种聚合类型自行编写独立的遍历代码时。迭代器(本教程系列前文已介绍)作为一种设计模式,提供了一个接口,允许我们以一致的方式遍历不同类型的聚合数据,且无需了解这些聚合类型的具体实现。而更加一致的代码不仅更易于理解,也更不易出现错误。
再举一个例子。假设你正在编写一款在线游戏,程序需要与服务器保持开放连接以发送和接收游戏状态更新。由于建立新连接的开销较大,你通常希望确保程序仅有一个全局连接对象,并防止创建额外的服务器连接(以免意外创建大量连接对象而导致服务器过载)。如果你查阅常见设计模式的参考资料,会发现已经存在一种设计模式,专门用于确保只能创建一个全局对象实例(称为单例)。因此,与其为此创建自己的(可能存在缺陷的)接口,不如采用这种经过实战检验的单例设计模式,其他程序员很可能已经熟悉它。
C++ 标准库
C++ 标准库的主要部分是数据结构和算法。不过,标准库还包含其他内容,接下来的学习步骤可以是探索这些内容。其中包括数值(数学)库、输入/输出例程、用于处理本地化和区域化的函数、正则表达式、多线程以及文件访问等。C++ 的每次新版本发布(目前大约每 3 年一次)都会为标准库增添一批新功能。虽然不必深究其中所有内容的运作原理,但至少了解其存在是值得的,这样当您遇到相关需求时,便能根据需要进一步学习。https://cppreference.com/w/cpp 是我探索现有功能的常用参考资料。
图形化应用程序
在本教程系列中,我们开发了控制台应用程序,因为它们简单易用、支持跨平台,且无需安装额外软件。与许多现代编程语言不同,C++ 本身并不具备创建应用程序窗口的功能,也无法在这些窗口中添加图形元素或图形用户界面控件(如复选框、滑块等)。要在 C++ 中实现这些功能,你需要借助第三方库,或者学习使用操作系统/平台的原生 API。
与控制台应用程序相比,要让图形应用程序正常运行需要多几个步骤。首先,你需要实际安装第三方库或操作系统 SDK,并将其与你的 IDE 关联,以便将其编译到你的程序中。大多数图形库都会提供针对主流 IDE 的配置指南。接下来,你需要实例化一个操作系统窗口,这需要调用工具包中的特定函数。如果对基础操作不确定,大多数(如果不是全部)库都提供了示例程序,你可以编译并分析它们。
市面上有大量图形库,具体选用哪一个取决于您的需求(您需要自行调研以确定最适合您的那个)。常见的选择包括 Qt、WxWidgets、SDL 和 SFML。如果您想开发 3D 图形,这些框架均支持 OpenGL,且互联网上有许多优秀的 OpenGL 教程。
图形应用程序的运行方式通常与控制台应用程序不同。对于控制台应用程序,程序从 main() 函数的开头开始执行,然后按顺序运行,通常仅在用户输入时暂停。图形应用程序同样从 main() 函数的开头开始执行,通常会创建一个窗口,在其中填充图形或控件,然后进入一个无限循环,等待用户与窗口进行交互(通过鼠标点击或键盘操作)。这个无限循环被称为事件循环,当发生点击或按键时,该事件会被路由到处理该类型事件的函数中。这被称为事件处理。一旦事件被处理完毕,事件循环将继续运行,等待下一个用户输入。
TCP/IP / 网络编程(又称互联网)
如今,几乎很难找到不连接互联网、不连接后端服务器/服务,或以某种方式利用云服务的程序。任何需要您注册账户并登录的程序,都在连接服务器并验证用户身份。许多程序会连接到某些服务以检查是否有可用更新。社交应用会与社交基础设施保持持久连接,以便用户按需进行交流。这些都是网络编程的实例。
广义而言,网络通信是指程序连接到其他程序(无论是本地机器上的,还是联网机器上的)以交换信息。网络通信是一项强大的工具——过去,若想更改应用程序的行为,必须发布应用程序更新。如今,通过良好的程序设计,只需更新某处服务器上的信息,所有程序实例即可应用该变更。
与 C++ 中的许多事物一样,市面上有现成的库可帮助您的 C++ 程序实现网络功能。Asio C++ 库便是其中常用的一个(它有两个版本——一个是独立版本,另一个是与 Boost 集成的版本;Boost 是一个提供大量不同功能的库,类似于标准库)。
多线程
在本教程系列中,我们所见的所有程序都是顺序运行的。一个任务完成后,下一个任务才会开始。如果某个任务卡住了(例如,你正在等待用户输入,而用户尚未输入任何内容),整个程序就会暂停。对于简单的学术程序来说,这没问题,但对于实际应用程序来说就不太理想了。试想,如果你的程序正忙于在屏幕上绘制内容,导致无法响应用户的点击;或者在进行网络调用时,整个程序暂停或卡死,用户会觉得程序毫无响应。
幸运的是,有一种方法可以让程序同时执行多个任务,这被称为多线程。就像(大多数)人可以一边走路一边嚼口香糖一样,多线程技术让程序能够“分散”注意力,并行处理多项任务。
例如,某些图形应用程序(如网页浏览器)会将渲染(绘制图形)部分放在单独的线程上,这样在绘制过程中,屏幕更新就不会阻塞其他操作(如接收用户输入)。网络调用通常也在单独的线程上进行,这样即使网络调用需要较长时间处理,应用程序在等待期间也不会陷入停滞。
多线程虽然功能强大,但会增加复杂性,并带来更多出错的可能性。因此,我不建议从这里入手——但这确实是一个值得最终深入学习的领域,特别是如果你想开发复杂的图形应用程序或进行网络编程的话。
巩固基础
另一种选择是花时间加深对最佳实践的理解。为此,我强烈建议通读《CPP核心指南》,并可选地深入研究GSL库。
坚持练习!
提高编程水平的最佳途径就是多写代码!
开发一个较大的项目(例如 1000 多行代码)既有趣又具挑战性。不妨尝试实现一个简单的游戏或某种模拟程序!纸牌游戏通常是个不错的选择,因为它们的规则通常比较简单,而且可以通过控制台输出实现。这里推荐一款:八点牌。
现在也是加入提供各类编程练习的网站来检验自身技能的好时机。我们强烈推荐 Codewars,因为它免费且拥有海量的创意编程挑战!Project Euler 也有许多具有挑战性的问题等待解决。
当程序能正常运行时,不要就此停步。花些时间打磨你的代码(例如重构、去除冗余)。测量解决方案的运行速度(参见 18.4 —— 测量代码运行时间),然后看看能否找到优化代码的方法,使其运行得更快!
再见!
在此,我想花一点时间感谢大家光临并阅读本教程系列。希望你们在这里度过了愉快的时光,并觉得本网站对你们有所帮助。特别感谢那些通过浏览感兴趣的广告,帮助本网站成为人人皆可免费使用的资源的朋友们。欢迎再次光临!
『
“Good luck (and skill) in your future endeavors, and happy programming! And remember, old programmers never die -- they just go out of scope.
祝您未来的努力一切顺利(并技艺精进),编程愉快!请记住,老程序员永不消亡——他们只是超出了作用域。”
附言:如果您有任何反馈或对后续内容探索的建议,请在下方评论区留言。

浙公网安备 33010602011771号