欢迎关注公众号:sumsmile, 图形学、移动开发~~
从事开发工作近10年了,去年开始写C++。这篇文章讲我作为C++初学者,对学习一门语言的思考。
搜索了很多教程,有不少只是单纯的罗列学习资料,很怀疑作者自己是否读完了那十几本C++书籍。
罗列资料 == 劝退。我尝试写一篇最简单的鼓励帖,不敢说学完多高水平,应付普通的开发没问题。
下面列的学习内容,很多写过几年C++的朋友,不一定都掌握了。
用不上的工具,就不要学
业余时间,我也学了很多门其他的语言,OC python dart ruby php...,工作中几乎用不到就都忘了,最熟练的还是java。
语言就是工具,很多人一辈子都用不上英语,真的没必要去背单词虐自己。需要的时候,带着目标去学更合适。
if(你真的不需要写C++,那就别浪费时间学了,人生苦短。) {return;}
一个星期入门,上项目
大多数语言,一两个星期扫一遍语法就够了,直接上项目,在解决问题的过程中,体会语法的细节。
开发一段时间之后,再回过头来看进阶的书籍,系统的梳理这门语言的特点。
找个大腿
有条件的话,给自己找个老师,特别是刚开始,帮你解决编译、调试的问题,节省时间。
最好是把电脑抱到大腿旁边,结对编程,眼睛都不要眨,重点看他分析问题的过程,时不时的问他一句:"你怎么知道这么改就好了?"
是的,我不是开玩笑,我自己就是这么干的。刚入门时,找个大腿一步步示范给你看是非常好的学习方法,快速的学习别人积累了很多年的经验。
选一个好用的IDE
有的教程讲,建议学生先用最简单的记事本写,在命令行里敲编译命令。我是实践过的,听我的,不要那么干。
直接按照真实的开发环境来。磨刀不误砍柴工,花点时间配置好IDE,在写demo练手的阶段,就开始熟悉IDE,熟悉IDE的使用也是掌握这门语言的一部分
推荐使用Clion,因为大家都用这个。
带着问题学语言
带着问题去学习一门语言,便于你系统的梳理语言的特点。
当然,如果你觉得带着这些问题心累,Ok,假装没有这一条。
看什么书?
C++ primer确实是经典好书,建议新手可以买一本当字典(垫显示器),不要去硬啃。作为一本经典好书,太细致了,但是很多细节你一开始又用不到。
我们学汉字,老师也不是对着汉语词典讲,而是放到语境里,由易到难来分解的。
推荐一本书,我非常愉悦的、完整的、看过的。
需要的留下邮箱,发你网盘,高清无码的
真的用不了21天,我就下班回家看一两个小时,两个星期就可以快速扫一遍。
看视频
C++是真的有点难,语法灵活细节多,有必要深入的了解背后的原理,知道why,才能写出健壮的、高性能的代码。
开发一段时间后,强烈建议找点视频来学习,下面这张图,讲内存管理的,纸质的资料真的很难讲清楚整个流程。
推荐看侯捷老师的视频,推荐理由如下:
- 大气磅礴,既谦逊又自信,娓娓道来,听得很享受
- 同理心。侯捷说:我自己资质平庸,学的过程中遇到很多困难,所以我太懂一般人哪里会遇到困惑(大师过谦了)
- 既讲清楚how,也会讲why,还会讲自己是如何一步步研究清楚的,把研究的方法教给你
- 侯捷老师文人气很重,时不时信手拈来一句诗。他也自我标榜"左手程序右手诗"
网盘链接: pan.baidu.com/s/16NVyr20p… 密码: uflr
学习问题记录
学习的过程中,整理了一些问题,分享给朋友们参考,可以作为检验你学习效果的题目。
- 传值、传引用、传指针的区别,什么时候不能传引用?java 函数底层是值还是传引用呢?
- new 和 delete底层干了啥?和malloc、free有啥区别?
- 什么是模板特化和偏特化?偏特化有哪几种类型?
- 编译过程中,什么是动态绑定,什么是静态绑定?
- const有哪些用处?
- 内联函数inline一定能内敛吗?
- c++中,new delete能重载吗?malloc、free能重载吗?
- std::alloctor的实现原理
- 对象的内存分配,如何计算一个对象的内存占用?debug和release编译条件下,对象内存占用一样吗?
- 一个对象的内存分布的开头有cookie,cookie的作用是什么?有什么办法能去掉这个cookie吗?
- 什么是SBH
- malloc的速度其实很快,设计allocator的目的是什么呢?
- C++的内存分配是分多层级的,为什么要分这么多层?
- 标准库有哪几个模块
- Deque(双向队列)的原理,为什么能双向操作进出呢?
-
模板有哪几种类型?
-
容器list占几个字节?(G4.9中 容器list本身是8个字节,一个指向next,一个指向preview)
-
map insert和 []中括号操作符,这两种操作方式,哪一种插入更快?why?(直接insert快,[]操作符里面的实现会先查找,查找完再进行insert)
-
如何实现STL里的仿函数(需要继承binary_function 或者 unary_function, why?)
-
c++ 11有哪些新特性?
-
NULL nullptr nullptr_t的区别
-
c++ 和 java的lumbda的区别?(从作用域角度说明)
-
C++和java的可变参数有什么区别?
-
c++三种继承声明的区别 private protected public
-
tuple的实现原理
-
实现一个move aware class
欢迎关注公众号:sumsmile, 图形学、移动开发~~