C#转C++的一点分享

爱情经纬线 发布于 2014/01/17 19:30
阅读 3K+
收藏 12


从C#转C++有段时间了,一直想分享点什么,但又不太好意思分享,毕竟自己做C++的时间不太长,最近感觉自己已能胜任现有工作,想分享的想法又强了点,前几天看到这样一篇博客《那些年·我们读过的专业书籍》,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不了2,3本书,不同的技术能力的人,适合看的书都不太一样,在这么多大家都认为是经典的书中,选出几本真正适合自己的才是王道,经典一多了,有些比起来就不是那么经典了,当然大家都说经典,自然有可看之处,如果有多余的时间,多看些书自然是好的。

下面是我看过的技术书籍(不一定看完),还有本《程序员的自我修养》在老家,其他几本不怎么样就没有列出来。

买的第一本技术书籍是《数据结构与算法分析》

当时刚毕业不久,在学校时没有买技术书籍的概念,在学校时也没怎么逛过技术网站,毕业后逛得比较多,当时是做C#,那时Android很火想学,内心又一直认为成为一名好的程序员,底层知识是要会的,当时的情况是:在做C#,想做Android,又想做C++,没准备长做C#,最后买了这本算法相关的书籍,决定学C++,注意准备开始吐槽:是谁说程序=算法+XX,这个等式对于很多刚毕业的同学们根本不成立,算法对于大部分的程序员来说都是弱项好不好,很多菜逼根本就不会算法,就会增删改查,有木有,别一开始就来最难的,容易打击自信心,是谁说算法很重要的,哥才写了90多篇博客,就有19篇跟算法有关的,私底下也学习了很多算法相关的文章,哥是要转C++好不好。吐槽告一段落,算法还是很重要的,有时间还是要好好研究一下。

 

《Effective C++》买的第一本完全关于C++的书

刚开始都看不懂,反复看之后,就很懂了,到现在为止应该至少看了4遍,感觉现在给我大半天的时间,能大致在看一遍,曾经一度想把书中的50条法则写成几篇博客的,最后由于太懒只写了3篇

Effective C++面向对象与继承

Effective C++ 类与函数设计和申明

Effective C++构造函数析构函数Assignment运算符

开始没看懂的时候,没觉得这书怎么样,等一条一条的看懂之后,发现这书他妈的写得太好,我忍不住的要赞美他,作者用很短的几句话就把事情说得很清楚,作者的表达能力的确牛逼,再次发现作者表达能力特别牛逼的是看吴军的《数学之美》,他用几句话就把一个关于图的问题讲得很清楚,其他的一些所谓的经典作者写的内容看起来就不是那么好理解,当然这跟讲的内容、跟读者所掌握的的知识以及读者的理解能力有关。

如果你要学C++,那么我推荐你看这本,虽然它没有教我们入门C++,也没有教我们深度理解C++,也没讲更底层的知识,但是它是第一本,将很多关于C++编程的重要知识点收录成的第一本书,第一本自然收录的是在开发中出现频率较大的,值得一讲的内容,之后有很多所谓经典的跟风之作,如

《Exceptional C++》和《More Exceptional C++》,包括作者自己的《More Effective C++》,

当然这些书中讲的内容可能是你八辈子也用不上的,但可能是要掌握的,这些书讲的差不多是一些技巧性的东西,或是实现了一个XX功能,有点通用性,人家把这些点讲得很清楚,这类书不用急着看,等你C++学得差不多了,再看也不迟,那时会看得很快,因为他们没讲什么新的知识,都是对现有知识的运用。

 

《深度探索C++对象模型》要想更深入的理解C++,当然是这本,这本真的是经典中的必看。

