如何正确的学习态度通过 C++ Primer 学习 C++

C++Primer Plus学习笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C++Primer Plus学习笔记
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢个人经验,C++ primer 第一次可以跳着看。关键是要尽快用起来,在使用中熟练,而不是在细节中迷失。&br&以C++ Primer第五版为例,第一遍读的时候:&br&Part1也就是前七章,除了6.6,6.7节,都要通读。尤其是第三章初步介绍了vector和string,简直就是新手福音,搞定这两个容器就能写一些简单的程序。&br&Part2基本就是数据结构和算法,如果有基础读起来很轻松。&br&9,11两章介绍的容器,以及12.1节的智能指针要通读。多用智能指针和容器,远离segment fault. 第10章里的泛型算法可以慢慢读,读完以后可以写出高逼格的函数式风格C++。12.2节讲了怎么用new和delete分配空间,题主作为新手,知道这种写法就行,写程序时尽量用容器代替原始数组,尤其是代码里最好不要有delete。&br&Part3是块硬骨头,标题就是Tools for Class Authors. 作为一个&class user&,有些部分第一次是可以略过的。&br&13章很重要,要细读。初始化,复制,赋值,右值引用是C++里很微妙很重要的部分,别的语言对于这些概念很少有区分得这么细的。这一章不但要精读,还要完全掌握。&br&14章的操作符重载第一次可以观其大略;14.9节第一次可以跳过。&br&15章讲OOP,重要性不言而喻。如果之前一点概念都没有,学起来会觉得比较抽象。网上关于OOP有很多通俗有趣的文章,可以一起看看。&br&16章讲泛型编程,第一次读16.1节,掌握最基本的函数模板和类模板就行了。&br&Part4就更高档了,很多内容第一次就算啃下来,长久不用又忘了。第一次读推荐把18.2节读懂,命名空间简单易用效果好。别的内容可以观其大略,用时再看。17.1节的tuple是个有趣的东东,可以读一读。17.3节的正则表达式和17.4节的随机数也许有用,也可以读一读。如果需要读写文件,要读一下17.5.2节的raw I/O和17.5.3节的random I/O。&br&&br&最后给题主的建议是,写C++,要尽量避免C的写法。用static_cast而不是括号转换符;用vector而不是C里面的数组;用string而不是char *;用智能指针而不是原始指针。当然I/O是个例外,printf()还是比cout好用的;转换数字和字符串时sprintf()也比stringstream快
个人经验,C++ primer 第一次可以跳着看。关键是要尽快用起来,在使用中熟练,而不是在细节中迷失。 以C++ Primer第五版为例,第一遍读的时候: Part1也就是前七章,除了6.6,6.7节,都要通读。尤其是第三章初步介绍了vector和string,简直就是新手福音,搞…
&blockquote&学习完c++ primer&br&&/blockquote&请问&b&学习完&/b&是什么状态,而 C++ Primer 是&b&哪一版&/b&?&b&课后习题&/b&全都自己做过了?&br&&br&如果你&b&学习完&/b&,指的是把书看完了一遍,那容易忘是必然的,又不是读唐诗宋词,谁能不忘?再说,把自己当活字典有何用?&br&&br&如果是第四版,我建议你再去看&b&第五版&/b&,了解 C++ 11 的语法,基于 C++ 11 标准进行练手,在当前环境下,意义要更大一些。&br&&br&&b&课后习题&/b&实际隐藏着很多&b&小项目&/b&。譬如:&br&&br&&ul&&li&第七章引入了两个类:Screen 和 Window_mgr,这实际是一个&b&写字板程序&/b&的雏形,有没有想过继续完善下?结合 GUI 框架做出一个小玩意来?&/li&&li&从第十二章到第十三章,逐步引入以下类:StrBlob -& StrVec -& String,这实际是在指导你,从底层&b&实现 STL 基础模板&/b&?有没有想过将 String 类完善一下?譬如如何实现 c_str() 的功能?你的 String 效率与 STL 有何区别?能否超越?vector 呢?(这个很难超越)set 呢?(这个有可能)&/li&&li&当然还有诸如 Folder 和 Message 类,实际是一个邮件管理系统的雏形,这样的例子不胜枚举。&/li&&/ul&所以,如果你真的认真做了习题,或是深入思考过这些题目,我觉得应该是&b&不愁练手&/b&的。&br&&br& 而你表现的如此急切,倒是有点&b&缘木求鱼&/b&的感觉。&br&&br&==============干货分割线==================&br&&br&&b&好的C++开源项目&/b&不胜枚举,如:&br&&ul&&li&&a href=&///?target=https%3A///facebook/folly& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&facebook/folly · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///TTimo/doom3.gpl& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TTimo/doom3.gpl · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///EpicGames/UnrealEngine& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/EpicGames/Un&/span&&span class=&invisible&&realEngine&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///v8/v8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&v8/v8 · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///qtproject/qtbase& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&qtproject/qtbase · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///ideawu/ssdb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ideawu/ssdb · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///zeromq/libzmq& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zeromq/libzmq · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&///?target=https%3A///miloyip/rapidjson& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&miloyip/rapidjson · GitHub&i class=&icon-external&&&/i&&/a&&br&&/li&&/ul&都很值得去研究学习,但你是否能够一口去吃这些胖子,深表怀疑。大多数人,应该是头晕眼花,不明所以的。&br&&br&自己想&b&做点小项目练手&/b&,我也可以提供一些思路:&br&&ul&&li&高精度&b&计时器&/b&:参考 &a href=&///?target=https%3A///en-us/library/windows/desktop/ms8v%3Dvs.85%2529.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&QueryPerformanceCounter function (Windows)&i class=&icon-external&&&/i&&/a&&/li&&li&STL &b&容器&/b&类:上面提到了。&/li&&li&自己实现&b&智能指针&/b&:其实还是习题的范围。&/li&&li&实现类似 Qt 底层的&b&信号槽&/b&&/li&&li&实现一个
mini&b& GUI&/b& 库&/li&&li&实现一个类似 &a href=&///?target=http%3A//alleg.sourceforge.net/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&alleg.sourceforge.net/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& 或 SDL 这样的游戏&b&引擎&/b&,并做一个小游戏。&/li&&li&实现一个简易的&b&序列化&/b&框架,想想如何将对象存取于磁盘上。&/li&&li&有人抱怨 &a href=&/question/& class=&internal&&c/c++有什么非常好用的字符处理库吗? &/a&,你来实现一个 std::string 的&b&工具库&/b&?&/li&&li&将上面这些东西,都封装成 dll/so/lib 的形式,供自己或更多人日后使用。&/li&&/ul&&br&经历以上过程的洗礼,C++ 能忘就忘了吧,没关系~
学习完c++ primer 请问学习完是什么状态,而 C++ Primer 是哪一版?课后习题全都自己做过了? 如果你学习完,指的是把书看完了一遍,那容易忘是必然的,又不是读唐诗宋词,谁能不忘?再说,把自己当活字典有何用? 如果是第四版,我建议你再去看第五版,了…
现在没有哪个大学一上来就教C艹的吧。&br&(很多同学表示自己学校一上来就是教C++的。难道你们不是从C语言开始的吗?震惊脸)&br&&br&&br&那篇文章里面说的问题是真实存在的。但是把《C++ Primer》挑出来说不合适吧。&br&其实这个问题在于,你们太过于高估大学新生的水平。&br&忽略了他们起步阶段面临的那些老鸟看来根本不是问题的问题。&br&&br&---------------------&br&讲真,你们以为进大学学计算机的就算没写过正经代码,也是拿按键精灵跑过脚本的脚本小子么?&br&我明白的说,很多大学生进大学之前,除了会打个游戏,挂个qq,在贴吧上灌水之外,&b&根本就不知道咋用计算机&/b&。&b&甚至有人上大学之前就没怎么接触过计算机。&/b&&br&&br&&br&所谓不合国情,指的就是这个国情。&br&&br&当年我们老师在课堂上专门讲了C语言该如何编译,如何链接。&br&然而并没有人教你在windows上如何安装C语言的编译器。&br&哪怕你找到了mingw并安装成功,&br&呵呵,并没有人告诉你如何打开那个黑框……傻逼了吧……&br&还好后来我们老师演示了一次如何安装和配置java,我终于知道了那个玩意叫命令提示符。&br&&br&你说为啥不用linux?&br&开玩笑,我装linux直接把机器装到还原好几次好不好。在若干次装linux,还原,装linux,还原的循环之后,我终于放弃了。&br&好在现在virtual box也进步了,想我读书那会,这个玩意安装起来也不省心。&br&特别是弄完以后你想上网还得好一阵折腾,不能上网的ubuntu,和咸鱼有啥区别?&br&&br&那就上宇宙无敌ide好了,一键搞定开发环境&br&想太多,你装vs不顺便装个sqlsever么,然后你知道sqlsever和vs安装有先后顺序么?&br&安错了你还不知道咋卸载,然后就是一波重装系统……&br&弄完你想跑个本地网站试试,然后安上了iis,又是一波重装系统……&br&&br&你觉得很多东西你们高中不应该就学了吗?&br&学个屁,&br&我从小学开始学如何使用office,到高中还学这个。&br&每年都学一样的。&br&到了大学帮其他系同学做个excel实验,一看手册,全是不认识的工具。&br&其实9年几乎屁都没学一点,老师打酱油学生看热闹。&br&&br&当然,这些都是小事,&br&你去谷歌甚至百度上搜索一下,带上:site stackoverflow,可能半个小时不要就解决了。&br&但是新生们不知道。&br&最重要的是,&b&从来没有人去教学生如何自己寻找解决方案&/b&&br&&b&互联网可以说是程序员成长中最重要的工具,然而我们却从来没有把它当回事。&/b&&br&&b&有些老师甚至为了防止学生抄作业,故意散播上网找解决方案不好的观念。&/b&&br&&br&简直就像是为了授人以鱼,告诉你用网子的人都是心术不正……&br&所以你捡了几条破鱼,却错过了整个大海。&br&&br&要我说,&b&大学就该开门课(或者讲座),叫如何使用互联网,专门讲大学生如何通过互联网来自主获取知识。&/b&一边照本宣科朗读ppt,一边怪现在的学生自学能力差真是最容易了,我上我也行,没见有几个人思考过为啥学生自学能力差,怎么去改善。&br&&br&反正我在前东家的时候,实习生后辈来的第一天我就给她讲,技术上有问题尽量用搜索引擎,不要找我,bing上用英文搜,不行就带:site stackoverflow。一般你能遇到的问题,都已经有很多人遇到过了。&br&再不行,你来找我,我帮你搜。&br&&br&反正你问我我也不会。(逃
现在没有哪个大学一上来就教C艹的吧。 (很多同学表示自己学校一上来就是教C++的。难道你们不是从C语言开始的吗?震惊脸) 那篇文章里面说的问题是真实存在的。但是把《C++ Primer》挑出来说不合适吧。 其实这个问题在于,你们太过于高估大学新生的水平。 …
&ol&&li&&i&“想要考好就得用我的教材” &/i&我觉得是有可能的,毕竟出题的人跟编书的人是同一个。&/li&&li&《C++Primer》适合比较聪明的人,或者&b&学过其他编程语言的人&/b&学习,这当然不是适合所有大一学生的。&/li&&li&只要你能看懂的话,那当然还是《C++Primer》。但是你要保证你学的足够快,以致于到时候考试了,该懂的东西都懂。&/li&&/ol&&br&这些当然都是可以做到的。当时我在华南皇家理工大学的时候,隔壁计算机学院的C++教材不知道编得有多烂(听说现在更烂了)。但是自从初三看过VC++5.0的MSDN里面的语法手册之后就几乎没摸过C++了,于是再把那本书拿起来看,练习了一年,拿了99分。我还专门跑去问老师我这1分是扣在哪,他说他从来不给100分,不想让学生骄傲自满(逃,暑假前还弄出来了一个属于自己的脚本语言,模板的支持方法跟Java一摸一样,然后用他写了几个小游戏。
“想要考好就得用我的教材” 我觉得是有可能的,毕竟出题的人跟编书的人是同一个。《C++Primer》适合比较聪明的人,或者学过其他编程语言的人学习,这当然不是适合所有大一学生的。只要你能看懂的话,那当然还是《C++Primer》。但是你要保证你学的足够快,…
&ul&&li&这本书是&b&好书&/b&,而且&b&适合作为第一本入门书籍&/b&。&/li&&/ul&请见 &a href=&///?target=http%3A///questions/388242/the-definitive-c-book-guide-and-list& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&c++ faq - The Definitive C++ Book Guide and List&i class=&icon-external&&&/i&&/a& 这个经典的书单上面的第一本。我一直不明白人家外国人可以把这个作为第一本书入门,为什么中国人就不建议初学者把它作为第一本书看呢,英文不好?有&a href=&///?target=http%3A///C-Primer-%25E6%2596%25AF%25E5%259D%25A6%25E5%%25C2%25B7%25E6%259D%258E%25E6%2599%25AE%25E6%259B%25BC/dp/B00ESUIL0O& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文版&i class=&icon-external&&&/i&&/a&啊。觉得翻译的不好?天天在知乎上受
&a data-hash=&1e2cccc3ce33& href=&///people/1e2cccc3ce33& class=&member_mention& data-editable=&true& data-title=&@Milo Yip& data-tip=&p$b$1e2cccc3ce33& data-hovercard=&p$b$1e2cccc3ce33&&@Milo Yip&/a&、&a data-hash=&ecc0ec035f& href=&///people/ecc0ec035f& class=&member_mention& data-editable=&true& data-title=&@vczh& data-tip=&p$b$ecc0ec035f& data-hovercard=&p$b$ecc0ec035f&&@vczh&/a& 等大神的熏陶,而这本书就是他们审校的啊。为啥不先去看看呢。&br&另外,据我所知, &a data-hash=&ed9cd1e21dc483d630df3d& href=&///people/ed9cd1e21dc483d630df3d& class=&member_mention& data-editable=&true& data-title=&@script Newil& data-tip=&p$b$ed9cd1e21dc483d630df3d& data-hovercard=&p$b$ed9cd1e21dc483d630df3d&&@script Newil&/a& 提到的那个repo的作者也是通过此书入门的(严格意义上讲,我也是)。为啥总有人非要挑三拣四的呢。非常好奇。&br&&ul&&li&怎么用好这本书&/li&&/ul&我没啥资格说怎么用好,但有些教训倒是可以分享下:&br&&ol&&li&你买的&b&英文版&/b&,挺好。我以前总是通过各种中文版的书学C++,很多名词之间的区别都是含含糊糊的,譬如&b&变量&/b&和&b&对象&/b&,管某对象也叫变量行不行呢?管匿名对象也叫匿名变量行不行呢?从中文的角度来看好像也无可厚非,反正意思差不多嘛。这种例子很多,但其实很妨碍你在Stackoverflow上问问题,名不正则言不顺,试试提问说个anonymous variable?保管一大堆老外给你挑刺。而更关键的是,你会&b&很容易放弃深入思考这些名词之间的差别&/b&。一上来就从英文版学起,就天然避免这些问题。有种根正苗红的感觉。(上述内容在2.2. Variables就有说明)&/li&&li&&b&别当成案头书&/b&,花功夫&b&完整的看完一遍&/b&。我以前就把各种大砖头作为案头书,用到的时候在看呗,一直这么想。结果呢?就是解决问题总是要比别人花更多的时间。究其原因,是我总需要去一遍又一遍的复习基础知识,总想着多看几遍就记住了。结果呢,还是反复在看。&b&要知道,学编程语言不是背语法,记住语法有用吗?c++11又多了好多语法,c++14也出来了,又去记?真的是一辈子“学C++”吗&/b&?这种办法学编程,换种语言就嗝屁。完整的看一遍书的意义在于理解这个&b&语言的思路&/b&,为什么要有这种语法,为什么c++11要引入新的语法机制?为什么引入类,为什么引入模板,范型?看完书,就能够理清楚这个思路,把握一个脉络。遇到问题,就能够迅速抓到关键,不去纠结那些语法细节。&/li&&li&&b&做习题&/b&,别以为看懂了就万事大吉了。我以前从来不看习题,或者就是扫一眼,觉得应该会,就放过去。其实这是大忌,&b&习题是检验你是否掌握核心知识最好的工具&/b&。看完一小节,把书扔一边,认真写出每一道题的答案,你就会发现你到底是不是真的掌握。别笑,我经常看到某些概念分辨题,不知所措,觉得很显然,但就是说不清。&b&这就是没掌握&/b&。习题的另一个功效就是,可以帮助你摆脱牛角尖。我曾经看书看的过细,好像一本书就能把整个C++的诸般神技都能讲到似的,这样的后果就是:停滞不前,看不下去。典型的:“&b&想的太多,看的太少&/b&”,其实很多面对初学者的疑问,看到后面就引刃而解了(如&a href=&/question/& class=&internal&&新手如何阅读《C++ Primer》?&/a&里面,这哥们读了几页就开始纠结this指针了)。如何让自己别想太多呢?习题。只要习题没涉及的知识点,完全可以跳过去。&/li&&li&善于利用&b&stackoverflow&/b&,请看&a href=&///?target=http%3A///review/6500246/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&习题答案 及 StackOverflow上的讨论 &i class=&icon-external&&&/i&&/a&,这个技巧被很多人忽视(包括我)。首先你能提出问题,而在SO上不被vote down,表示你深入思考了;其次SO上的各位大牛,面对基础题,几乎都是抢答,你只需狂按F5,然后慢慢消化他们的评论及答案就好了,他们的只言片语,能够让你学到本书以外的很多东西,如编码习惯,一些术语(jargon)等等。而且讨论本身就会很自然的让你记忆的更加深刻,实在是有诸多好处。&/li&&/ol&我说的啰嗦,但都是我的血泪史,人蠢真是没办法。。。你尽量少走些弯路吧。&br&&br&最后说可能有的疑问:&br&&ol&&li&&b&看不下去?&/b&你也看到了,最上面那个书单里,这本书是第一本,如果都看不下去,请直接放弃C++。&/li&&li&&b&看完我会很牛逼吗?&/b&请见这个答案:&a href=&/question/& class=&internal&&认真学完 C++ Primer 后,C++ 语言到了什么水平?&/a&恭喜你,已经入门了,但仅仅是入门而已。&/li&&/ol&======&br&更新:&br&&ol&&li&评论里有人不知道中文版的审校都有谁,封面右下方就有嘛。其实还有一位非常有名但不怎么上知乎的: &a data-hash=&8b8f80bcafc684ae1bca1ab85e89a8c3& href=&///people/8b8f80bcafc684ae1bca1ab85e89a8c3& class=&member_mention& data-hovercard=&p$b$8b8f80bcafc684ae1bca1ab85e89a8c3&&@刘未鹏&/a&&/li&&li&有人提到第四版,第四版和第五版区别还是蛮大的,连章节都有点对应不上了。第五版着重介绍 C++11 的理念,长远来看,这些很值得了解的。从我个人来讲,四、五版都有,曾看完第四版,但再看第五版的时候,还是感觉在看一本新书。如何选择,自己权衡,反正开卷有益。&/li&&/ol&
这本书是好书,而且适合作为第一本入门书籍。请见
这个经典的书单上面的第一本。我一直不明白人家外国人可以把这个作为第一本书入门,为什么中国人就不建议初学者把它作为第一本书看呢,英文不好?有…
试一试怎么了,死的是程序,又不会是系统、电脑、或开发者。以后路还长着,连这个最简单最基本的都不敢试的话,以后会遇到更多麻烦。&br&&br&另一方面,你不能通过一次试的结果得出结论。因为那只能说明在特定编译器、特定crt下的结果。原理上你得知道delete是不改变指针值的。所以第二次delete的时候,行为未定义,什么事情都可能发生。好习惯永远是delete之后立刻赋nullptr。这样即便意外第二次delete了,也没关系,因为delete nullptr是有良好定义的。
试一试怎么了,死的是程序,又不会是系统、电脑、或开发者。以后路还长着,连这个最简单最基本的都不敢试的话,以后会遇到更多麻烦。 另一方面,你不能通过一次试的结果得出结论。因为那只能说明在特定编译器、特定crt下的结果。原理上你得知道delete是不改…
必须的啊,我推荐了那么久C++Primer5th中文版没有plus。不过我拿不到钱的,黑心出版社(逃&br&&br&之所以不推荐英文版,是因为我看的OO到Template的那四章,原版的bug实在太多了,还给原来照抄的几个译者们提了很多bug,不过我都没去看改过来没有(逃
必须的啊,我推荐了那么久C++Primer5th中文版没有plus。不过我拿不到钱的,黑心出版社(逃 之所以不推荐英文版,是因为我看的OO到Template的那四章,原版的bug实在太多了,还给原来照抄的几个译者们提了很多bug,不过我都没去看改过来没有(逃
C++ Primer 的定位原本就是“程序员的第一本C++教程”,而不是“编程初学者的第一本编程教程”。事实上作者在序言的第二页就明确指出“we assume you know enough about programming to write, compile, and run a program in at least one modern block-structured language. In particular, we assume you have used variables, written and called functions, and used a compiler.” 与此类似,K&R 的 TCPL 也是类似的定位,也同样在序言中指出了这一点。而定位于“编程初学者的第一本编程教程”的例子有 Deitel 的 How to program 系列,Microsoft Press 的 Step by step 系列等等,这些书则是事无巨细的列出了编程前所有的准备工作。针对原帖楼主的需求,貌似 Ivor Horton's Beginning Visual C++ 是一本可以接受的书。至少该贴楼主提到的IDE、编译、链接及UI库(印象中讲了 MFC 和 WinForm)都提到了。
C++ Primer 的定位原本就是“程序员的第一本C++教程”,而不是“编程初学者的第一本编程教程”。事实上作者在序言的第二页就明确指出“we assume you know enough about programming to write, compile, and run a program in at least one modern block-st…
达到不会在论坛上问弱智问题的水平。——不是针对你,是真心话。网上很多C++小白问题都可以用一句话回答:C++ Primer第n版第x.y节。&br&够不够?不够,你至少还要学 Effective C++ 才能开始用 C++ 干活。
达到不会在论坛上问弱智问题的水平。——不是针对你,是真心话。网上很多C++小白问题都可以用一句话回答:C++ Primer第n版第x.y节。 够不够?不够,你至少还要学 Effective C++ 才能开始用 C++ 干活。
以我理解,一般大学的 C++ 课程,其主要目标并不是教 C++ 语言,而是以 C++ 作为例子教基本编程。在此情况下,不需要教太多 C++ 的内容,学生便足以学到编程的一些概念,完成一些简单的编程练习。&br&然而,将来要理解一些真实项目中的 C++ 代码,并写出同样品质的代码,必须更详细地全面地了解这个语言。以此目的去学习,《C++ Primer》是一本很适合的 C++ 语言入门书籍。
以我理解,一般大学的 C++ 课程,其主要目标并不是教 C++ 语言,而是以 C++ 作为例子教基本编程。在此情况下,不需要教太多 C++ 的内容,学生便足以学到编程的一些概念,完成一些简单的编程练习。 然而,将来要理解一些真实项目中的 C++ 代码,并写出同样品…
对于修饰Object来说,&br&const并未区分出编译期常量和运行期常量&br&constexpr限定在了编译期常量&br&&br&然后我想对修饰函数多说两句,那就是constexpr修饰的函数,返回值不一定是编译期常量。#It is not a bug, it is a feature.#&br&&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#include &iostream&&/span&
&span class=&cp&&#include &array&&/span&
&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span&
&span class=&k&&constexpr&/span& &span class=&kt&&int&/span& &span class=&nf&&foo&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&n&&i&/span& &span class=&o&&+&/span& &span class=&mi&&5&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&10&/span&&span class=&p&&;&/span&
&span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&array&/span&&span class=&o&&&&/span&&span class=&kt&&int&/span&&span class=&p&&,&/span& &span class=&n&&foo&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&)&/span&&span class=&o&&&&/span& &span class=&n&&arr&/span&&span class=&p&&;&/span& &span class=&c1&&// OK&/span&
&span class=&n&&foo&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&);&/span& &span class=&c1&&// Call is Ok&/span&
&span class=&c1&&// But...&/span&
&span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&array&/span&&span class=&o&&&&/span&&span class=&kt&&int&/span&&span class=&p&&,&/span& &span class=&n&&foo&/span&&span class=&p&&(&/span&&span class=&n&&i&/span&&span class=&p&&)&/span&&span class=&o&&&&/span& &span class=&n&&arr1&/span&&span class=&p&&;&/span& &span class=&c1&&// Error&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&所以,对于constexpr需要两方面看待。&br&&br&constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。&br&&br&而检测constexpr函数是否产生编译时期值的方法很简单,就是利用std::array需要编译期常值才能编译通过的小技巧。这样的话,即可检测你所写的函数是否真的产生编译期常值了。
对于修饰Object来说, const并未区分出编译期常量和运行期常量 constexpr限定在了编译期常量 然后我想对修饰函数多说两句,那就是constexpr修饰的函数,返回值不一定是编译期常量。#It is not a bug, it is a feature.# #include &iostream&
#include &arra…
因为使用STL中 有部分名称是没有加下划线的保留标记的&br&而在自己的源代码中用到了后会引发未定义的后果&br&&br&例如:&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#include &algorithm&&/span&
&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&nf&&main&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&max&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&br&&br&一直我都告诫学习C++的人 以后精通了C++就不要用&b&&/b&了&br&如使用 如&b&using std::&/b&效果会更好&br&&br&&br&原例子已删除:未经证实&br&例子原文放在最后&br&&br&&br&----update:Jun 18th , 2015&br&&br&看来论据不够充分 那我加下&br&&br&《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间 第328页:&br&&有关using编译命令和using声明,需要记住的一点是,他们&b&增加了名称冲突的可能性&/b&。&&br&&br&《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间 第329页:&br&&blockquote&一般说来,&b&使用&u&using命令&/u&&/b&比&b&使用&u&using编译命令&/u&&/b&更&b&安全&/b&,这是由于它&u&只导入了制定的名称&/u&。如果该名称与局部名称发生冲突,编译器&u&将发出指示&/u&。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则&b&局部名称将&u&覆盖&/u&名称空间版本&/b&,而编译器&u&并不会发出警告&/u&。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。&br&...&br&然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span& &span class=&c1&&// avoid as too indiscriminate(随意)&/span&
&/code&&/pre&&/div&而应这样做&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&kt&&int&/span& &span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&cin&/span& &span class=&o&&&&&/span& &span class=&n&&x&/span& &span class=&p&&;&/span&
&span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&n&&x&/span& &span class=&o&&&&&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&endl&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&或者这样做&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&cin&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&cout&/span&&span class=&p&&;&/span&
&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&n&&cin&/span& &span class=&o&&&&&/span& &span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&n&&x&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&/blockquote&&br&《C++ Primer Plus (第六版 中文版 人民邮电出版社)》附录I: 转换为ISO标准的C++ 第915页:&br&&blockquote&名称空间有助于组织程序中使用标识符,避免名称冲突。由于标准库是使用性的头文件组织实现的,它将名称放在std名称空间中,因此使用这些头文件需要处理名称空间。&br&出于简化的目的,本书的事例通常使用编译命令using来使std名称空间中名称可用:&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&cp&&#include &iostream&&/span&
&span class=&cp&&#include &string&&/span&
&span class=&cp&&#include &vector&&/span&
&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span&
&span class=&c1&&//a using-directive&/span&
&/code&&/pre&&/div&然而,&b&不管需要于否,都导出名称空间中的所有名称,是于名称空间的初衷背道而驰的&/b&。&/blockquote&&br&&br&由此可见 并不是可以随意使用的语句。&br&&br&----update:Jun 18th , 2015 night.&br&&br&觉得例子还不够丰富 就上了google看看&br&在Steve Donovan 《C++ by Example》中写到:&br&&blockquote&However, some people feel strongly that using namespace std cases namespace pollution because &b&everything is dumped into the global namespace&/b&, &u&which is what namespaces were designed to prevent&/u&. &i&You need to understand the implications of using namespace std, &/i&and you need to recognize that there is one case where it &b&always a bad idea.&/b&&/blockquote&&br&而在国外的论坛StackOverflow&br&对于&a href=&///?target=http%3A///questions/2218140/what-requires-me-to-declare-using-namespace-std& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&What requires me to declare “”?&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///users/265143/p%25c3%25a9ter-t%25c3%25b6r%25c3%25b6k& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Péter T?r?k&i class=&icon-external&&&/i&&/a&给出了这样的解释&br&&blockquote&However,&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&is considered a bad practice because you are practically importing the whole standard namespace, &b&thus opening up a lot of possibilities for name clashes&/b&. It is better to import only the stuff you are actually using in your code, like&br&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&using&/span& &span class=&n&&std&/span&&span class=&o&&::&/span&&span class=&n&&string&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&/blockquote&&br&--update: Jan. 14th, 2016 morning&br&原文已被删除&br&&br&--update May 20th, 2016 evening&br&删除原文:&a href=&///?target=http%3A////& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ubuntu Pastebin&i class=&icon-external&&&/i&&/a&&br&&br&&br&转载请注明出处
因为使用STL中 有部分名称是没有加下划线的保留标记的 而在自己的源代码中用到了后会引发未定义的后果 例如: #include &algorithm&
int main()
int max=0;
一直我都告诫学习C++的人 以后精通了C++就不要用…
&p&因为如果你在头文件里面写普通函数的实现,那么这个实现就会被#include给复制到不同的cpp文件里面,到时候就变成了你的exe里面一个函数重复实现了若干次,这显然是不行的。&/p&&p&但是C++的类除外,类默认是inline的,而且人类有义务保证这个类在每一个cpp里面看到的东西都是一样的。所以如果你在两个cpp里面,写了两个名字一样的类,函数名也一样,只是实现不一样,那么编译是能够通过的。只是C++编译器完全可以在每一次调用这个类的时候,随机挑选不同的实现来运行。&/p&&p&但是在正常情况下,我们的不同的cpp看到的同一个类都是一样的(所以要注意你的头文件不要被各种#ifdef干),所以随机挑选哪一个都是一样的,因此没有任何问题(逃&/p&
因为如果你在头文件里面写普通函数的实现,那么这个实现就会被#include给复制到不同的cpp文件里面,到时候就变成了你的exe里面一个函数重复实现了若干次,这显然是不行的。但是C++的类除外,类默认是inline的,而且人类有义务保证这个类在每一个cpp里面看到…
delete 之后赋值 nullptr 绝对是坏习惯,会掩盖真实的错误。也不利于使用各种 memory checker 工具找出错误。&br&类似的还有为了防止 double free 而在 free 之后赋值 NULL,一样是错误的。&br&在 C++ 里,任何资源释放的操作都应该在析构函数里进行,这样只要管好对象生命期就不会有资源泄漏了。
delete 之后赋值 nullptr 绝对是坏习惯,会掩盖真实的错误。也不利于使用各种 memory checker 工具找出错误。 类似的还有为了防止 double free 而在 free 之后赋值 NULL,一样是错误的。 在 C++ 里,任何资源释放的操作都应该在析构函数里进行,这样只要管…
L-value的L代表萝莉(luo li),可结识可诱拐,全世界的怪蜀黍都可以喂她吃棒棒糖;&br&R-value的R代表人妻(ren qi),可结识不可诱拐,一旦NTR了那就是你的人了。&br&至于Left和Right嘛,都是后人牵强附会。(逃
L-value的L代表萝莉(luo li),可结识可诱拐,全世界的怪蜀黍都可以喂她吃棒棒糖; R-value的R代表人妻(ren qi),可结识不可诱拐,一旦NTR了那就是你的人了。 至于Left和Right嘛,都是后人牵强附会。(逃
好吧,我来稍微唱个反调。&br&&br&大部分人都说高中英语即可,我高考英语130左右,大一的时候看英文版C++ Primer。没错,确实能看,但英文一个单词一个单词地看,和中文一行一行地看是有区别的。我只知道,那本书我看得非常,非常慢。我确信换成中文书的话,我可以用更少的时间理解得更好。&br&&br&&br&大一由于自己的英文水平有限,看英文书的效果不怎么好。不过把时间往后推,由于各门课程也用的英文教材,网上也会主动找英文资料来看,虽然英语再没有主动学过,但英文水平也还不错。大概两年前六级裸考640,GRE半裸考150+170(要你命3000连一半都没背完…)&br&&br&直到现在,我也不敢说英语阅读能和中文一样。如果中文版翻译得不错,那我还是优先考虑中文版。(无奈很多翻译,都是那种“一眼就能看出原来的英文句子结构”&br&&br&所以个人认为,从长远的角度来看,如果你有充足的时间与耐心,而且想要同时提高英语水平,看原版肯定没错。&br&&br&但是如果你的英语确实只有高中英语及格水平,我觉得还是老老实实看中文版比较好。可以学英语的地方多了去了,没必要在学C++的时候,以牺牲一部分理解的代价来学习英语。
好吧,我来稍微唱个反调。 大部分人都说高中英语即可,我高考英语130左右,大一的时候看英文版C++ Primer。没错,确实能看,但英文一个单词一个单词地看,和中文一行一行地看是有区别的。我只知道,那本书我看得非常,非常慢。我确信换成中文书的话,我可以…
能定义不止一次的好处是方便你放到头文件里,放到头文件里的好处是每个include这个头文件的.c文件都能看到函数体,看到函数体的好处是编译器可以内联。内联的好处是代码变快了。另外,所有函数体定义必须一模一样,不然出了问题概不负责。constexpr自带inline属性。&br&&br&当你下决心在.c文件中定义函数体的时候,自然不需要inline关键字了。而这时候也必须link相应的.o来确保找得到定义。&br&&br&------------------------------ 话痨版 ------------------------------&br&&br&首先来几个前置知识:&br&&br&1) C和C++都有translation unit(或compilation unit)的概念:基本上编译器会一次编译一个文件,然后忘记一切,然后再编译下一个文件。哪怕你写gcc -c a.c b.c,其实和gcc -c a.c && gcc -c b.c大体上是没区别的。在最后,所有的.o文件都被linker汇总link成一个大的可执行文件。&br&&br&2) static function。你可以把一个函数标记为static(也称为internal linkage),这样该函数的symbol就会被隐藏,从而该函数只存在在当前translation unit。换了下一个translation unit之后,该函数被忘得一干二净。linker也从来不知道这函数存在过。这时候你就算再定义一次上次translation已经定义过的static函数,linker也不会报redefinition错误。当然,这样代码在binary中就出现了多次。&br&&br&3) 当然你也肯定知道C和C++的include的意思:在A中#include &B&就是把B的内容复制粘贴到A中#include对应的位置。&br&&br&4) 编译器的内联优化就是看到你在Bar里调用Foo的时候,帮你复制一遍Foo的函数体,内嵌到Bar里去,同时消除栈操作的开销(因为代码已经被复制到“本地”了嘛,不需要跳来跳去了)。内联优化有个缺陷,就是在同一个translation unit里一定要看到函数体,所以光看到declaration是没用的。&br&&br&现在考虑这么个问题:传统的在头文件中声明,在一个文件(.c)中实现函数体的方式有时执行太慢了。为什么慢呢,假设我这个函数就一行,但是函数调用的压栈传参数弹栈跳转等指令占了大部分开销,真是太不合算了。&br&&br&这时候在传统C里面有两个解决方案:&br&1) “宏函数”。就是把本来藏在.c文件里的函数体放到一个宏里面去,当然宏也在头文件里。然后大家include头文件的时候就把宏也include走了,使用宏的时候就把这段代码一遍遍展开到所有使用的地方,消除了函数调用的开销。&br&2) 在编译器支持内联优化的情况下,在头文件里定义static function。任何别的.c文件,只要include了你的头文件,都对你的头文件做了一次复制粘贴,自动获得了该static function的函数体。所以在不同的translation unit里面,这些函数并不冲突,因为它们是static的。值得一提的是,这些函数体不一定一模一样。举例来说:&br&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&c1&&// a.h
&span class=&cp&&#define FOO 3&/span&
&span class=&k&&static&/span& &span class=&kt&&int&/span& &span class=&nf&&Foo&/span&&span class=&p&&()&/span& &span class=&p&&{&/span& &span class=&k&&return&/span& &span class=&n&&FOO&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&c1&&// a.c&/span&
&span class=&cp&&#include &a.h&&/span&
&span class=&c1&&// b.c&/span&
&span class=&cp&&#undef FOO&/span&
&span class=&cp&&#define FOO 2&/span&
&span class=&cp&&#include &a.h&&/span&
&/code&&/pre&&/div&在不同的translation unit里面一个Foo返回3一个返回2。&br&&br&1) 的坏处很明显,宏不能解决类型检查的问题,宏是dynamic scope(变量检查环境都是调用端而非定义端的)的,宏是textual substitution,搞不好有迷之编译不通过,宏很丑,定义不带语法高亮(雾),等等。&br&2) 看上去很好诶,写的是真正的函数,编译器还有能力内联。其缺陷是在编译器决定不内联的时候(通常这时候函数很大),每个translation unit中都定义了一个很大的函数,造成了不必要的binary size bloat。&br&&br&这时候C++之父Bjarne Stroustrup站出来了,说我们在C++里搞个inline关键字吧!这个关键字不仅编译器认识,而且编译器在没有真正内联该函数时,会通过某种方式提示linker说这个函数被标记为“可重复定义”耶 - 根据我用gcc的实验,生成的是一个weak symbol。当linker看到一个weak symbol,会把函数名写在一个小本本上。在linker最后把所有文件link到一起的时候,它会把小本本扫一遍,对于同名函数只留一个,别的函数连带函数体统统删掉。这样就解决了binary size bloat的问题。当然这只是一种典型实现方式,并非一定如此。&br&&br&另外,在编译器真正内联了该函数的时候,效果就和static一样了,这也是为什么你的代码里找不到定义 - 因为linker根本看不到static函数。话虽这么说,但是他们不管这个叫internal linkage(&a href=&///?target=http%3A///w/cpp/language/inline& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&inline specifier&i class=&icon-external&&&/i&&/a&),因为此时linkage是个implementation detail。语言只是强调:&br&&blockquote&The definition of an inline function must be present in the translation unit where it is called (not necessarily before the point of call)&/blockquote&&br&在前面提到,用include static functions的方式中include进来的函数体可能不完全一样。inline此处也提到,你要是同名函数的函数体长得不一样,我才不告诉你我要留哪一份删哪几份呢。你要是敢这么做,我不保证我的输出有意义。这个在C++里叫做ODR violation (&a href=&///?target=http%3A///w/cpp/language/definition& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Definitions and ODR&i class=&icon-external&&&/i&&/a&)。编译器一次只看一个translation unit,所以通常是没法检测ODR violation的(不排除LTO还是能查的),而linker也不查,我并不清楚为什么,大概是太昂贵吧。&br&&br&另外,可以感受下当年inline关键字的marketing口号:&br&“An Inline Function is As Fast As a Macro”(&a href=&///?target=https%3A//gcc.gnu.org/onlinedocs/gcc/Inline.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Inline - Using the GNU Compiler Collection (GCC)&i class=&icon-external&&&/i&&/a&)&br&&br&顺带建议一下刷ACM-ICPC的各种坑爹oj的同学,想要速度就用宏,因为oj可能不开内联优化。。
能定义不止一次的好处是方便你放到头文件里,放到头文件里的好处是每个include这个头文件的.c文件都能看到函数体,看到函数体的好处是编译器可以内联。内联的好处是代码变快了。另外,所有函数体定义必须一模一样,不然出了问题概不负责。constexpr自带inli…
在没有C的基础上学C++Primer,可以避免在使用C++的时候把C的陋习带进来。这对于今后使用C++是一个巨大的好处,直接达到了绝大部分从C开始的人所无法达到的境界。
在没有C的基础上学C++Primer,可以避免在使用C++的时候把C的陋习带进来。这对于今后使用C++是一个巨大的好处,直接达到了绝大部分从C开始的人所无法达到的境界。
初学者学C++第一大忌:【想要立刻就】“知其然更要知其所然”。&br&&br&计算机技术发展到现在那么复杂,哪有你说理解就理解的。
初学者学C++第一大忌:【想要立刻就】“知其然更要知其所然”。 计算机技术发展到现在那么复杂,哪有你说理解就理解的。
已有帐号?
无法登录?
社交帐号登录}

我要回帖

更多关于 学习的正确姿势 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信