时习之

学而时习之,不亦说乎


  • 首页

  • 标签

  • 归档

  • 搜索

读书札记之 —— 《Exceptional C++ Style》

发表于 2016-04-25 | 阅读次数:

这本书的中文名叫做《C++编程剖析》,从中文名字中你很难发现这本书和《Exceptional C++》以及《More Exceptional C++》是同一个系列的书(萨特的《Exceptional》系列) 。这本书和前两本是一脉相承的,只是感觉作者的写作风格(或者是译者的翻译风格)和 前两本有略微的不同。三本书依次读下来会发现作者的写作风格越来越幽默。

这三本书是萨特的Guru of the Week的打印版本,基本上的内容似乎都可以在 GOTW 上面找到,其中#1 - #30基本上出现在《Exceptional C++》一书中,#31 - #62出现 在《More Exceptional C++》一书中,剩余的大部分则出现在这本书里面。如果你对于原 文比较感兴趣可以通过上面的连接去找找看。

正如其名《EXceptional C++ Style》一书中花了大量的篇幅去讨论编码的风格问题,这也 难怪作者会在这本书之后去写一本《C++ Coding Standards》专门讨论C++的编程风格。此 外萨特还和C++语言之父在github上起草编写了 CppCoreGuidelines 。

这本书一共 40 个条款,我直接跳过了其中的9-10两条和26-27两条,不看前者是因为 export这个特性很多的编译器不支持,而且在新的标准中已经废弃;至于后面两条涉及的 是优化问题,作者的核心理念是对于优化专业知识非常的重要,但是我没有关于国际象棋 方面的专业知识。

阅读全文 »

为什么很多人禁用拷贝(复制)构造函数

发表于 2016-04-24 | 阅读次数:

关于C++的拷贝构造函数,很多的建议是直接禁用。为什么大家会这么建议呢?没有拷贝构 造函数会有什么限制呢?如何禁用拷贝构造呢?这篇文章对这些问题做一个简单的总结。

这里讨论的问题以拷贝构造函数为例子,但是通常赋值操作符是通过拷贝构造函数来实现 的( copy-and-swap 技术,详见《Exceptional C++》一书),所以这里讨论也适用于赋 值操作符,通常来说禁用拷贝构造函数的同时也会禁用赋值操作符。

阅读全文 »

C++中访问私有成员的方法

发表于 2016-04-23 | 阅读次数:

今天读《Exceptional C++ Style》一书的时候,发现在C++中竟然存在一种合法的方式去 访问对象的私有成员,想起以前和嘉伟讨论过了调用私有函数的问题,猛然发现方法不止 原来一种,这里做一个总结。

这三种方法都是使用一个间接层,现在想来果然还是那句老话,没有什么问题是通过间接 层无法解决的。

当然,这里说的所有内容,基本上纯属个人找乐子而已,你在实际编码中不到万不得已千 万不要去使用这些方法,它们给程序的安全和耦合性上都有非常大的危害。

阅读全文 »

读书札记之 —— 《More Exceptional C++》

发表于 2016-04-22 | 阅读次数:

和《More Effective C++》中的more不一样的是,这本书的more体现在广度上而不是 深度上。《Exceptional C++》一书的已经是非常有深度的一本书了(或者说是比较难的一 本书了),这本书是前者在其他内容上的扩展。

这本书涉及到很多内容,包括范型模板、性能调优等等方面。个认识收获最多的是 traits类的使用。

阅读全文 »

读书札记之 —— 《从晚晴到民国》

发表于 2016-04-18 | 阅读次数:

这是一部有趣的“野史”,让我了解到正史(教科书)之外的各种史料和观点,给我的感觉 是醍醐灌顶,耳目一新。我高中学文科,对这一段的历史还算了解,书中提到的大事基本 熟悉,只是作者站在一个全新的角度去看待这些事情,给人的体会自然也就不一样了。

《从晚晴到民国》这本书是《晚期七十年》一书的删减版本,至于删减了什么东西我不太 清楚,不过剩下的东西很值得一读。本书覆盖了鸦片战争(1840)年到辛亥革命(1911) 这七十年左右的历史,按照作者的历史转型观点,这段时期十几年发生一次巨变,应该也 就是所谓穷则变,变则通,不通再变,循环往复。这段时期大概是200年,我们目前还处于 这样一个时期,也许不久的将来还会大变。

