微信号:codedumpnote

介绍:写作是最好的记录,分享是最好的学习.

谈谈C++学习的经验

2016-04-10 12:51 codedump

十几年前,刚开始学习C++时,一开始狂啃了不少经典的C++书籍:《C++ Primer》,《C++标准程序库》,《Effective C++》等等的小十本书,花费的时间和精力甚多,然而回想起来,C++语言的学习,在当时并没有一个人去指导我应该怎么学,应该学什么。到了十几年后的今天,看起来C++的这个问题仍然没有太多的改变,于是萌生了写这篇文章的想法。


在我看来,C++学习最大的问题在于:C++里提供太多的开发范式,可是缺少实践指南。用知乎网友空明流转的话说:

  1. 开发范式多

  2. 抽象层次多

  3. 最佳实践多

  4. 非最佳实践隐患多


比如C++中的继承,除了一般的继承之外,还提供了protected继承、private继承、虚拟继承等等,很遗憾其中的大部分都是很少使用的。


再比如C++中的模板,在我看到的大部分公司里跑的项目,外面开源的成功项目,只需要掌握到类似STL这样的最简单的模板就已经足够,但是很遗憾,光是模板这个知识点,C++就有很多本相关的书籍来讲述,如果深入进去真不是一时半会儿能够爬的出来的。模板玩多了还会走火入魔,写出模板满天飞的代码来变成了炫技,可是在真正的项目合作中,需要考虑的是你的代码的可维护性。


再举例子来说明“非最佳实践隐患多”这个观点。在Google的C++编程规范里面,提到了一条**使用explicit修饰那些仅有一个参数的构造函数,避免隐式转换的发生**就是一个例子。比如这种情况下:


#include <stdio.h>


class Test {

public:

  Test(int i) {

    printf("in test\n");

  }

};


void f(Test t) {

}


int main() {

  f(1);


  return 0;

}


在上面的代码中,函数f的参数是Test类,这个类有一个构造函数是传入int参数,所以当你调用f(1)时,这里面发生了一个使用int参数生成Test类对象的隐式转换。隐式转换之所以危害大,是因为其中的行为太难去发现,所以在Google的C++规范中提到了很多避免这些隐式转换的做法,在Google的人看来,一个程序的行为应该是明确的显著的,不能偷偷摸摸的做一些事情给查找问题带来困难。


可是很遗憾,类似的实践指南真的很少,一般的C++语法书,只会告诉你这样那样的语法特性,没有告诉你这些语法特性会带来哪些可能的问题。


以上可以看到,C++提供的需要语法特性,在实践中用到的只是其中的一小部分,而且这些语法特性中的很多坑没有人提示你是不是该绕过,此时就需要一个更加实践一些的学习指南,列举出哪些是你应该学习的C++了。


下面来说说就我看到的国内公司C++项目组使用到的C++特性,也就是说我认为如果能熟练掌握了这些是足以胜任这些工作的:


  • 基本的语句、表达式、函数、名字空间等,这些当然是绕不过的了。

  • 基本的面向对象、继承的概念,得知道什么是覆盖、重载、虚拟基类、虚拟函数。

  • STL的概念和使用,包括几种iterator的概念,基本的算法,需要熟练至少几个最常见容器如list、map、vector、set的使用。

  • 不需要去跟进到C++11这些更新的C++规范的语言特性,目前在国内大部分的C++岗位,C++98的标准就足以胜任。


简单一点的理解,以上的知识点大概就是C + 最基本的Class + STL


另外,每个语言的初学者当然也包括C++初学者,都会有一个误区:为了学语言而去学语言。这个误区导致了以下几个问题:


  • 不是目标导向的,他们在学这门语言之前并不知道自己确切的目的是想用来做什么,只是为了学而去学。

  • 滥用语言特性,既然学了这个语言的这些特性,总想着要用上,后面更是变成了纯粹的炫技。


我的建议是,学习一门语言,应该是业务方向导向的,比如你想使用这门语言用来开发游戏,做客户端软件还是用来写服务器。有了具体的方向,再具体来看围绕着这个方向展开学习具体的知识点,这其中语言的学习只是其中的一个部分。


说了前面的话,现在来总结一下我个人认为比较实用的C++学习路线:


  • 选一本不那么厚的C++语法书,大概300页左右,要求把C++中最重要常用的知识点在这本书里都讲到,目的在于能够快速的对这么语言有一个大体的了解。在我看过的C++书籍中,《Essential C++》个人认为是最符合这个条件的。学习一门知识时,能在刚开始快速掌握其中最常用的大部分知识点是很重要的,如果这个过程太长,人容易疲劳学习的热情被消磨,也找不到重点。我以前就是犯了类似的错误,当年花了一年多来啃那本大部头的《C++ Primer》。

  • 看《Effective C++》,这本书是讲诉C++最佳实践的书籍中最好的一本,把里面的每一个item都搞懂,不懂就查阅相关的资料去学习,以这里面提到的item来驱动你在前面基本的语言了解之后再深入一些的学习C++知识,重要的是这本书里讲到的点都是很实际用到的知识点和坑。

  • 有了前面两个基础,基本的语法、坑、实践指导都有大体的了解了,可以开始根据想做的业务方向去选择那个方向相关的优秀开源项目,以项目方向和代码阅读来驱动学习了。

  • 这里还需要提到另一个资料,Google的C++编程规范,一般的编程规范基本都是在说变量的命名,文件的组织这些,Google的这个规范是一份工业项目的实践指南,里面提到了很多C++项目应该怎么做和不应该怎么做,看过的几份Google的开源C++项目,如Leveldb、Tcmalloc、glog都是按照这份指南来实践的,如果有机会对照着看效果会更好。

当然,这上面只是最简单精炼的入门指导,书也只推荐了两本,如果需要更深入当然还是需要继续看其他的资料的,只是我认为有了以上的准备就可以去接触实际具体的项目了,而不用继续在一堆C++理论书中埋头了。


 
Codedump的技术笔记 更多文章 微信自研生产级paxos类库PhxPaxos实现原理介绍 Lua语言的前世今生 分布式网游服务器架构中的对象管理 几种一致性模型的分析 [论文阅读]Yahoo的PNUTS系统
猜您喜欢 R Tricks: 如何处理Gaps &amp; Islands问题? 深度 | 深度学习创业公司需要了解的12件事 Objective-C语法之NSArray和NSMutableArray 【干货】五年Android开发,让我“刻骨铭心”的那些坑 MySQL 在大型网站的应用架构演变