网站首页 > 博客文章 正文
闲扯C++道路的经历
-
前言
不知道会不会被骂,毕竟作为一个还不能称为精通C++的人说这些在大神面前总显得有些班门弄斧了。
周围有不少的同学朋友编程都相对比较差,感觉是缺少一些方法,我把我的历程经验贴出来,供大家参考,也欢迎牛人继续讨论。
大学
大学时候,必修的C,选修的C++,当时就只知道什么类呀,继承啊,多态啊之类的称呼,根本不能说会用。
写个Retangle类还行,一碰到实际的需求,还是用C的过程性的描述,外面一大推的全局变量,然后一堆C函数堆砌在一起,就算完成任务了,根本没有面向对象的思想。
后有幸进入一家公司,进行了大约1年半的C++开发。
整个大学完成,会基本的C编程,数据结构知识略懂一些,用C实现过基本的数据结构,C++基本没有用过,知道STL的一些容器的用法。
工作
阅读底层库
刚入职的时候,一直充满着热情,加班算不上多,每日都有很多的空余時间。
我们公司有套1990年左右写的底层库,是1个涉及到大规模节点保持可靠通信的库。
以前校园内也没怎样看过他人写的代碼,如今突然之间冒出这么多的代碼,并且写的很好,一瞬间感覺自己差距太大了。
因此晚上下班了以后,我的每天的工作就是阅读公司的底层库,缓缓的知道怎样实现跨平台的线程,锁,怎样实现多线程之间的消息传递,怎样进行对象的封裝,怎么使用类的多态的特性,怎么使用状态机。
因为是1个古老版本的底层库,代碼量也算不上多,几千行的样子,看了好几周,才彻底弄懂內部的流程。
那时候感觉写那个代碼的人真得好nb,如此多样化的结构都可以设计的出来。
总经理的建议
我有阅读文章的生活习惯,平时周未闲来无事,就爱看书。
那时荣幸和我们的总经理hyy探讨这个库,总经理特别给我推荐了MFC的实现代碼,虽然MFC大学我也看了,但也是浅尝辄止,当时还装逼式的买了一本深入浅出MFC,自己还真把他基本看完了,不过只是看,并沒有真的正确理解里头的奇妙。
那时总经理着重强调了它里头用的最好的是宏,他那么一说,我立马就反应过来了。
的确呀,里头的动态创建,消息传递,执行时类型识别,序列化和反序列化都是用宏实现的,将内部的很多代码隐藏了起来,就只需要在类中加入DECLARE(…)这样的字样,就可以实现许多特性,这些declare都是宏。
即然总经理大力夸赞,咱必须再次拜读一下。
重读深入浅出MFC
有了阅读开源库的经历,我发现了再一次重读深入浅出MFC并没有这么费劲了,前面讲述的虚函数的机制,虚表的一些构成我立刻就心有戚戚焉了,而不是如过去的死记硬背一样。后面就是关于动态创建,运行时类别鉴别等等特性的实现机制,我不再像以往那样,仅仅是阅读罢了,这一次我就要实现它。
我就依照那本书说的机制,已经书本上贴出来的代码,一点点的敲。
书看得很快,1个特性一两天就可以基本吃透,但是敲代码自己就慢多了,各种调试异常,毕竟书中的代码是一片一片的,我需要依照自身的感覺将它们整合在一起,自己就会犯各种错误。
功夫不负有心人,大概一个月的样子,我把它的全部特性都逐个实现了一遍,总共代码量有两三千行的样子,虽说主要是抄的,但是感觉自个真心领悟到很多。
这个宏实在太奇妙了,并且还实现的怎么雅致,那种感覺真得非常好。
看c程序设计语言
这本书大学的时候读过,当时也写了不少的代码,给自己帮助很大,这一次重新读了一些过去跳过的章节,收获很丰富。
我建议初学习c++的朋友一定先仔细读读这本书,课后习题多做一些。
我自己做不到每题都做,但是书上的例题我全部抄完,课后的习题我选了部分进行了实现。
看设计模式
后面我就开始看设计模式(四人帮的那一本)。
很多人都说这本书特别晦涩难懂,说实话,确实有点难度,语言很抽象,比较费劲,虽然书非常薄,但是每一种模式都让我花了不短的时间才搞定。
有了过去的经验,我不再满足于看了,每看完一个模式,我都去实现一种。
当然那种代码没有什么特别的意义,就纯粹为了实现而实现,但实现完的感觉就是爽。
现在我已经忘记了自己是否都实现了,常用的我肯定都实现过,而且不只一遍,大约有10几种吧。
设计模式是一种思想性的东西,它教会我如何针对一个实际问题,去构造单独的类,然后设计类内部以及类之间通信的接口,从而给外部提供一个更好的抽象。
看Effective C++
看完设计模式,我又把视角回到了C++的学习上。
大家都说C++程序设计语言是C++最经典的书,我大学的时候买过一本,但是没怎么看,感觉太晦涩了。
那难的不行,先选个简单的看看吧。
于是选了effective C++, 这本书提供了C++编程的一些tips,看着真心好,后面公司写代码的时候我很多都会参照这些tips去写代码,当然也并不是完全照搬的。
这本书有些设计模式的思想和GOF的那本有重叠,让我对有些设计模式理解的更深入了。
我还买了一本more effective C++,但是读了前两章之后,感觉太难读了,就没再读下去。
这中间的工作
这中间我们在一个开源代码asterisk上进行修改。
我主要负责底层dahdi驱动这一层面,当然上层的代码我也要改。
有很长的一段时间,我都在阅读asterisk的代码,代码是纯c语言的,但是整个代码的框架并不是面向过程,而是面向对象,同时还有继承,虚函数的思想。
那是我第一次发现c实现面向对象也可以实现的这么优雅,结构体的嵌套,函数指针作为结构体的成员等等。
后来老大派了一个任务,让把asterisk的流程梳理一下,这正合我意。
我那一两周每天就是读代码,打日志,跟踪程序的执行流程,写了不少的文档,对c实现面向对象理解的更加深入了。
同时里面那么类之间的沟通协作,他们做的非常好,真的很牛。
读代码最重要的是真心读懂,吸收别人的精华,并为我所用。
下班后每天坚持学习
后面在某机构学习直接将我的c++的能力提升到了一个新的层次。
有了那么多的读代码的经验,我再看代码就可以很容易猜出它的意图了,因此我听了他们的一次公开课,让我对c++有了更深层次的认知
那期的课程很长,我采用的方式每天晚上坚持学习(活到老,学到老),经常看的时候就发现这和我看过的源代码的思想有很多重叠,只不过课程中老师解释的更清楚,告诉我们他为什么那么做,真的很好。
现在依然记得的有异常处理,资源管理创建并分配,scoped_ptr,内存池,还有设计模式的一些应用,反正学的时候,是各种共鸣,与大学时候学习的概念完全是两码事。
虽然很长,我学的很快,很多课程我直接跳过了。
再后面学了c++对象模型
主要讲了类,继承,派生,多态到底是如何实现的,这一下子颠覆我的思维了,过去我一直作为c++的使用者,根本没有去想这些东西是如何实现的。
学了这课,知道了它的内存布局,以及编译器的处理流程,逼格立刻高了不少,是一堂让我升华的好课。
学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习C/C++或者为了入行、转行学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频
继续谈工作
后边我的工作转向了修改sip代碼。
于是下載另个开源库,继续每日的读代碼,同样是纯c实现的,这一次读起来省劲的多了,很多都与自己有共鸣了。
看了一部分就能猜出来后面会怎么实现了。
老大了解我拿手搞这个,依然交给我。
我就负责读代碼,会上报告这个代碼的流程,并给出应该在哪里修改才能为我们所用。
在后边有段时间,我迷上了chromium以及webrtc,阅读了它里头的许多代碼,这两个都是c++的,利用许多c++的特性,因此实现起来就比c顺畅的多了。
有的时候c需要绕个弯才能实现的,c++直接就可以干。
收获颇丰。
后来
后来我辞职了,考了个研,加入了另外一家公司做ios开发。
我不喜欢开发界面,在ios组也几乎总是在做客户端的底层实现。
不过那些比起c++开发就容易一些了。
总结
针对学习c++,我感覺一个是要练习,多敲代码,1个是要多读书,读经典的书,还有一个是多读源码,吸收其他人敲代码的思维,认识自己敲代码的欠缺。
敲代码是提升自身熟练的程序,做到写得快;念书是提升自身的视域,提高自己的专业能力;
看其他人的代碼和念书有共同之处,可是它是以一种直接呈现的方式,因而需要自己仔细去感受写代码的人的良苦用心,才能真正体会到优秀代码的美。
这三者要结合在一起才行。
学好c++,再学习别的的語言,确实感覺简易的多。
学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习C/C++或者为了入行、转行学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频
不过我个人建议最好再学习一门脚本语言,我选的是python,看了python基础教程,同时看了一本计算机程序的构造和解释(还有两章没看),这样才能对编译型和解釋型的語言都理解的好一点。
自己都没有统计分析过写了多少行的代碼。
自我评估大学的时候写的也就有三四千行的样子,在工作中有2万行,目前念书也就有个一万行。
认真看过的编程书籍列表:
- C程序设计语言
- C++程序设计语言
- effective C++
- 设计模式Gof
- 深入探索MFC
- header first设计模式
- 算法导论
- 数据结构c语言版(大学课本)
- Linux程序设计
- python基础教程
- java编程思想
没看完整的编程书:
- 计算机程序的构造和解释重构
- Java核心技术
-
如有侵权,请联系删除
- 上一篇: c++哪些相对简单的知识点(c++必知必会)
- 下一篇: C++精品案例-音乐播放器与状态模式
猜你喜欢
- 2024-10-01 操作系统 : 按优先数调度算法实现处理器调度(C++)
- 2024-10-01 c++ 疑难杂症(13) allocator(c++ catch all exception)
- 2024-10-01 百度C++工程师的那些极限优化(内存篇)
- 2024-10-01 C++20 香不香?从四大新特性看起(c++20支持)
- 2024-10-01 用C++11打造智能观察者模式:详解实现步骤完整示例代码
- 2024-10-01 网络编程:手绘TCP状态机(tcp状态转换图详解)
- 2024-10-01 C++为什么不提倡使用单例模式?(c++为什么不用printf)
- 2024-10-01 智能系统机器人!C++实现三阶魔方自动求解程序源码
- 2024-10-01 ChaosBlade 发布对 C++ 应用混沌实验的支持
- 2024-10-01 C/C++编程笔记:C++智能指针及其类型的介绍!重点分析
你 发表评论:
欢迎- 07-08Google Cloud Platform 加入支持 Docker 的容器引擎
- 07-08日本KDDI与Google Cloud 签署合作备忘录,共探AI未来
- 07-08美国Infoblox与Google Cloud合作推出云原生网络和安全解决方案
- 07-08GoogleCloud为Spanner数据库引入HDD层,将冷存储成本降低80%
- 07-08谷歌推出Cloud Dataproc,缩短集群启动时间
- 07-08Infovista与Google Cloud携手推进射频网络规划革新
- 07-08比利时Odoo与Google Cloud建立增强合作,扩大全球影响力
- 07-08BT 和 Google Cloud 通过 Global Fabric 加速 AI 网络
- 最近发表
-
- Google Cloud Platform 加入支持 Docker 的容器引擎
- 日本KDDI与Google Cloud 签署合作备忘录,共探AI未来
- 美国Infoblox与Google Cloud合作推出云原生网络和安全解决方案
- GoogleCloud为Spanner数据库引入HDD层,将冷存储成本降低80%
- 谷歌推出Cloud Dataproc,缩短集群启动时间
- Infovista与Google Cloud携手推进射频网络规划革新
- 比利时Odoo与Google Cloud建立增强合作,扩大全球影响力
- BT 和 Google Cloud 通过 Global Fabric 加速 AI 网络
- NCSA和Google Cloud合作开发AI驱动的网络防御系统,加强泰国网络空间的安全性
- SAP将在沙特阿拉伯 Google Cloud 上推出BTP服务
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)