这段历史是我们的国难史,这段历史当中的国人身处水火之中,人命如蝼蚁,惨不堪言。 在内忧外患之中,我们能够保持领土完整、主权独立可以说是不幸中的万幸。我们之所以 没有沦落为殖民地很大一部分的原因在于那些在民族危亡之际挺身而出的民族英雄。我读 这本书,最吸引我的内容也就是这些人的英雄事迹,他们理当名垂青史,流芳百世。

阅读全文 »

读书札记之 —— 《Exceptional C++》

发表于 2016-04-10 | 阅读次数:

萨特是 ISO C++标准委员会主席, C++/CLI首席架构师,久负盛名之人,书的质量自然不 用怀疑。这本书是Exceptional系列书籍的第一本,很多人觉得这个系列可以和梅耶的 Effective系列相媲美,虽然名气上它似乎不如后者。梅耶的书读起来很有趣,像一个逗 比给你讲故事,萨特的书读起来相对沉重一些,更像一个老教授在你身边耳提面命。

阅读全文 »

读书札记之 —— 《Effective STL》

发表于 2016-04-01 | 阅读次数:

Scott Meyers 的书,似乎每一本都值得一读再读,这本书我是第二次读。上次读这本书 基本上是在车上读完的,那时候在公司实习,上下班的路上读完这本书,不厚,但是很值 得人回味。

那时候对于STL并不理解,至少比现在理解的要少一些,所以很快就忘了书里说了些什么 。以至于后来看到《深入理解C++11》这本书引用《Effective STL》一书的内容的时候没 有半点印象,这也是我打算重读这本书的原因。

看这本书之前,我看了《C++ 标准库》这本砖头书,对于标准库中的各个组件有了更加深 刻的理解,所以再次看这本书的时候,感悟和第一次读的时候有很大的区别。

阅读全文 »

读书札记之 —— 《Vim 实用技巧》

发表于 2016-04-01 | 阅读次数:

Tips1 你应该从今天就开始阅读

这是我第三次尝试读完这本书,也是第一次成功读完它。前两次读这本书的时候总是各种 原因读了几章之后就放弃了,不是书不好,只是那时候没有足够的时间和耐性。Tips性 质的书籍总会让我觉得,嗯,明天再读下一条Tips也可以,反正前后也没有太大的联系 ,于是明天之后的明天的明天我还是没有把这本书看完。也许我早些读完这本书,我不会 自不量力的写那些关于Vim的文章,因为那些文章看上去有些误人子弟了。

Tips2 理解快捷键的内在逻辑

毋庸置疑的是这是一本非常好的Vim书籍,我用Vim已经有两年左右的历史了,但是看完之 后还是觉得自己是小学生的水平。Vim的使用不是简简单单的记住几个快捷键就可以的,很 多时候,我们需要知道这些快捷键的内在逻辑。

Tips3 慢点开始,因为你可能走错了方向

我从一开始用Vim的时候就可以使用各种vimrc的配置,使用自定义的一些快捷键完成自己 更高效的一些操作。现在想来一开始就是错的。我们需要花时间去把锯子磨利,而一开始 胡乱的配置只会让我们把锯子越磨越钝,作者说的对,其实很可能我们磨错了边。

Tips4 不要太过于依赖插件

我之前学习Vim,最先想到的是它的插件,因为我一直认为Vim核心功能很少,功能不够强 大。实际上,Vim的核心功能已经非常强大,只是我一直不知道。在使用插件之前先考虑一 下你的功能是否可以使用核心功能完成。

之所以这么说,是因为核心功能的适用性要比插件广泛太多,你可以使用IDE中安装Vim模 拟器来使用Vim的核心功能,但是你没有办法在IDE的Vim模拟器中使用Vim的插件。Vim的核 心功能是放之四海而皆准的东西,这些东西相当于是一个人的内功,插件通常只是招式。

Tips5 移动光标的方式不只有 hjkl

对于初学Vim的人来说,它最奇怪的地方估计是使用hjkl来替代方向键。之所以使用这四 个键是一个历史遗留问题,原因可以参考之前写过编辑利器 Vim 之快捷键配置 一文。

这四个按键的效率比方向键效率高很多,因为你不用偏离键盘的关键行(也就是hjkl一 行)。因为这种诡异性和便捷性,我一度以为移动光标最快的方式是 hjkl 这四个键。 然而实际上,这是大错特错。

