C++学习技巧:只有魔法才能打败魔法


在谈如何学习C++之前,下面由生成器想先简单聊一下C++是一个什么样的语言。
C++无疑是一个公认的比较难上手、难精通的语言,C++赋予了程序员极高的自由度,同时也包括了几乎所有的编程范式,这使得程序员可以自由地操作计算机的内存,在代码里嵌入汇编,设计复杂的继承关系、控制编译器完成一些运算~~(甚至可以控制编译状态来达成某些魔法)~~
这往往要求C++程序员要有扎实的语言基础,还要有一定的计算机原理相关的知识,否则当我们深入C++时,就会发现C++时时刻刻都在惩罚我们薄弱的基础和对底层的无知,所以在学习C++的过程中,最重要的就是一定要彻底搞懂学到的语法和其背后的原理。
当然过分深挖语言细节可能会导致初学者在最开始遇到过多的概念,所以在学习初期一个好的检验方法是判断自己对这些概念的理解是否可以自圆其说,即便理解不到位也不要紧,随着对C++的持续学习,之前不正确的理解必然会被慢慢纠正。
在初学时最好先选定一个小的学习范围
总体来看,C++包括了四大块内容:
面向过程的类C语言的部分
以类为核心的面向对象部分
面向编译器编程的模板部分
C++标准库
初学者往往会对这些丰富的功能感到无所适从,并且可能会遇到一些自己无法解决的bug,C++的学习还没开始就已放弃……
C++保证了零成本抽象,这意味着没有使用到的特性不会产生开销,这也意味着如果你不用那些高级的功能,那么你就可以当他们不存在。所以划定一个小的学习范围开始接触C++,这是一个比较好的学习策略,可以相对容易的完成学习目标,并且避免使用过多不了解的语法,而导致出现一些复杂的问题。
如果你有C语言的基础,那么可以把主要精力放在C++面向对象部分的学习;如果你刚开始接触程序设计,那么我觉得先学C语言可能更加合适。C++和C的关系非常密切,并且C++的面向过程部分和C语言基本一致,从C开始,可以帮助你暂时避开C++本身的复杂性来学习C++面向过程的部分。
2
写代码
编程最重要的就是要实际去写代码,不要纸上谈兵,我不认为有人可以只通过看书学会任何一门语言。在某种意义上,我觉得写代码要比看书重要得多,一个比较高效的学习过程,应该是先通过看书了解基本用法后,立刻去写代码。在写代码的时候遇到问题,或者想要使用别的用法的时候,再去看书上的相关内容,效果会好很多。如果你只是单纯的看了一遍书,那大概看完后你对很多用法依旧很模糊。
另外一点是如果你希望你的C++能力逐步提高,就一定要去主动使用自己不会的用法,切勿一直呆在舒适圈内。在大多数人的印象中C++是一门面向对象的编程语言,面向对象其实是指一种程序设计的方法,也并非C++独有概念。如果你的C语言基础比较扎实,你也可以用C语言设计出面向对象的程序,只不过用起来要繁琐一些。
在学习面向对象部分的知识时,首先要保证的一点是,你确实具备了面向对象的编程思想。想要达到这一目的,你的思考方向应该主要放在如何使用面向对象技术来组织具有一定体量的代码,并且要去体会面向对象带来的好处,这样才能够真正学懂面向对象语言。
因为面向对象并非是C++独有的功能,目前大部分的高级语言都是支持面向对象的,所以其实面向对象的大部分概念都是相同的。C++提供的面向对象的功能中。比较难理解的应该就是虚函数和多继承,前者可能需要多花一些时间来彻底搞懂,毕竟这是一个经常会使用到的功能;至于多继承不了解的话也没什么影响,实际很少用到,如果你具有其它面向对象语言的编程经验,那么学习此部分应该不算是一件很难的事情。
大多数的C++程序员,对于C++的掌握会止步于面向对象,通常来说掌握这些已经足够应付日常工作了。
但是如果我们去观察一下从C++03到C++20之间的功能变化,你就会发现C++一直在完善和强化模板相关的功能,这说明模板是C++的重要组成部分,也恰恰是模板使得C++成为了一门难学难精通的语言。
在学习模板之前,我们需要明确一个极其重要的概念,就是编译期和运行期,顾名思义编译期就是指程序编译的时候,运行期也是同理。我们一般理解的编译其实就是将我们的代码转换为汇编代码的过程,但C++可以在编译的时候做更多事情,而这些事情大多就是通过模板来完成的。可以说模板就是C++编译期和运行期的分割线,在学习C++模板时我们一定要搞明白哪些是在编译期做的,哪些运行期完成的,这对于模板的学习至关重要。
3
学习模板相关知识
接下来我想着重说明一下模板解决了什么样的问题。
我们首先考虑在函数接口设计时,需要兼容不同类型数据输入的情况,而且对于这些数据类型具有相同的处理方法。在这种情况下如果不使用模板,那么你需要为每一种类型设计专门的重载函数,这就造成了大量的代码复制,降低了代码的可维护性。而如果你使用模板就可以一劳永逸的解决这件事情。这样的用法称作“模板泛型编程”,主要解决接口兼容性问题。
当然我们也可能会遇到另一种情况,假设你现在需要用一个变量表示一张600*400的RGB图片数组的长度(你可以100%确定图片的尺寸无论在现在还是未来都不会改变),那么你大概率会写成`int length=600*400*3`而不会写成`int length=760000`这两种写法会产生同样的用汇编代码,这也就是说`600*400*3`的运算在编译期已经计算出来了,这可以认为是模板元编程的一个启蒙思想,只是在元编程中问题不再是简单的几个整数相乘,它可能是计算几个矩阵相乘的结果也可能会带有判断逻辑,可以看出元编程主要解决的是在不降低程序运行性能的同时,还提高代码的灵活性和可维护性。
希望通过上面的例子能够让你明白模板的作用,模板相关的概念往往都比较难以理解,所以如果你还不熟悉面向对象部分的知识,那么最好就当模板不存在,或者简单的将模板理解为一个特殊的宏。
如果你已经对C++有了一定了解,那么就可以考虑开始学习模板相关的知识了。学好模板很重要的一点是熟悉C++的类型系统,因为在泛型模板中,更多的是对类型的操作。如果对于类型系统不够熟悉就可能会写出很多bug,并且自己也很难找到问题根源在哪。
从个人的感觉来说,通过对模板的学习会让你更加深刻的理解C++的类型系统。从模板开始你将会接触到大量的C++语言概念,并且这些概念都是十分重要的,这与面向对象部分的学习有很大的不同。
在模板的学习中,经常出现的那些关键概念和关键名词是必须要去搞清楚意思的(这些概念和名词往往是来自C++标准本身),你需要多去网上查阅资料或仔细研读书上的例题,并且要多加练习,有必要的话还要设计一些实验程序来验证自己的理解。如果你觉得这一部分确实学起来非常困难,那大概是你前期的基础没有打好,或者是你确实缺少使用场景,这时你应该暂停模板的学习,去好好巩固基础,或者等到有使用场景的时候再来学习模板部分。
4
C++的标准库
最后就是C++的标准库,标准库提供了很多好用的工具,可以帮助我们减少“造轮子”的时间。总体来说,标准库的使用方法学习起来还是比较容易的,在学习时主要关注容器和迭代器还有泛型算法的用法即可。这一部分网上的资料是比较丰富的,无论是用法还是内部实现原理都有详细的讲解,此处就不再展开说明了。
5
通过开源代码学习C++
最后想说一下如何通过开源代码来学习C++。如果你之前在GitHub上查找过开源项目,不难发现,大部分的项目都大量使用了模板,更是有很多的纯模板库。所以对于C++而言,我不太推荐在没有模板基础的情况下去看开源项目,除非你确实找到了一个感兴趣并且没有使用模板的项目(一般这种项目都是比较老的项目,语言标准一般是C++98/03),但这也并不是说只有对模板有较深的理解,才能去看开源项目学习。
实际上你只要知道模板的一些基本语法和特性,就可以去尝试阅读开源项目。我比较推荐的是一些比较短的仅头文件的模板库(如果你不想看到过多的新特性,最好选语言标准为C++11的库),通常来说这样的项目比较适合初学者,读起来也比较有成就感,通过学习开源项目会极大的提高你对C++的理解,但是选择适合自己的才是最重要的。

本文来源:http://www.12tebing.com/binglidanscq/ 转载保留版权!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288426.html

(0)
上一篇 2022年9月9日
下一篇 2022年9月9日

相关推荐

发表回复

登录后才能评论