这本书共7章320页,但出版社却把它弄得比较厚,好像不厚就感觉不是好书似的。每章的内容都很不错,建议重点看第三章和第四章,第三章讲C++对象的内存布局,第四章讲C++的各种方法编译后是啥样子的,以及方法是怎么被调用的,这是C++最重要的东西,其他任何技术不都是建立在数据和方法之上吗!当然如果你是菜鸟看完之后你还是菜鸟,你不会变成大牛,因为我看了这些书后我并没有变成大牛,你同样也不会,但你会更深入的理解C++,你会对你自己的能力更自信。看完这本书后,我觉得我可以做C++了,于是跨部门面试,十分钟左右,我现在的经理就问我什么时候可以过来。当然刚开始做C++时各种不顺,实战太少。你不会因为看了几本书而成为大牛。看这本书之前除了《编译原理》还没有买,其他的书都看完或是看过一些,刚开始的时候有点看不懂,之后很快的看懂并看完了,因为看这本书之前我反复看了《深入理解计算机系统》的第七章(链接)和《程序员的自我修养》的大部分内容,对编译和链接还是有些了解,再看这本书自然会快些。看完这本书我写了三篇博客,但看的人很少。

构造函数产生的点及原因

虚方法的调用是怎么实现的(单继承VS多继承)

C++ Data Member内存布局

深入理解计算机系统就不多说了,估计每个过来人都会推荐,如果你想成为一名好的程序员,就是必看必看,不管你是什么程序员,我相信很多C#牛逼的程序员都看过,这本书讲了很多重要的知识,不是很深,但装逼足以,要全都看懂还是有些难的,之前就有个同事买了这本书,里面夹了一张跟他有纯洁男女关系的女性朋友的照片,作为书签,,这的确是督促自己看书的好方法。关于这本书我写了两篇博客,用这本书的内容写博客可以写很多篇。

数据对齐

在开发中你可能没有考虑到的两个性能优化

由于我一直在自学C++,重点推荐这3本,前两本推荐指数更高:

1:深度探索C++对象模型

2:深入理解计算机系统

3:Effective C++

其他的一些书都是值得看的,写到这里就有点不想写了,再说一本吧,其他的就不多说了,看完了上面这三本,再看其他的。由于我是做Windows C++开发,就说说《Windows核心编程》,做Windows开发的同学要看看。关于这本书我写了4篇博客

多线程编程--5种方法实现线程同步

Windows几种线程同步方法介绍

Windows线程基础

Windows内核对象简介

这4篇博客基本上是讲线程、进程、内核对象、线程同步。这本书讲了Windows操作系统的很多东西,如内存管理,动态链接库,这些都是做Windows开发需要知道的,也是我比较薄弱的,在开发中基本都是用库,现在做的项目,两个Solution,其中一个有100多个project,刚开始来的时候经常编译都通过不了,加上每次编译的时间较长,搞了半天编译失败,挺打击人的。

关于书的内容就说到这里,免得大家以为我是来说书,显然说书不是我的强项,现在就来说说转C++的一些感受。


老实说如果现在用的是C#、JAVA、PHP等,且没用过C/C++不太建议转C/C++,但非常建议多看看底层的知识,C#做了几年之后发现也就是那点东西,不深入学习,很多东西其实是只会用,根本不知道到底是怎么回事。我相信很多C#程序员不知道多态到底是怎么实现;方法到底是怎么被调用的;不知道哪些是在编译器确定,哪些是在运行时确定的;经常听到字符串池的概念等,微软把C#封装得太好了,掉坑里的机会太少了,大不了不管3721,try...catch一下,也让有些人变得不那么爱思考了,像C/C++一不小心就掉坑里了,不思考都不行。经常听到有人说:C#入门容易,精通难。那是因为学底层的知识更难些好不好。说这些不是针对谁,以前写C#就是吃着火锅唱着歌,各种轻松舒服,C++就两字:苦逼。要啥啥没有,如分割字符串这种最基本的功能都得自己实现,刚做C++的感觉就是:自己坐在豪华的游艇上,看到对面的海盗船很酷,于是就往海盗船一跳,一上船发现这坐船到处都在漏水,各种设施都很差劲,一不小心就掉水里了,各种感觉不适应。

 

学C++好很长时间吗?不要

