C++的复杂性有两种分类办法:
1)分为非本质复杂性和本质复杂性)其中非本质复杂性分为缺陷和陷阱两类;
2)分类办法是按照场景分类:库开发场景下的复杂性和日常编码的复杂性.
从事日常编码的实践者的角度来说,采用后一种分类可以让我们迅速掌握80%场景下的复杂性.
建议1:有辨别力地阅读(包括那些被广泛称为“经典”的)C++书籍.
建议2:养成随时查阅资料和文档的习惯.
建议3:CSAPP &TCPL& AC++&TC++PL.
建议4:实践驱动地学习.
建议5:思考.
建议6:脱离语言思考,使用语言实现.
建议7:学习其它语言.
建议8(可选):重读本文.
二八法则
80%场景下的复杂性(大多数列表):
1. 资源管理(C++日常复杂性的最主要来源):深拷贝&浅拷贝)类的四个特殊成员函数)使用STL)RAII惯用法)智能指针等等.
2. 对象生命期:局部&全局对象生存期)临时对象销毁)对象构造&析构顺序等等.
3. 多态
4. 重载决议
5. 异常(除非你不用异常):栈开解(stack-unwinding)的过程)什么时候抛出异常)在什么抽象层面上抛出异常等等.
非本质复杂性(不完全列表)
1. 缺陷(指能够克服的问题,但解决方案很笨拙)C++的书里面把克服缺陷的workarounds称作技术,我觉得非常误导):例子在前面已经列了一堆了.
2. 陷阱(指无法克服的问题,只能小心绕过)如果跌进去,那就意味着你不知道这个陷阱,那么很大可能性你也不知道从哪去解决这个问题):一般来说,作为一个合格的程序员(不管是不是C++程序员),80%场景下的语言陷阱是需要记住才行的.
本质复杂性(不完全列表)
1. 内存管理
2. 对象生命期
3. 重载决议
4. 名字查找
5. 模板参数推导规则
6. 异常
7. OO(动态)和GP(静态)两种范式的应用场景和交互
书单:
1.《Computer Systems:A Programmers Perspective》《深入理解计算机系统》(简称CSAPP)
2.《The C Programming Language》(简称TCPL)
3.《Accelerated C++》(简称AC++)
4.《The C++ Programming Language》(简称TC++PL)
文档列表:
1.《C++ Coding Standard》
2.《The Pragmatic Programmer》
3.《Code Complete, 2nd Edition》
4.《你的灯亮着吗?》
参考资料:
1、学习C++:实践者的方法
1、学习C++:实践者的方法