学C++本身是教不会你编程的。你需要主动的、不断的扩展自己的知识领域。
写一个学生管理系统是一个很好的开端;但接下来,你还需要学习更多。
举例来说,“图形界面”究竟是怎么一回事呢?
我们知道,计算机屏幕实际上是一个“色点”组成的“点阵”;高清屏1920X1080@24bit,意思就是:它一共有1080行,每行1920个点;每个点又可表示2^24种不同颜色(以RGB格式表示;其中RGB的意思是红绿蓝三原色,每种原色8bit,256种取值,即有效取值为0~255)。
这个知识,就是计算机屏幕显示的根本;一切的一切,最终都要变成这样一个1920X1080的彩色点构成的点阵——我们的眼睛无法区分这么多点,看起来就是一整幅图片了。
我们的程序,想要显示出“图形界面”,就得管理好这个巨大的、彩色点构成的点阵;不仅如此,操作系统还可以同时运行一大堆程序、显示一大堆窗口……
那么,这么程序的这么多窗口,又是如何有条不紊的显示在屏幕上的呢?它们不会相互干扰吗?如何处理它们彼此之间的遮挡关系?那些压根看不见的窗口,也要每秒60帧的更新它的显示内容吗?那些一直没有改变过的窗口,是否每帧都必须从头生成内容?可不可以想办法节约掉这些不必要的计算动作?
你看,这是不是一个“学生管理系统”的超级放大版、复杂版?
为了管理这样一个复杂的东西,人们不得不搞出复杂的数据结构和针对性的各种算法;这样还不够,业界从MFC那复杂的消息循环、复杂的对话框数据交换开始,发展了许多年,这才找到Qt/GTK/WPF这样精炼高效、界面与逻辑分开的、方便易用的新架构——而这些东西,就需要面向对象之类东西的帮助了。
你可以算一算,如果每秒刷新60次,1920X1080的屏幕需要多大的计算量。
这么大的计算量,这么复杂的交互逻辑,只有C/C++系语言才hold得住。让其他语言来做它,就很容易浪费太多的性能。
不仅如此。
对于游戏之类应用,人们经常不得不用几十上百万个三角形拼凑出栩栩如生的3d模型;然后通过实时计算更新它们的位置,再模拟出几个光源去照它、处理它们在不同光照下的颜色/反射等等细节——经过各种复杂的处理流程之后,通过一个虚拟的摄像机,计算这个摄像机应该看到什么样的数据……最终,我们才能把这些数据投射到屏幕上,让用户看到一个逼真的3D世界。
CPU处理这样巨大的“阵列数据”显得非常笨拙,因为它只能一个顶点一个顶点的处理它;后来就加入了MMX/SSE/3D NOW之类SIMD指令集。但这东西的性能还是不太够……
再后来,就有了显卡;显卡后来又发展成了GPU。GPU支持的特性又越来越多,直到现在的实时光线追踪……
你看,仅仅一块屏幕,这后面都有多少东西。
其中,Qt/GTK/WPF之类,是别人写出来、帮我们管理常规应用的窗口的;而OpenGL、DX9/10/11/12之类,则是替我们和显卡打交道、帮我们写3D应用的——如果你要写程序,那就是A3D/unity之类引擎的天下了:它们不仅帮我们打包了图形图像以及音频动画模型等等方面的支持,还集成了游戏需要用到的其他许多基础功能,比如状态机、地图导航、碰撞检测等等东西。
学C++的好处是,这类贴近底层、贴近硬件或者性能要求严格的程序,往往只能用C/C++系语言才写的出来——用其他语言倒也不是不能写,但多少都差点意思。
总之,就好像学生管理系统一样,屏幕上的点阵同样需要一套又一套的管理系统;这些系统是写给我们程序员用的。
想要用好它,你最好搞明白它的基本原理;你要知道如此庞大复杂的东西,是如何管理的井井有条的——算法和数据结构只是入门,后面还有专门讲软件组织结构设计一般原则的软件工程。
写一个Qt很难,但知道它的设计思路并不难。除了C/C++,极少有哪种语言可以给你提供这个视野。
有了这些知识,那么Qt/GTK之类东西你用起来,就会感觉它非常简单,随便哪种抓起来就能用。这就叫知其然又知其所以然。
正因此,其实我是不太建议学C++时着急用各种框架的。因为学框架,你用任何一种语言,从C#到python,全都能学;但写一个Qt/GTK,写一个MySQL,写一个GCC……这类把计算机体系结构挖到根子的有趣挑战,只有C/C++系才鼓励你去做、而且也只有C/C++系语言才能提供无穷无尽的开源优质资源供你参考。
换句话说,当别人忙着追随Qt之类框架的新版本、看着它的新特性抓耳挠腮、不知这些新API该如何调用时,你可以借着C/C++这根拐杖,自豪的说“这个新特性,其实我都知道它是怎么实现的”!
别人学用数据库,你写玩具数据库;别人学用hive,你学着写自己的big-table/map-reduce——这类东西的原理性代码往往没多少,但难度往往会高一些。
但这个投入是值得的。
一旦理解了这些酷炫技术背后的原理,你就不会说“哎呀上学时我们居然还学老掉牙的MFC,现在看着Qt两眼一抹黑”,而是“Qt的抽象果然比MFC好,简单,清晰,易用。MVC模式果然是个天才的设计,你看GTK/WPF等等,它们也都是在这个模式的基础上发展起来的”……