从自学C++到现在差不多3年时间,期间多次想放弃,心中常有的一个念头就是:把这些时间用在学C#,C#可以学得更好,工资可以拿得更多,每次看到发到手中的这点工资,就没啥干劲了,但我也一直明白若要把程序当做一个长久的职业,我是要必会C/C++的,期间偶尔有几个月没有学C++,但最后还是放不下,又想起她。最后拖到两年多才做自己一直想做的C++,感觉是个很漫长的过程,内心的针扎还是挺多的。这两年来业余时间拿来学习C++的时间平均在半个小时左右,跟10000个小时比起来还是很少的,当然10000个小时是要成为真正的大牛的,而我是刚上贼船,看了这么多书理论还是有些,还需大量实战。

 

C++很难吗?NO

C++被成为世界上最难的编程语言,其实并没有传说中的那么难,但有一点是可以肯定的C++程序员在没有成为小牛之前一直都在针扎,对,就是针扎,过得很苦逼,我在上个部门做C#的时候没加过一天班,做C++后,以前的同事说我瘦了,以前做C#用一个月的时间一个人重写了公司的工作流,做C++后,花了两个多月做个历史管理器,还经常加班。虽然现在自信多了,但还要继续针扎下去。等成为小牛后,我相信就不分编程语言了,但如果你不是做C/C++,却想做C/C++,就别听语言都是浮云这种废话。在你成为小牛之前你才是浮云,你得苦逼,而且这是转行,这也是我不太建议转C/C++的一个原因,你之前学到的很多东西都是白学的,你要从0.1开始,又开始做菜鸟,大家都知道菜鸟的日子不是那么好过,等你成为小牛之后编程语言才是浮云。为什么大家都说他难呢?我估计就是被哪些没学好的人宣传的,没学好之前过得苦逼,那当然发自内心的认为难,其他的朋友们听他们一说估计也觉得难。在加上一些大牛也说C++难,人家说难不是因为自己没学好而说难,人家是因为知道得大多,发现C++太灵活,坑太多,新手很容易掉坑里。要我说,任何编程语言,基础语法也就那点东西,等你明白了这些基础的东西是怎么实现,为什么要这样实现,编译后是个什么样子,你也就发现C++也就那样,不管牛不牛,也都是在用C++干活,只不过是有的人再用C++做增删改查,有的人在做大家都在用的产品。

 

怎么学习C++?标准答案是:多思多写多看

作为新菜鸟的我,是不应该回答这个问题的,但这个问题的正确答案的确是多思多写多看。现在来说说我的失败经历,作为智商不太低的我,学了两年多才做C++,这显然是失败(哈哈,程序员就应该自信,千万别怀疑自己的智商,一点都不能有)。的确我是走了弯路,所以我像很多有失败经历的前辈一样,来分享自己的失败经历,以免后辈们重蹈前辈们的覆辙。


我学了好久的C++,都不会写一个C++的类,其实开始的时候一直都是在写C,一直在用C写算法,严重受了算法重要的影响,其实开始的时候我都不是在学C++,买的第一本技术书,不是关于C++的,而是关于算法的。学C++的时候也没有买一本比较好的系统介绍C++的书籍。直接第一本C++书籍就是Effective C++,看这本书还是要一定基础的。看这本书的时候我已经做了两年多的C#,在学校里有一点C的基础,之后也看过《高质量C++编程指南》,还是有一定的程序基础,如果你有一定的程序基础,想转C++,还是建议先看本系统介绍C++的书籍,如《C++ Primer》,这本书的作者也是《深度探索C++对象模型》的作者,还有C++他爹写的那本啥也值得一读,大家都是这么说,应该不会错,两本选一本,有一定基础之后再看Effective C++,感觉不错之后再看《深度探索C++对象模型》,这本差不多之后再看《深入理解计算机系统》,这本不是讲C++的,讲的是底层的东西,你学C++不就是想学底层的东西吗,C++语法就那点东西,成为牛人之前还有一堆的书等着你去看,你还要写一堆的代码。

