在学习C++上有什么想对新手说的,进来随便说两句吧!
-
- 帖子: 51
- 注册时间: 2006-12-25 16:03
在学习C++上有什么想对新手说的,进来随便说两句吧!
看到版内有同学也有我这样的困惑,本来是作为回帖的,突然觉应该拿出来,这样可以得到更多的帮助。
很偶然的机会接触到ubuntu的,最初仅仅想了解一下linux的,忽然就喜欢上了,或许是自己花了许多时间来配置他吧, 虽然让大家见笑了最后只不过配成了WINDOWS,不过自己努力在里面,懊恼许多次,看了许多文章,自己解决问题后感觉很 好,也学到了不少知识。
大二的时候学过两个学期的C++ ,学的是visaul C++6.0 ,自己也对编快程产生了兴趣,也跑去拿了个二级证书,那时很想去认真学学,可惜专业课程很多。现在大三下学期了,大学也快结束了,对ubuntu产生兴趣后突然想重新捡起自己对C++兴趣,如果放弃了很可惜,以后说不定就没机会去学了。但在linux下感觉自己学的visaul C++知识太有限了,在版内看了一下,文章大多看不懂,也很少看到有一些指导新手的文章,一下子不知该如何起步?该去看那些书?该怎样开始接着去学习?
在版内也看见有同学有我这样的困惑,希望每个进来的看的人都能随便说上两句,把你的经验和我们这些菜鸟分享一下,这也是ubuntu所倡导的精神吧。
你可能是随便说的,但会对我们有很大指导作用,谢谢!
很偶然的机会接触到ubuntu的,最初仅仅想了解一下linux的,忽然就喜欢上了,或许是自己花了许多时间来配置他吧, 虽然让大家见笑了最后只不过配成了WINDOWS,不过自己努力在里面,懊恼许多次,看了许多文章,自己解决问题后感觉很 好,也学到了不少知识。
大二的时候学过两个学期的C++ ,学的是visaul C++6.0 ,自己也对编快程产生了兴趣,也跑去拿了个二级证书,那时很想去认真学学,可惜专业课程很多。现在大三下学期了,大学也快结束了,对ubuntu产生兴趣后突然想重新捡起自己对C++兴趣,如果放弃了很可惜,以后说不定就没机会去学了。但在linux下感觉自己学的visaul C++知识太有限了,在版内看了一下,文章大多看不懂,也很少看到有一些指导新手的文章,一下子不知该如何起步?该去看那些书?该怎样开始接着去学习?
在版内也看见有同学有我这样的困惑,希望每个进来的看的人都能随便说上两句,把你的经验和我们这些菜鸟分享一下,这也是ubuntu所倡导的精神吧。
你可能是随便说的,但会对我们有很大指导作用,谢谢!
- anticlockwise
- 帖子: 2394
- 注册时间: 2007-03-01 20:46
- 来自: 湖南长沙
首先,学习C++的话,应该从C++的底层学起,而不要去学Visual C++,应该首先学会如何只用文本编辑器和编译器进行开发,其实所有语言的学习都如此。
我是用Java的,虽说有许多IDE,如Eclipse,但最终又回归到了文编辑器加Ant,如此我的效率倒还更高。
C++的话,在Linux底下当然就是使用GCC作为编译器啦。VC只能用于Windows,他所开发的C++程序是不能直接在Linux上跑起来的。C++最初级的库就是STD库,里边包含了许多经典的数据结构的实现,都非常实用。
C++编程还有一个离不开的就是Makefile,这是开发大型程序所必备的。
最后,就是多编程,这点是适合任何程序语言的,呵呵,这是我的观点,我不是高手~~
我是用Java的,虽说有许多IDE,如Eclipse,但最终又回归到了文编辑器加Ant,如此我的效率倒还更高。
C++的话,在Linux底下当然就是使用GCC作为编译器啦。VC只能用于Windows,他所开发的C++程序是不能直接在Linux上跑起来的。C++最初级的库就是STD库,里边包含了许多经典的数据结构的实现,都非常实用。
C++编程还有一个离不开的就是Makefile,这是开发大型程序所必备的。
最后,就是多编程,这点是适合任何程序语言的,呵呵,这是我的观点,我不是高手~~
-
- 帖子: 31
- 注册时间: 2005-10-26 22:18
看了你的帖子,想起自己的一些经历,有所感触,不过跑题了:
我不知道你是为什么喜欢linux,我来说说我的体会吧,关于linux和编程。
其实我也只接触了linux一年多。
linux是给程序员用的系统。
win下的软件都是贴近用户的,
linux下的软件是贴近代码的。
它的优势在于一切源码都可以免费得到。
你对系统或者应用程序有任何不满,
都可以按照你自己的意愿去改进它。
我印象很深的是当时装了beep-media-player,
不能播放wma格式的音乐文件。
从网上找了一个插件,(当时只找到源代码)
编译,出错。
郁闷,不过看了下错误信息,去把源代码删掉了两行,
竟然好了。
当时非常兴奋。
我没有接触过音频文件编码编程,
可是那个插件确实是在我的改动下成功了。
(虽然只是删了两行,可是那也是我参与了。)
GNU/Linux的文化、精神大概就在于此。
开放,自由。人人皆可参与,一切皆可定制。
回来说C和C++,
坦白说,linux下至今我没有见过一个很好的可以与win下面的vc比的C++ IDE。
为什么?
当初刚刚在linux下编程,随意写了一个使用了<math.h>里面的函数的c程序,
使用命令gcc a.c 竟然不能编译!
郁闷,无奈,google之。
原来调用了数学库就要 -lm .
心里开始骂gcc怎么这么不智能,
这一点破事都要老子动手。
然而后来学写makefile,
之后忽然就悟了。
如果在win下面,用vc,
我大概是永远也不会明白编译器后台在干什么,在怎么干了。
这时再看anjuta等开发环境,
竟是如同鸡肋。
所以说,学编程,还是要在linux这种环境上,
学一点makefile,vim。
学C++语言本身没什么好说的。
既然你已经有了一定基础,
那就把《thinking in C++》看一遍,题目做一遍。(中文版有好多低级错误)
再把C++之父的《C++程序设计语言》读一遍。
之后就随心所欲了。
<C++ primer>是不错的C++全书。
《inside the C++ object module》深度剖析,较有书生气。
《effective C++》剑走偏锋。
《The C++ Standard Library》也是不可不读。
《C++ Templates The Complete Guide》专谈模板。
《C++ Template Metaprogramming》模板元编程是近年比较热的话题。
学了语言之后,
读一些源码。
比如学c可以读gzip,(顺便学习压缩算法)
学C++可以读wei dai 的 crypto++库等(顺便学习密码学)。
(crypto++库也是学习C++模板编程的好材料)
我不知道你是为什么喜欢linux,我来说说我的体会吧,关于linux和编程。
其实我也只接触了linux一年多。
linux是给程序员用的系统。
win下的软件都是贴近用户的,
linux下的软件是贴近代码的。
它的优势在于一切源码都可以免费得到。
你对系统或者应用程序有任何不满,
都可以按照你自己的意愿去改进它。
我印象很深的是当时装了beep-media-player,
不能播放wma格式的音乐文件。
从网上找了一个插件,(当时只找到源代码)
编译,出错。
郁闷,不过看了下错误信息,去把源代码删掉了两行,
竟然好了。
当时非常兴奋。
我没有接触过音频文件编码编程,
可是那个插件确实是在我的改动下成功了。
(虽然只是删了两行,可是那也是我参与了。)
GNU/Linux的文化、精神大概就在于此。
开放,自由。人人皆可参与,一切皆可定制。
回来说C和C++,
坦白说,linux下至今我没有见过一个很好的可以与win下面的vc比的C++ IDE。
为什么?
当初刚刚在linux下编程,随意写了一个使用了<math.h>里面的函数的c程序,
使用命令gcc a.c 竟然不能编译!
郁闷,无奈,google之。
原来调用了数学库就要 -lm .
心里开始骂gcc怎么这么不智能,
这一点破事都要老子动手。
然而后来学写makefile,
之后忽然就悟了。
如果在win下面,用vc,
我大概是永远也不会明白编译器后台在干什么,在怎么干了。
这时再看anjuta等开发环境,
竟是如同鸡肋。
所以说,学编程,还是要在linux这种环境上,
学一点makefile,vim。
学C++语言本身没什么好说的。
既然你已经有了一定基础,
那就把《thinking in C++》看一遍,题目做一遍。(中文版有好多低级错误)
再把C++之父的《C++程序设计语言》读一遍。
之后就随心所欲了。
<C++ primer>是不错的C++全书。
《inside the C++ object module》深度剖析,较有书生气。
《effective C++》剑走偏锋。
《The C++ Standard Library》也是不可不读。
《C++ Templates The Complete Guide》专谈模板。
《C++ Template Metaprogramming》模板元编程是近年比较热的话题。
学了语言之后,
读一些源码。
比如学c可以读gzip,(顺便学习压缩算法)
学C++可以读wei dai 的 crypto++库等(顺便学习密码学)。
(crypto++库也是学习C++模板编程的好材料)
HP nx 6120,
cpu CM 1.5G,
chip 915GM,
memory 512M,
harddisk 40G 5400rpm。
ubuntu 7.04 feisty,
with beryl, etc.
cpu CM 1.5G,
chip 915GM,
memory 512M,
harddisk 40G 5400rpm。
ubuntu 7.04 feisty,
with beryl, etc.
- yysq009
- 帖子: 2682
- 注册时间: 2007-01-28 23:00
- 来自: @江西|南昌@
- 联系:
-
- 帖子: 2
- 注册时间: 2007-03-30 12:03
-
- 帖子: 12
- 注册时间: 2007-04-03 14:45
也说说我的观点:)
首先,建议弄清楚你需要在C++上深入到什么程度。C++实际上是为编写操作系统而设计的语言,所以Bjarne一伙人就想当然的可以假定:“一个会编写操作系统的人,当然明白数组越界是编程错误,因此我们没有必要对他犯的越界错误负责;他也知道delete应该和new配对使用;他肯定也知道怎么解决源文件之间的依赖关系。在一个不太安全但速度很快的系统上建立一个安全的系统,比在一个很安全但速度很慢的系统上建立一个速度很快的系统要容易得多。”所以说C++会导致一个问题,那就是你本来希望解决问题A,但是最终你却发现,你实际上可能需要解决问题A,B,C,因为A依赖于B而B依赖于C,你为了解决一个问题,往往要付出的智慧和体力比你实际上想要付出的更多。换来的是什么呢?是运行的效率。不过我个人觉得,C++的这种思想,加上为了追求同以前的代码保持兼容的做法,导致C++趋于过时——很多东西就算没有做到完美,也不再修改到完美。对比之下,用用java就会觉得,设计java的这伙人,却打算把事情做到完美:语言一直在改变,新的特性不断的加进来;源文件之间的依赖关系不需要程序员考虑(我要解决我的问题,你们能工作就好了,干嘛一定要考虑你们之间有没有关系);GC的方法显然比Allocator成功得多(除了std::allocator有人会考虑设计其他的吗?);不断更新和扩展的类库紧跟着现实的应用(C++的教科书每一版都可以用好多年。。。不过The C++ Programming Language写得的确很牛X)。但最主要的还是java肯改变,但C++貌似不太肯改变。。。兼容性真的那么重要吗?20年前的代码也要保证可以在最新的编译器里面编译吗?不过另一方面也的确是C++太难了。Bjarne等人被称为“先知”,因为他们所制定的标准,到今天还没有哪一个编译器可以完全实现。比如说VC2005里面C++编译器(当然微软说实话,做编译器不太强,不过使用者却很多)都不敢碰export那个关键字,几个月前我用的g++貌似也没有实现。所以说,你真的需要在C++上完成你大部分工作吗?如果是的话,那么你除了学好它,请也考虑考虑也许某一天,能为它贡献点什么;请你和我一样容忍着爱它。。。如果不是那样的话,也学学它,因为他可以说是现代语言的基础,java和c#都被称做是c++派系的语言;同时你也可以更好的知道程序在操作系统中都作了哪些复杂的工作。
第二,学会C++中大部内容不难,大概1年的时间就可以了。但是不要高兴,template可能要花上你10年的时间。C++里面最有用的东西,并不是你在学校里面教科书上介绍的C++的基本语法、算法、数据结构、类、继承、多态。。。恐怕不是这些。如果你做这方面工作的话,你真希望STL里面的内容再丰富一点,如果能像java一样该多好。不知道别的学校花了多少时间给学生讲STL,我们学校当年没有提一句话。。。STL里面你肯定会遇到template,这个貌似学校也不会教给学生吧。你用过模版类的特化吗?模版类的偏特化呢?你知道VC2005支持模版类的偏特化吗?你知道在g++里面可以编译的代码,在VC2005中可以编译吗?你知道当关键字inline爱上了关键字template的时候,会发生什么事情吗?你知道#pragma once是干嘛的吗?这些学校里面是不可能告诉你的。要把这样的问题一个一个弄清楚,可能要花很多很多很多的时间。难怪很多大的软件公司,招C++程序员的时候,要求有3年5年的开发经验。3年5年,人不都老了么。。。。
第三,学会语言是一方面,会开发程序却是另一方面。完成一次上机实验的几道习题可能很容易,完成ACM竞赛的习题要花一点点脑筋,公司的应试题可以放在网上大家讨论一下。但是没有人能告诉你如何开发一个巨型的程序。你只能孤独的一步一步的探索。你会遇到一些高深莫测的词汇,比如设计模式,什么singleton(这个其实是最简单常用的了),什么Visitor。。。你会觉得这个太妙了,但是当你真正用的时候,你又发现这里不对了,那里不对了,每种模式都有自己的缺点(比如,最简单的singleton,看过最权威的《设计模式——可复用面向对象软件的基础》吗?你确定它的实现没有问题?你不觉得少了点什么?或者new的个数比delete的个数多了一点?当然在这种模式的特殊情况下,这点内存泄漏算不了什么,大概也不会出事:()。你可能也会怀疑自己是不是选错了道路,辛辛苦苦设计的一个类的层次结构,到底可重用的价值有多少?也不要忘记,你还没有接触到多线程呢。那个权威书里面的singleton模式是线程安全的吗?开发越大的程序程序,越会遇到问题。才发现原来自己知道得真的很少。所以说一定要尽可能多写点大的程序,写的时候把The C++ Programming Language放在旁边。
第四,关于Linux。请大家在骂微软的Windows之前,请先默想1分钟。我也不喜欢MS赚的那很多钱。不过MS做的东西真的没有传说中的那么差。我也喜欢Linux的自由和免费:)。不过,Linux真的要从玩具到工具还有很长的路要走。有人说“我们的目标不是所有的人都Linux”。但是我真的不认为,有的人为了要用一下计算器,要学习sudo apt-get install的语法;有的人为了听音乐,就要学习如何从命令行安装声卡驱动,并且冒着操作系统崩溃N次,重装N次的风险。有一个故事是这样说的:一个哲人拿出一个立方体盒子,问,这个盒子有几个面?
数学家说盒子是立方体,所以有6个面。
物理学家说,盒子有内外两层,所以有12个面。
问到程序员,程序员说,依我看,盒子只有2个面:一个外面,一个里面——一个是外部接口,一个是内部实现。
这才是把问题从复杂变到简单的方法。我喜欢java的蕴含的那种思想:解决一个问题的时候,应当尽可能只需考虑与解决这个问题有关的内容。如果不用花很多的时间学习,就知道该如何使用Linux;只要双击鼠标,就把软件安装好了;不用担心系统崩溃,就可以在Linux里面不停的尝试问题,那么Linux的世界该多美好。
愿意和大家多交流:)
首先,建议弄清楚你需要在C++上深入到什么程度。C++实际上是为编写操作系统而设计的语言,所以Bjarne一伙人就想当然的可以假定:“一个会编写操作系统的人,当然明白数组越界是编程错误,因此我们没有必要对他犯的越界错误负责;他也知道delete应该和new配对使用;他肯定也知道怎么解决源文件之间的依赖关系。在一个不太安全但速度很快的系统上建立一个安全的系统,比在一个很安全但速度很慢的系统上建立一个速度很快的系统要容易得多。”所以说C++会导致一个问题,那就是你本来希望解决问题A,但是最终你却发现,你实际上可能需要解决问题A,B,C,因为A依赖于B而B依赖于C,你为了解决一个问题,往往要付出的智慧和体力比你实际上想要付出的更多。换来的是什么呢?是运行的效率。不过我个人觉得,C++的这种思想,加上为了追求同以前的代码保持兼容的做法,导致C++趋于过时——很多东西就算没有做到完美,也不再修改到完美。对比之下,用用java就会觉得,设计java的这伙人,却打算把事情做到完美:语言一直在改变,新的特性不断的加进来;源文件之间的依赖关系不需要程序员考虑(我要解决我的问题,你们能工作就好了,干嘛一定要考虑你们之间有没有关系);GC的方法显然比Allocator成功得多(除了std::allocator有人会考虑设计其他的吗?);不断更新和扩展的类库紧跟着现实的应用(C++的教科书每一版都可以用好多年。。。不过The C++ Programming Language写得的确很牛X)。但最主要的还是java肯改变,但C++貌似不太肯改变。。。兼容性真的那么重要吗?20年前的代码也要保证可以在最新的编译器里面编译吗?不过另一方面也的确是C++太难了。Bjarne等人被称为“先知”,因为他们所制定的标准,到今天还没有哪一个编译器可以完全实现。比如说VC2005里面C++编译器(当然微软说实话,做编译器不太强,不过使用者却很多)都不敢碰export那个关键字,几个月前我用的g++貌似也没有实现。所以说,你真的需要在C++上完成你大部分工作吗?如果是的话,那么你除了学好它,请也考虑考虑也许某一天,能为它贡献点什么;请你和我一样容忍着爱它。。。如果不是那样的话,也学学它,因为他可以说是现代语言的基础,java和c#都被称做是c++派系的语言;同时你也可以更好的知道程序在操作系统中都作了哪些复杂的工作。
第二,学会C++中大部内容不难,大概1年的时间就可以了。但是不要高兴,template可能要花上你10年的时间。C++里面最有用的东西,并不是你在学校里面教科书上介绍的C++的基本语法、算法、数据结构、类、继承、多态。。。恐怕不是这些。如果你做这方面工作的话,你真希望STL里面的内容再丰富一点,如果能像java一样该多好。不知道别的学校花了多少时间给学生讲STL,我们学校当年没有提一句话。。。STL里面你肯定会遇到template,这个貌似学校也不会教给学生吧。你用过模版类的特化吗?模版类的偏特化呢?你知道VC2005支持模版类的偏特化吗?你知道在g++里面可以编译的代码,在VC2005中可以编译吗?你知道当关键字inline爱上了关键字template的时候,会发生什么事情吗?你知道#pragma once是干嘛的吗?这些学校里面是不可能告诉你的。要把这样的问题一个一个弄清楚,可能要花很多很多很多的时间。难怪很多大的软件公司,招C++程序员的时候,要求有3年5年的开发经验。3年5年,人不都老了么。。。。
第三,学会语言是一方面,会开发程序却是另一方面。完成一次上机实验的几道习题可能很容易,完成ACM竞赛的习题要花一点点脑筋,公司的应试题可以放在网上大家讨论一下。但是没有人能告诉你如何开发一个巨型的程序。你只能孤独的一步一步的探索。你会遇到一些高深莫测的词汇,比如设计模式,什么singleton(这个其实是最简单常用的了),什么Visitor。。。你会觉得这个太妙了,但是当你真正用的时候,你又发现这里不对了,那里不对了,每种模式都有自己的缺点(比如,最简单的singleton,看过最权威的《设计模式——可复用面向对象软件的基础》吗?你确定它的实现没有问题?你不觉得少了点什么?或者new的个数比delete的个数多了一点?当然在这种模式的特殊情况下,这点内存泄漏算不了什么,大概也不会出事:()。你可能也会怀疑自己是不是选错了道路,辛辛苦苦设计的一个类的层次结构,到底可重用的价值有多少?也不要忘记,你还没有接触到多线程呢。那个权威书里面的singleton模式是线程安全的吗?开发越大的程序程序,越会遇到问题。才发现原来自己知道得真的很少。所以说一定要尽可能多写点大的程序,写的时候把The C++ Programming Language放在旁边。
第四,关于Linux。请大家在骂微软的Windows之前,请先默想1分钟。我也不喜欢MS赚的那很多钱。不过MS做的东西真的没有传说中的那么差。我也喜欢Linux的自由和免费:)。不过,Linux真的要从玩具到工具还有很长的路要走。有人说“我们的目标不是所有的人都Linux”。但是我真的不认为,有的人为了要用一下计算器,要学习sudo apt-get install的语法;有的人为了听音乐,就要学习如何从命令行安装声卡驱动,并且冒着操作系统崩溃N次,重装N次的风险。有一个故事是这样说的:一个哲人拿出一个立方体盒子,问,这个盒子有几个面?
数学家说盒子是立方体,所以有6个面。
物理学家说,盒子有内外两层,所以有12个面。
问到程序员,程序员说,依我看,盒子只有2个面:一个外面,一个里面——一个是外部接口,一个是内部实现。
这才是把问题从复杂变到简单的方法。我喜欢java的蕴含的那种思想:解决一个问题的时候,应当尽可能只需考虑与解决这个问题有关的内容。如果不用花很多的时间学习,就知道该如何使用Linux;只要双击鼠标,就把软件安装好了;不用担心系统崩溃,就可以在Linux里面不停的尝试问题,那么Linux的世界该多美好。
愿意和大家多交流:)
- adqin
- 帖子: 1417
- 注册时间: 2007-01-24 22:07
- 来自: http://adqin.cn
- 联系:
-
- 帖子: 31
- 注册时间: 2005-10-26 22:18
写的不错,值得收藏。
abel 写了:也说说我的观点:)
首先,建议弄清楚你需要在C++上深入到什么程度。C++实际上是为编写操作系统而设计的语言,所以Bjarne一伙人就想当然的可以假定:“一个会编写操作系统的人,当然明白数组越界是编程错误,因此我们没有必要对他犯的越界错误负责;他也知道delete应该和new配对使用;他肯定也知道怎么解决源文件之间的依赖关系。在一个不太安全但速度很快的系统上建立一个安全的系统,比在一个很安全但速度很慢的系统上建立一个速度很快的系统要容易得多。”所以说C++会导致一个问题,那就是你本来希望解决问题A,但是最终你却发现,你实际上可能需要解决问题A,B,C,因为A依赖于B而B依赖于C,你为了解决一个问题,往往要付出的智慧和体力比你实际上想要付出的更多。换来的是什么呢?是运行的效率。不过我个人觉得,C++的这种思想,加上为了追求同以前的代码保持兼容的做法,导致C++趋于过时——很多东西就算没有做到完美,也不再修改到完美。对比之下,用用java就会觉得,设计java的这伙人,却打算把事情做到完美:语言一直在改变,新的特性不断的加进来;源文件之间的依赖关系不需要程序员考虑(我要解决我的问题,你们能工作就好了,干嘛一定要考虑你们之间有没有关系);GC的方法显然比Allocator成功得多(除了std::allocator有人会考虑设计其他的吗?);不断更新和扩展的类库紧跟着现实的应用(C++的教科书每一版都可以用好多年。。。不过The C++ Programming Language写得的确很牛X)。但最主要的还是java肯改变,但C++貌似不太肯改变。。。兼容性真的那么重要吗?20年前的代码也要保证可以在最新的编译器里面编译吗?不过另一方面也的确是C++太难了。Bjarne等人被称为“先知”,因为他们所制定的标准,到今天还没有哪一个编译器可以完全实现。比如说VC2005里面C++编译器(当然微软说实话,做编译器不太强,不过使用者却很多)都不敢碰export那个关键字,几个月前我用的g++貌似也没有实现。所以说,你真的需要在C++上完成你大部分工作吗?如果是的话,那么你除了学好它,请也考虑考虑也许某一天,能为它贡献点什么;请你和我一样容忍着爱它。。。如果不是那样的话,也学学它,因为他可以说是现代语言的基础,java和c#都被称做是c++派系的语言;同时你也可以更好的知道程序在操作系统中都作了哪些复杂的工作。
第二,学会C++中大部内容不难,大概1年的时间就可以了。但是不要高兴,template可能要花上你10年的时间。C++里面最有用的东西,并不是你在学校里面教科书上介绍的C++的基本语法、算法、数据结构、类、继承、多态。。。恐怕不是这些。如果你做这方面工作的话,你真希望STL里面的内容再丰富一点,如果能像java一样该多好。不知道别的学校花了多少时间给学生讲STL,我们学校当年没有提一句话。。。STL里面你肯定会遇到template,这个貌似学校也不会教给学生吧。你用过模版类的特化吗?模版类的偏特化呢?你知道VC2005支持模版类的偏特化吗?你知道在g++里面可以编译的代码,在VC2005中可以编译吗?你知道当关键字inline爱上了关键字template的时候,会发生什么事情吗?你知道#pragma once是干嘛的吗?这些学校里面是不可能告诉你的。要把这样的问题一个一个弄清楚,可能要花很多很多很多的时间。难怪很多大的软件公司,招C++程序员的时候,要求有3年5年的开发经验。3年5年,人不都老了么。。。。
第三,学会语言是一方面,会开发程序却是另一方面。完成一次上机实验的几道习题可能很容易,完成ACM竞赛的习题要花一点点脑筋,公司的应试题可以放在网上大家讨论一下。但是没有人能告诉你如何开发一个巨型的程序。你只能孤独的一步一步的探索。你会遇到一些高深莫测的词汇,比如设计模式,什么singleton(这个其实是最简单常用的了),什么Visitor。。。你会觉得这个太妙了,但是当你真正用的时候,你又发现这里不对了,那里不对了,每种模式都有自己的缺点(比如,最简单的singleton,看过最权威的《设计模式——可复用面向对象软件的基础》吗?你确定它的实现没有问题?你不觉得少了点什么?或者new的个数比delete的个数多了一点?当然在这种模式的特殊情况下,这点内存泄漏算不了什么,大概也不会出事:()。你可能也会怀疑自己是不是选错了道路,辛辛苦苦设计的一个类的层次结构,到底可重用的价值有多少?也不要忘记,你还没有接触到多线程呢。那个权威书里面的singleton模式是线程安全的吗?开发越大的程序程序,越会遇到问题。才发现原来自己知道得真的很少。所以说一定要尽可能多写点大的程序,写的时候把The C++ Programming Language放在旁边。
第四,关于Linux。请大家在骂微软的Windows之前,请先默想1分钟。我也不喜欢MS赚的那很多钱。不过MS做的东西真的没有传说中的那么差。我也喜欢Linux的自由和免费:)。不过,Linux真的要从玩具到工具还有很长的路要走。有人说“我们的目标不是所有的人都Linux”。但是我真的不认为,有的人为了要用一下计算器,要学习sudo apt-get install的语法;有的人为了听音乐,就要学习如何从命令行安装声卡驱动,并且冒着操作系统崩溃N次,重装N次的风险。有一个故事是这样说的:一个哲人拿出一个立方体盒子,问,这个盒子有几个面?
数学家说盒子是立方体,所以有6个面。
物理学家说,盒子有内外两层,所以有12个面。
问到程序员,程序员说,依我看,盒子只有2个面:一个外面,一个里面——一个是外部接口,一个是内部实现。
这才是把问题从复杂变到简单的方法。我喜欢java的蕴含的那种思想:解决一个问题的时候,应当尽可能只需考虑与解决这个问题有关的内容。如果不用花很多的时间学习,就知道该如何使用Linux;只要双击鼠标,就把软件安装好了;不用担心系统崩溃,就可以在Linux里面不停的尝试问题,那么Linux的世界该多美好。
愿意和大家多交流:)
HP nx 6120,
cpu CM 1.5G,
chip 915GM,
memory 512M,
harddisk 40G 5400rpm。
ubuntu 7.04 feisty,
with beryl, etc.
cpu CM 1.5G,
chip 915GM,
memory 512M,
harddisk 40G 5400rpm。
ubuntu 7.04 feisty,
with beryl, etc.
- cnshzj007
- 帖子: 685
- 注册时间: 2006-05-24 21:38
- 来自: 上海
- 联系:
不顶,不行。说得对。abel 写了:也说说我的观点:)
首先,建议弄清楚你需要在C++上深入到什么程度。C++实际上是为编写操作系统而设计的语言,所以Bjarne一伙人就想当然的可以假定:“一个会编写操作系统的人,当然明白数组越界是编程错误,因此我们没有必要对他犯的越界错误负责;他也知道delete应该和new配对使用;他肯定也知道怎么解决源文件之间的依赖关系。在一个不太安全但速度很快的系统上建立一个安全的系统,比在一个很安全但速度很慢的系统上建立一个速度很快的系统要容易得多。”所以说C++会导致一个问题,那就是你本来希望解决问题A,但是最终你却发现,你实际上可能需要解决问题A,B,C,因为A依赖于B而B依赖于C,你为了解决一个问题,往往要付出的智慧和体力比你实际上想要付出的更多。换来的是什么呢?是运行的效率。不过我个人觉得,C++的这种思想,加上为了追求同以前的代码保持兼容的做法,导致C++趋于过时——很多东西就算没有做到完美,也不再修改到完美。对比之下,用用java就会觉得,设计java的这伙人,却打算把事情做到完美:语言一直在改变,新的特性不断的加进来;源文件之间的依赖关系不需要程序员考虑(我要解决我的问题,你们能工作就好了,干嘛一定要考虑你们之间有没有关系);GC的方法显然比Allocator成功得多(除了std::allocator有人会考虑设计其他的吗?);不断更新和扩展的类库紧跟着现实的应用(C++的教科书每一版都可以用好多年。。。不过The C++ Programming Language写得的确很牛X)。但最主要的还是java肯改变,但C++貌似不太肯改变。。。兼容性真的那么重要吗?20年前的代码也要保证可以在最新的编译器里面编译吗?不过另一方面也的确是C++太难了。Bjarne等人被称为“先知”,因为他们所制定的标准,到今天还没有哪一个编译器可以完全实现。比如说VC2005里面C++编译器(当然微软说实话,做编译器不太强,不过使用者却很多)都不敢碰export那个关键字,几个月前我用的g++貌似也没有实现。所以说,你真的需要在C++上完成你大部分工作吗?如果是的话,那么你除了学好它,请也考虑考虑也许某一天,能为它贡献点什么;请你和我一样容忍着爱它。。。如果不是那样的话,也学学它,因为他可以说是现代语言的基础,java和c#都被称做是c++派系的语言;同时你也可以更好的知道程序在操作系统中都作了哪些复杂的工作。
第二,学会C++中大部内容不难,大概1年的时间就可以了。但是不要高兴,template可能要花上你10年的时间。C++里面最有用的东西,并不是你在学校里面教科书上介绍的C++的基本语法、算法、数据结构、类、继承、多态。。。恐怕不是这些。如果你做这方面工作的话,你真希望STL里面的内容再丰富一点,如果能像java一样该多好。不知道别的学校花了多少时间给学生讲STL,我们学校当年没有提一句话。。。STL里面你肯定会遇到template,这个貌似学校也不会教给学生吧。你用过模版类的特化吗?模版类的偏特化呢?你知道VC2005支持模版类的偏特化吗?你知道在g++里面可以编译的代码,在VC2005中可以编译吗?你知道当关键字inline爱上了关键字template的时候,会发生什么事情吗?你知道#pragma once是干嘛的吗?这些学校里面是不可能告诉你的。要把这样的问题一个一个弄清楚,可能要花很多很多很多的时间。难怪很多大的软件公司,招C++程序员的时候,要求有3年5年的开发经验。3年5年,人不都老了么。。。。
第三,学会语言是一方面,会开发程序却是另一方面。完成一次上机实验的几道习题可能很容易,完成ACM竞赛的习题要花一点点脑筋,公司的应试题可以放在网上大家讨论一下。但是没有人能告诉你如何开发一个巨型的程序。你只能孤独的一步一步的探索。你会遇到一些高深莫测的词汇,比如设计模式,什么singleton(这个其实是最简单常用的了),什么Visitor。。。你会觉得这个太妙了,但是当你真正用的时候,你又发现这里不对了,那里不对了,每种模式都有自己的缺点(比如,最简单的singleton,看过最权威的《设计模式——可复用面向对象软件的基础》吗?你确定它的实现没有问题?你不觉得少了点什么?或者new的个数比delete的个数多了一点?当然在这种模式的特殊情况下,这点内存泄漏算不了什么,大概也不会出事:()。你可能也会怀疑自己是不是选错了道路,辛辛苦苦设计的一个类的层次结构,到底可重用的价值有多少?也不要忘记,你还没有接触到多线程呢。那个权威书里面的singleton模式是线程安全的吗?开发越大的程序程序,越会遇到问题。才发现原来自己知道得真的很少。所以说一定要尽可能多写点大的程序,写的时候把The C++ Programming Language放在旁边。
第四,关于Linux。请大家在骂微软的Windows之前,请先默想1分钟。我也不喜欢MS赚的那很多钱。不过MS做的东西真的没有传说中的那么差。我也喜欢Linux的自由和免费:)。不过,Linux真的要从玩具到工具还有很长的路要走。有人说“我们的目标不是所有的人都Linux”。但是我真的不认为,有的人为了要用一下计算器,要学习sudo apt-get install的语法;有的人为了听音乐,就要学习如何从命令行安装声卡驱动,并且冒着操作系统崩溃N次,重装N次的风险。有一个故事是这样说的:一个哲人拿出一个立方体盒子,问,这个盒子有几个面?
数学家说盒子是立方体,所以有6个面。
物理学家说,盒子有内外两层,所以有12个面。
问到程序员,程序员说,依我看,盒子只有2个面:一个外面,一个里面——一个是外部接口,一个是内部实现。
这才是把问题从复杂变到简单的方法。我喜欢java的蕴含的那种思想:解决一个问题的时候,应当尽可能只需考虑与解决这个问题有关的内容。如果不用花很多的时间学习,就知道该如何使用Linux;只要双击鼠标,就把软件安装好了;不用担心系统崩溃,就可以在Linux里面不停的尝试问题,那么Linux的世界该多美好。
愿意和大家多交流:)
集中人的精力解决我自己工作上遇到的问题。
我只是一个ARCH的FANS,来自RH和UBUNTU的滋润!