![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
effective modern c++
boydfd
这个作者很懒,什么都没留下…
展开
-
Item 5: 比起显式的类型声明,更偏爱auto
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!啊,简单愉快的代码:inr x;等等,讨厌!我忘了初始化x,所以它的值是不确定的。可能,它可能被初始化成了0,这取决于你的编译环境。哎。不要紧,让我们简单并愉快地声明一个局部变量,通过解引用一个iterator来初始化它:template<typename It>void dwim翻译 2016-02-05 10:30:37 · 744 阅读 · 0 评论 -
Item 16: 让const成员函数做到线程安全
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方便。在这个类中,如果有一个函数能计算多选式的根(也就是,多项式等于0时,各个未知量的值)将变得很方便。这个函数不会改变多项式,所以很自然就想到把它声明为const:class Polynomial{public:翻译 2016-02-05 10:52:34 · 876 阅读 · 0 评论 -
Item 17: 理解特殊成员函数的生成规则
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!C++的官方说法中,特殊成员函数是C++愿意去主动生成的。C++98有4个这样的函数:默认构造函数,析构函数,拷贝构造函数,拷贝operator=。当然,这里有些细则。这些函数只在需要的时候产生,也就是,在类中如果一些代码没有清楚地声明它们就使用了它们。一个默认构造函数只有在类中没有声翻译 2016-02-05 10:53:08 · 904 阅读 · 0 评论 -
Item 18: 使用srd::unique_ptr来管理独占所有权的资源
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!当你需要一个智能指针的时候,std::unique_ptr通常是最接近你需求的那一个。默认情况下,这么假设是很合理的:std::unique_ptr和原始指针的大小是一样的,并且很多操作(包括解引用),它们执行的是完全相同的指令。这意味着你甚至能把它们用在对内存和时间都很紧的地方。如果翻译 2016-02-05 10:53:43 · 1035 阅读 · 0 评论 -
Item 19: 使用srd::shared_ptr来管理共享所有权的资源
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!使用带垃圾回收机制语言的程序员指出并嘲笑C++程序员需要遭受防止资源泄漏的痛苦。“多么原始啊”他们嘲笑道,“20世纪60年代的Lisp留下的备忘录你还不记得了吗?机器(而不是人类)应该管理资源的生命周期”。C++开发人员转了转他们的眼睛,“你所说的备忘录是指,那些资源只有内存以及资源的翻译 2016-02-05 10:54:34 · 1369 阅读 · 0 评论 -
Item 26: 避免对universal引用进行重载
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你需要写一个以名字作为参数,并记录下当前日期和时间的函数,在函数中还要把名字添加到全局的数据结构中去的话。你可能会想出看起来像这样的一个函数:std::multiset<std::string> name; // 全局数据结构void logAndAdd(co翻译 2016-03-27 13:03:21 · 1613 阅读 · 0 评论 -
Item 25: 对右值引用使用std::move,对universal引用则使用std::forward
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!右值引用只能绑定那些有资格被move的对象上去。如果你有一个右值引用类型的参数,你就知道这个被绑定的对象可以被move:class Wdiget{ Widget(Widget&& rhs); // rhs肯定指向一个有资格被move的对象 ...};在这种情况下翻译 2016-03-12 14:28:57 · 1423 阅读 · 0 评论 -
Item 24: 区分右值引用和universal引用
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!古人曾说事情的真相会让你觉得很自在,但是在适当的情况下,一个良好的谎言同样能解放你。这个Item就是这样一个谎言。但是,因为我们在和软件打交道,所以让我们避开“谎言”这个词,换句话来说:本Item是由“抽象”组成的。为了声明一个指向T类型的右值引用,你会写T&&。因此我们可以“合理”地翻译 2016-03-07 20:33:21 · 1434 阅读 · 0 评论 -
item 23: 理解std::move和std::forward
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!根据std::move和std::forward不能做什么来熟悉它们是一个好办法。std::move没有move任何东西,std::forward没有转发任何东西。在运行期,它们没有做任何事情。它们没有产生需要执行的代码,一byte都没有。std::move和std::forward只翻译 2016-03-07 20:32:31 · 8934 阅读 · 0 评论 -
Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你曾经同过久的编译时间斗争过,那么你肯定对Pimpl(”point to implementation”,指向实现)机制很熟悉了。这种技术让你把类的数据成员替换成指向一个实现类(或结构)的指针,把曾经放在主类中的数据成员放到实现类中去,然后通过指针间接地访问那些数据成员。举个例子,翻译 2016-02-05 10:56:07 · 874 阅读 · 0 评论 -
Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!让我们先从std::make_unique和std::make_shared的对比开始吧。std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是。它是在C++14中才被加入到标准库的。如果你使用的是C++11,不要怕,因为一个std::翻译 2016-02-05 10:55:33 · 1077 阅读 · 0 评论 -
Item 20: 使用std::weak_ptr替换会造成指针悬挂的类std::shared_ptr指针
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!矛盾的是,我们很容易就能创造出一个和std::shared_ptr类似的智能指针,但是,它们不参加被指向资源的共享所有权管理。换句话说,这是一个行为像std::shared_ptr,但却不影响对象引用计数的指针。这样的智能指针需要与一个对std::shared_ptr来说不存在的问题做翻译 2016-02-05 10:55:00 · 1092 阅读 · 2 评论 -
Item 15: 只要有可能,就使用constexpr
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果说C++11中有什么新东西能拿“最佳困惑奖”的话,那肯定是constexpr了。当把它用在对象上时,它本质上是const的加强版,但是把它用在函数上时,它将拥有不同的意义。切开“迷雾”(解开困惑)是值得的,因为当constexpr符合你想表达的情况时,你肯定会想要使用它的。从概念上翻译 2016-02-05 10:51:22 · 2142 阅读 · 0 评论 -
Item 14: 如果函数不会抛出异常就把它们声明为noexcept
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!在C++98中,异常规范(exception specifications)是一个不稳定因素。你必须总结出一个函数可能会抛出的异常类型,所以如果函数的实现被修改了,异常规范可能也需要被修正。改变异常规范则又可能影响到客户代码,因为调用者可能依赖于原先的异常规范。编译器通常不会提供帮助来翻译 2016-02-05 10:50:51 · 2900 阅读 · 0 评论 -
Item 13: 比起iterator优先使用const_iterator
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!STL中的const_iterator等价于pointers-to-const(指向const值的指针)。它们指向的值不能被修改。使用const的标准做法是,每当你不需要修改iterator指向的值的时候,你都应该使用const_iterator。这对C++98和C++11来说都是对的翻译 2016-02-05 10:50:03 · 1226 阅读 · 0 评论 -
item 1: 对于模板类型的推导
为了提升自己的英语水平,强行翻译了effective modern c++ 虽然翻译的不是很好,但是好歹能看看。接下来会陆续把所有的条款都翻译了的,希望各位看官不要嫌弃我的英语水平。一些用户对复杂的系统会忽略它怎么工作,怎么设计的,但是很高兴去知道它完成的一些事。通过这样的方式,c++中的模板类型的推导取得了巨大的成功。数以万计的程序员曾传过参数给模板函数,并得到了满意的结果。尽管很多那些程序员很原创 2015-11-04 17:45:39 · 2059 阅读 · 2 评论 -
item 2:理解auto类型的推导
item 2: 理解auto类型的推导如果你已经读过item 1的模板类型推导,你已经知道大部分关于auto类型推导的知识了,因为,除了一种奇怪的情况外,auto类型推导和template类型推导是一样的。但是为什么会这样?template类型推导涉及模板和函数以及参数,但是auto没有处理这些东西。是这样的,但是这没关系。从template类型推导到auto类型推导有一个直接的映射关系。这里有一个翻译 2015-11-05 16:09:18 · 1994 阅读 · 1 评论 -
Item 3: 理解decltype
本文翻译自effective modern C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!decltype是一个奇怪的东西。给出一个名字或者一个表达式,decltype可以告诉你名字或表达式的类型。大多情况下,他告诉你的就是确实你想的那样。但是偶尔,他会提供一个脱离你想象的结果,这导致了你必须去找一本参考书或者去在线Q&A网站寻求答案。我们从一般情况(没有意外的结果)开始。对比翻译 2016-02-05 10:15:03 · 1296 阅读 · 0 评论 -
Item 4: 知道怎么去看推导的类型
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!对于推导类型结果的查看,根据不同的软件开发阶段,你想知道的信息的不同,可以选择不同的工具。我们将探讨三种可能性:在你编辑代码时获得类型推导信息,在编译期获得信息,在运行期获得信息。IDE 编辑器在IDE中编辑代码常常能显示程序实体(比如,变量,参数,函数等)的类型,只需要你做一些像把光翻译 2016-02-05 10:25:55 · 730 阅读 · 0 评论 -
Item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!Item 5解释了比起显式指定类型,使用auto来声明变量提供了大量技术上的优点,但是有时候auto的类型推导出zigs(这个类型),但是你想要的是zag(另外一个类型)。举个例子,假设我有一个函数以Widget为参数并且返回一个std::vector,每个bool指示Widget是否翻译 2016-02-05 10:35:11 · 697 阅读 · 0 评论 -
Item 7:当创建对象的时候,区分()和{}的使用
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!从不同的角度来看,在C++11中,对象初始化拥有多种语法选择,这体现了语法丰富造成的尴尬或者烂摊子。一般情况下,初始化的值可以用圆括号,等号,花括号来确定:int x(0); //用圆括号初始化int y = 0; //用"="初始化int z{ 0 }; //用花括号初始化在翻译 2016-02-05 10:38:44 · 918 阅读 · 0 评论 -
Item 8: 比起0和NULL更偏爱nullptr
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!先让我们看一些概念:字面上的0是一个int,不是一个指针。如果C++发现0在上下文中只能被用作指针,它会勉强把0解释为一个null指针,但这只是一个应变的方案。C++的主要规则还是把0视为int,而不是一个指针。实际上,NULL也是这样的。NULL的情况,在细节方面有一些不确定性,因为翻译 2016-02-05 10:43:03 · 822 阅读 · 0 评论 -
Item 9: 比起typedef更偏爱别名声明(alias declaration)
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!我确信我们都同意使用STL容器是一个好主意,并且我希望在Item 18中能让你相信使用std::unique_ptr也是一个好主意,但是我猜想,我们中没有任何一个人想多次写这样的类型:“std::unique_ptr 你要记住的事typedef不支持模板化,但是翻译 2016-02-05 10:45:29 · 886 阅读 · 0 评论 -
Item 10: 比起unscoped enum更偏爱scoped enum
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!一般情况下,在花括号中声明一个name(包括变量名,函数名),这个name的可见性会被限制在花括号的作用域内。对于在C++98风格的enum中声明的enum成员却不是这样。这些enum成员的name属于的作用域是enum所在作用域,这意味着在这个作用域中,不能拥有相同的name:enu翻译 2016-02-05 10:46:53 · 821 阅读 · 0 评论 -
Item 11: 比起private undefined function优先使用deleted function
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!如果你为其他开发者提供代码,并且你想阻止他们调用一个特定的函数,你通常不会声明这个函数。函数不声明,函数就不会被调用。太简单了!但是有时候C++会帮你声明函数,并且如果你想要阻止客户调用这些函数,简单的事情就不再简单了。这种情况只发生在“特殊的成员函数”身上,也就是,当你需要这些成员函翻译 2016-02-05 10:47:39 · 679 阅读 · 0 评论 -
Item 12: 把重写函数声明为“override”的
本文翻译自《effective modern C++》,由于水平有限,故无法保证翻译完全正确,欢迎指出错误。谢谢!C++中的面向对象编程总是围绕着类,继承,以及虚函数。这个世界中,最基础的概念就是,对于一个虚函数,用派生类中的实现来重写在基类中的实现。但是,这是令人沮丧的,你要认识到重写虚函数有多么容易出错。这就好像这部分语言,是用这样的概念(墨菲定律不仅仅要被遵守,更需要被尊敬)来设计的。(it翻译 2016-02-05 10:49:27 · 3888 阅读 · 0 评论 -
Item 27: 明白什么时候选择重载,什么时候选择universal引用
博客已经迁移到这里啦Item 26已经解释了,不管是对全局函数还是成员函数(尤其是构造函数)而言,对universal引用的重载会导致一系列的问题。到目前为止,我也已经给出了好几个例子,如果它能表现得和我们期待的一样,这种重载也能很实用。此Item会探索如何让这种重载能实现我们所需求的行为。我们可以设计出避免对universal引用进行重载的实现,也可以通过限制参数的类型,来使得它们能够匹配。我们的翻译 2017-05-17 23:35:47 · 871 阅读 · 0 评论