http://www.gwdang.com/app/extension现在在学习Windows的一些东西,做Windows C++方向吗!业余时间看看《编译原理》,比较难懂,看懂之后,我相信很多东西都会明白得更透彻。明年估计是我成为小牛的重要阶段,阿汉加油。http://www.gwdang.com

加载中
0
喵星人哦
喵星人哦
壕,这么多书
0
陨落人间
陨落人间
看到最后一段怎么有广告的味道?
NealFeng
NealFeng
最后一段里面的链接真的是广告。。。这文章写的看着很混乱啊。。。
0
宏哥
宏哥

花10000个小时学C++

两个字

犯贱

0
gvim
gvim

引用来自“宏哥”的答案

花10000个小时学C++

两个字

犯贱

支持。学C++就是找不自在。重剑无锋,大巧不工,然C++花花样子太多了。

0
猎户座
h
heyingnanfaith
Lm,lklk
0
ericsoul
ericsoul
从楼主写得有点混乱的结构来看,本文不是软文。看完有一些收益,谢谢lz。另外发表一下,c/c++的个人看法,c++是c的超集,他本身就是c语言。他附加了一些特性,最主要的就是万物都是类。面向对象是一种思想,他不是c++的本质。只用c语言同样可以使用面向对象的编程思想,c++同样可以用类写面向过程,或者面向模块的程序。只是c++提供了便于面向对象的特性。我从来不区分c/c++,他们的工作范畴不一样。用c++写驱动写底层,很容易掉进c++它的复杂中去。而驱动和底层都是1是1,2是2的。而c语言的直接控制想控制的东西,是轻松的。而c++,他包装了一系列的东西,只有你清楚了他的实现等等,才不那么容易掉坑。c的难点在于控制你想控制的东西实现功能,所以算法比较重要。而c++的难点在于,你不一定搞懂了你正在控制的东西。你的抽象不一定对。你的特性不一定适用这个需求。但是c++他封装c,包一层叫做面向对象的特性是为了,支持可复用,易于变更,易于维护的,未知模型。这里不是说,c不易于维护。而是软件的维护性。c++可以很方便的在不改动原有代码,且不需要重复很多的代码的情况下,拓展甚至是修改需求。当然,设计良好,足够模块化的c同样可以,但是c这需要足够牛的c程序员来设计。而c++在一开始就强迫程序员设计叫类的这种东西了。+提供了一系列
0
ericsoul
ericsoul
如果lz不是写软文,那么可能我们是志同道合的伙伴,有一些东西可以请教您,或者和您讨论。
0
ericsoul
ericsoul
有两个想说一说:工作三年半,基本是维护岗,在最近才看完了primer,受益良多。看了三年,第一年,看得很慢,第二年,看到一半,c看完,c++基础看完。后面发现很难啃。最近半年发现随着工作少量的开发和大量代码的阅读,和一些个人喜爱,最终发现看起来很轻松很容易懂,当然还是有部分涉及的少的是囫囵着看完的。之后先下来effective c++的电子版预读了一下,发现很多东西其实primer里面都有讲,而且我都,标注过重点和自己的理解的东西。所以觉得effective c++,感觉有点强调的意味。。。不知道是不是我目前功底还不够?!
ericsoul
ericsoul
其实还有,lz你是怎么做到短时间看完这么多书的。3年?还是说三年前的c#开发一下,程序思想的累积也是有很大帮助?我现在理解了,为什么我2年前啃不动primer,为啥现在啃得动而且收获还很多。lz有这样的感觉么?
ericsoul
ericsoul
第二点是,关于,深层次解析c++对象模型,似乎是有点,用c语言,写面向对象程序的感觉是么?感觉就是,c++对象模型的设计,他怎么存储,怎么在程序中被调用,怎么实例对象,怎么实现继承,怎么实现多态这种特性。个人感觉就是像用伪代码或者直接用c语言实现这些特性?是么?
0
陈序猿
java程序员也想转C++
返回顶部
顶部