恭喜!您已经完成了所有的教程!花点时间,给自己一个当之无愧的(在此处插入您喜欢的东西)。
现在,在长舒一口气之后,您可能会问:“接下来做什么?”。
接下来做什么?
到目前为止,您应该对 C++ 核心语言有了扎实的理解。这为您继续学习其他相关领域奠定了良好的基础。因此,如果您对学习某个特定内容真正感兴趣,现在是时候看看您是否有足够的知识来涉足该领域了。
然而,对于大多数用户来说,我认为有几个自然的下一步。
数据结构、算法和设计模式
如果您还没有学习过这些,这是我最强烈的建议。
一个数据结构是数据的集合和一套定义明确的访问或操作这些数据的方法。编程中最常用的数据结构是数组,它在连续内存中保存多个相同类型的元素。您可以通过使用数组索引直接访问(或修改)数组中的元素来操作数组内部的数据。在课程中,我们还介绍了栈数据结构,它提供 push、pop 和 top 函数来访问栈上的数据。
一个算法是一组自包含的操作,通常从数据结构中的数据操纵或计算输出。例如,当您遍历数组以查找中值时,您正在执行一个算法。二分查找是一种算法,用于确定给定值是否存在于已排序的数组中。排序例程(如选择排序和冒泡排序)是对数据集进行排序的算法。
多年来,数学家和计算机科学家们已经提出了一套相当标准的、可重用的数据结构和算法,它们对于构建更复杂的程序非常有用。这些都有各种权衡。例如,数组访问数据和排序速度快,但添加或删除元素速度慢。另一方面,链表访问数据和排序速度慢,但添加或删除元素速度非常快(如果您已经知道这些元素在哪里)。
这为什么重要?让我们用一个类比。如果您要建造一所房子,您可以选择从头开始制造所有工具。但这会花费很长时间,而且您可能会搞砸很多事情,不得不重新开始(您制造过锤子吗?我也没)。此外,如果您使用错误的工具来完成工作,您的质量会受到影响(尝试用扳手敲钉子)。
更可能的是,您会去当地的五金店买一些工具:锤子、水平仪、木工角尺等等……然后阅读一些关于如何正确使用它们的在线教程。这些将大大加快您的房屋建造工作。
数据结构和算法在编程中也起着同样的作用:它们是工具,如果您知道如何使用它们,可以大大加快您高质量地完成工作。
好消息是,许多这些数据结构和算法已经在标准库中实现。您已经在之前的教程中遇到过一些:std::array、std::vector、std::stack、std::string 和 std::sort 等。学习有效和适当地使用它们是利用您时间的好方法。
如果您时间(或耐心)有限,学习如何使用最常见的数据结构和算法是您应该做的最低限度。但是,如果您有兴趣,请尝试从头开始重新创建这些数据结构。这是编写可重用代码的绝佳实践,并且在您需要的东西不在标准库中时会帮助您。但之后,请将其丢弃,并使用标准库中的那些。:)
数据结构和算法为我们提供了存储和操作数据的良好工具。然而,我们的工具箱中还可以添加一个工具,它可以帮助我们编写更好的程序。一个设计模式是对常见软件设计问题的可重用解决方案。
例如,我们经常需要遍历某些聚合数据结构(如数组或链表)的元素,例如,查找最大或最小值。但是,为了知道如何遍历聚合类型而必须理解其实现,这会增加复杂性,特别是如果我们必须为每种聚合类型编写单独的遍历代码。迭代器(我们在此教程系列前面已经介绍过)是一种设计模式,它提供了一种以一致的方式遍历不同聚合类型的接口,而无需知道这些聚合类型是如何实现的。代码越一致,就越容易理解,也越不容易出现错误。
这里有另一个例子。假设您正在编写一个在线游戏,您的程序需要与服务器保持开放连接以发送和接收游戏状态更新。因为打开新连接的成本很高,您可能希望确保您的程序只有一个全局连接对象,并防止创建额外的服务器连接(这样您就不会意外地创建大量连接对象并使您的服务器过载)。如果您查阅常见设计模式的参考资料,您会发现已经有一个设计模式可以确保只创建一个对象的单一全局实例(称为单例模式)。因此,您不必为此外创建自己的(可能存在缺陷的)接口,而是可以实现一个经过实践检验的单例设计模式,其他程序员可能已经熟悉它。
C++ 标准库
C++ 标准库的大部分是数据结构和算法。然而,标准库还包含其他内容,下一个步骤可以是探索这些内容。其中包括数字(数学)库、输入/输出例程、处理本地化和区域化的函数、正则表达式、线程和文件访问。C++ 的每次新发布(现在大约每 3 年发布一次)都会向标准库添加一批新功能。了解其中所有内容的运作方式并不是至关重要的,但至少了解存在什么是有价值的,这样如果您碰巧需要它,您可以根据需要学习更多。https://cppreference.cn/w/cpp 是我查找存在内容的常用参考。
图形应用程序
在我们的教程系列中,我们开发了控制台应用程序,因为它们简单、跨平台,并且不需要安装额外的软件。与许多现代编程语言不同,C++ 不提供创建应用程序窗口或在这些窗口中填充图形元素或图形用户界面小部件(复选框、滑块等)的功能。要在 C++ 中执行这些操作,您需要寻求第三方库的帮助,或学习使用您的操作系统/平台的本地 API。
启动并运行图形应用程序需要比控制台应用程序多几个额外的步骤。首先,您需要实际安装第三方库或 OS SDK 并将其连接到您的 IDE,以便您可以将其编译到您的程序中。大多数图形库都应该附带有关如何为最流行的 IDE 执行此操作的说明。接下来,您需要实例化一个 OS 窗口,这需要从工具包中调用某些函数。大多数(如果不是全部)库都应该有示例程序,如果您不确定如何执行某些基本操作,可以编译和剖析它们。
市面上有许多库,您应该使用哪一个取决于您的需求(您需要自己研究以确定哪一个适合您)。流行的选择包括 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 — 代码计时),然后看看您能否找到优化代码使其运行更快的方法!
再见!
此时,我想花点时间感谢您驻足阅读本教程系列。希望您在这里度过愉快时光,并觉得本网站有所帮助。特别感谢那些通过查看您感兴趣的广告,帮助本网站成为人人可用的免费资源的人。请再来访问!
祝您未来的努力(和技能)一切顺利,编程愉快!请记住,老程序员永远不死——他们只是超出了作用域。
-Alex
附言:如果您有任何反馈或下一步探索的其他建议,请在下面的评论区提及。