对于同一行的移动,hl是最慢的方式,因为它们的移动是以字符为单位的。w,e,b,ge 这四个键比前面两个要快很多,因为它们是基于单词的(当然还有大写的W和E等对应版本 )。可是最快的方式是f, F, t, T结合;和,,因为它们很多时候可以直达你想要到 达的地方。比如:

1
#include <iostream>

光标在#的时候,想要把 iostream 替换成 string,使用l移动到目标位置,你需 要按10次,使用w你需要3次,使用f你只需要1次fo就可以了(然后使用 ciw 进 行替换)。

如果你想要在行之间移动,jk这两个按键同样不是最快的方式,因为它们一次只能移动 一行,使用/这种方式通常会快很多。没错就是搜索,你可以通过搜索快速的到达你想要 的位置,对我来说,这是一种思维方式的转变。Vj可以选择两行代码,V/}可以通常可 以选择一块代码。当然最快的还不是这个,使用 vi} 你可以以最快的方式选择代码块中 的内容,对我来说,这是神技。

Tips6 正则表达式很重要

最近总是和正则表达式打交道,从使用Python的正则表达式写爬虫开始,到后来从《程 序设计实践》一书中了解grep的实现,再到后来看C++11的正则表达式库。现在发现 Vim中无处不在的正则表达式。搜索可以用正则,替换可以用正则,global命令还是可以用 正则。

Tips7 Vim 自带自动补全功能

很多人不用文本编辑器的原因很简单,因为他们认为只有IDE才有自动补全功能。实际上, Vim自动自动补全功能,而且非常强大。即使不用 YouCompleteMe这一类的插件你也可以 得到非常好的补全功能。

读书札记之 —— 《C++ 标准库(第二版)》

发表于 2016-03-26 | 阅读次数:

呼……这本书总算是看完了,前前后后看这本书大概花了二十来天,总算看完了(更准确的 说是翻完了)这本砖头一样厚(还是块加厚版的砖)的书。

你要是问我记住了些什么,我只能说啥也没记住,C++标准库的内容终究还是太多,细节太 多,能装在脑子里的东西真的很少。其实我在看这本书之前就知道会是这个结果,所以也 没有觉得自己白读了这本书,留在脑海中不是也不应该是具体的细节,而是关于标准库的 一些感悟,前面读这本书的时候陆陆续续也有写一些文章来记录这些东西。

阅读全文 »

C++11 中使用 {} 作为串流迭代器 EOF

发表于 2016-03-17 | 阅读次数:

stream iterator 是一种神奇的迭代器适配器,它让我们可以使用 STL 算法操纵输 入输出流,比如把 vector 中的内容全部输出,可以简单的写成这样。

1
2
vector<int> coll = {1, 2, 3, 4, 5, 6};
copy(coll.cbegin(), coll.cend(), ostream_iterator<int>(cout, " "));

当然你也可以使用这种方式处理输入,比如从标准输入中输入元素到 vector 中去。

1
2
3
4
vector<int> coll;
copy(istream_iterator<int>(cin), // start of source
istream_iterator<int>(), // end of source
back_inserter(coll)); // destination

istream_iterator 要比 ostream_iterator 难用一些,因为你必须要使用一个 EOF 表示输入的结束,这个概念可以用 istream_iterator 的默认构造函数产生的对 象表示。也就是上面这个 istream_iterator<int>()。

这种语法看起来比较诡异,我在看 《C++ 标准库》^1这本书的勘误的时候发现了一种新 的语法,直接使用{}。

1
2
3
4
copy (istream_iterator<string>(cin), // start of source
{}, // end of source
//(default constructed istream iterator)
back_inserter(coll)); // destination

之所以可以这样做主要归功于 C++11 统一了初始化语法,可以在任何地方使用 {} 来初始化,在 copy 中,因为我们可以根据第一个参数推导出第二个参数的类型,所以 可以直接通过 {} 来调用默认的构造函数创建代表 EOF 的迭代器。

勘误的原话如下:

Note that since C++11, you can pass empty curly braces instead of a default constructed stream iterator as the end of the range. This works because the type of the argument that defines the end of the range is deduced from the previous argument that defines the begin of the range:

另外需要提醒的是,《C++ 标准库》的中文译本应该是基于第一次印刷版本翻译的,原书 有一些错误,在英文版的勘误中有修正,大家如果读这本书应该关注一些它的 勘误,以免被一些错误所误导。

1…456…11
郭荣飞

郭荣飞

记录成长路上的点点滴滴

108 日志
33 标签
© 2018 郭荣飞
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4