FFmpeg In Android -学习C/C++

学习C/C++经验

写了多年C++,说一点自己的感悟。虽然自己近期没有接触C++了,但是毕竟学习的第一门语言就是C++,使用时间最长的也是它。回顾起来,它就像老朋友一样,始终带给我一份亲切感。尽管自己距离精通C++还有太漫长的距离,但也从使用C++的过程中有了不少的收获和感悟,在这里分享一下。
C++的入门学习曲线相对高一点,但是如果循序渐进,不刻意追求那些奇技淫巧的话,其实还好的。
就我自己而言,我把C++看作是帮我组织和简化代码的好助手,而不是一个有着复杂语法和号称“最难掌握语言”的工具。
其实仔细想想,C++的语法并不是随意制定的,而是有着严谨的体系,所以不能生硬地记忆。
如果能够很好地理解和遵循这套编程思想体系(哪怕最开始的时候只是尝试去依葫芦画瓢),就可以比较容易地写出有着良好组织的代码。所以,语法不是给你带去痛苦的,而是用来帮助你写出更优秀代码的。
说到简化代码,可以利用C++编译器和标准库来帮自己做很多事情,而不要什么都自己去实现和解决。比如说,C++编译器可以提供RAII、模板等强大功能,既能省下代码工作量,还能减少出错的可能性,标准库则更无需多言了。
所谓减少bug的最佳方式就是不写代码,我的理解大抵如此。
C++相对比较麻烦而容易出错的地方,一个是复杂继承层次和关系,一个是内存管理,一个是多线程编程,以下简单阐述一下自己的愚见。
对于复杂继承关系应该尽量避免(其实良好的设计基本可以避免这种情况出现),可以考虑用组合关系来替代。当然,还是要顺应领域模型,最好是有着清晰的映射关系,而不要为了组合而组合,那就过犹不及了。
对于内存管理,现代C++完全可以通过STL容器加上智能指针的方案妥善解决。此时,代码里不会再出现手动free的情况,很大程度上减轻了程序员内存管理的负担。当然,STL或智能指针要用好也不容易,特别要注意一些常见的坑(参见《Effective STL》)。
多线程编程则不仅仅是C++程序员要面临的问题。对于C++而言,通常有两种方式解决多线程资源访问冲突的问题:一是利用RAII来加锁和解锁(针对跨线程操作的对象),二是让同一对象或资源只在同一线程中进行操作。
再谈C++的学习和应用。C++实战大多离不开三类技能(不谈及算法):
一是C++本身内容的掌握,包括语法和标准库等;
二是系统API的掌握,包括文件系统、图形接口、数据库系统、网络编程等;
三是领域知识的理解,权且也把面向对象编程等思想和能力算在内。所以,这其实是一项综合能力的培养和学习,并不仅仅是学会了语法就OK。
要想用好C++,我自己的一点经验,首先要对语法有扎实的掌握,特别是一些细节和容易忽略的地方,不然就容易埋坑。当然,这不是说只有把语法全部掌握了才能开始写程序,而是要在实践中循序渐进,每实践一个知识点就尽可能把对应的细节和坑弄清楚,这样随着时间和经验积累,就能扎实地打好基础。
此时,《C++ Primer》第5版可以作为案头必备的参考书和工具书。同时,还要尽可能理解和掌握业界的最佳实践,并运用到自己的代码中。这些最佳实践怎么来呢?
一是经典书籍,包括《Effective C++》、《Effective STL》等;
二是优秀的开源项目,我个人非常推崇陈硕的muduo库,自己也从中受益匪浅;
三是不断反思自己原来的代码,总结经验教训。
对于第三点,可以采用快速迭代的思路,不要惰于优化和完善原有代码,因为这是提升自己的很好的机会。再高一个层次,就是对于自己写下的每一行代码,都很清楚这行代码在背后做了什么事情,这样对于自己的代码就有很好的掌控力。比如,调用虚函数的时候,使用STL容器的时候,尽管我们只是一个函数或方法调用,但其实在我们的代码背后还默默地做了很多事情。
从系统、语言、标准库三个层面,我分别推荐《深入理解计算机系统》、《深度探索C++对象模型》和《STL源码剖析》三本书,可以从中找到答案。C++语言之父提到他设计C++语法的一项基本原则是向程序员提供尽可能的灵活性,但是这种多范式带来的灵活性和语法的复杂性也提升了团队合作的难度,并且对团队每一名成员的编程能力都提出了较高要求。一个简单的办法是通过项目约定来控制不同范式的使用,尽量统一大家的编程风格和思路,这样可以从语言层面控制项目的复杂度。
最后,谈一下自己学习C++的一些体验。刚开始学C++的时候,基本不得要领,写出来的软件虽然实现了对应的功能,但是健壮性和可维护性堪忧。被同事推荐后看了《敏捷软件开发:原则、模式与实践》,反思了以前编程的痛苦经历和种种问题,算是第一次提升;
后来看过《深度探索C++对象模型》,对所写代码背后隐藏的东西有了比较深入的理解,算是第二次提升;
再后来仔细研读了陈硕的muduo库源码,在实战层面有了更好的参考,算是第三次提升。
虽然也看过其他很多书籍和源码,并且有着或多或少的收获,但是对于自己可以称作里程碑的节点,大概就是以上三个了。

学习书籍
C Primer Plus, C程序设计语言K&R第二版, C和指针, C专家编程, C陷阱和缺陷, C标准库

C++入门:
C++ Primer Plus, C++ Primer、C++程序设计语言(The C++ Programming Language)、C++ 标准程序库(The C++ Standard Library)、STL源码剖析,Effective STL;
C++中级:
Effectiv C++ 、More Effective C++,Think in C++ , C++沉思录,
Exceptional C++, More Exceptional C++,泛型编程与STL、深度探索C++对象模型(Inside the C++ Object Model)
C++高级: <<C++演化和设计>>
系统: Linux系统编程,Unix系统编程,Unix环境高级编程, Unix网络编程, 数据库系统等

猜你喜欢

转载自blog.csdn.net/kingdam578/article/details/83274282