
《Effective C++》 读书笔记
本人读完《C++primer》后,仍不能对c++有一个较清楚的认识,通读一遍《Effective c++》后,第二遍写的一些关于这本传世之作的笔记。
Effective C++:改善程序与设计的55个具体做法(第3版 中文版) [美] 梅耶(Scott Meyers)侯捷 译
Soar-
这个作者很懒,什么都没留下…
展开
-
条款25:考虑写出一个不抛异常的swap函数
本条款名字虽然在说“不抛异常”,然而内容重点却在正确的设计swap使得更高效、节省资源!首先,swap标准程序库定义:template<typename T>void swap(T& a, T& b){ T tmp(a); a = b; b = tmp;}然而,这种复制的成本对于某些class没有必要,我们这里来看...原创 2019-05-31 11:17:21 · 229 阅读 · 0 评论 -
条款24:若所有参数皆需类型转换,请为此采用non-member函数
本条款说的就是:当某个函数的参数进行类型转换时,那么这个函数必须应该是个non-member函数。原创 2019-05-31 00:32:06 · 135 阅读 · 0 评论 -
条款23:宁以non-member non-friend替换member函数
本条款看的云里雾里的,看网上其他大佬总结的才明白了~拿书上的例子:class WebBrower{public: void ClearCach(); void ClearHistory(); void RemoveCookies();};定义了一个WebBrower的类,里面执行对浏览器的清理工作,包括清空缓存,清除历史记录和清除Cookies,现...原创 2019-05-30 23:44:27 · 172 阅读 · 0 评论 -
条款22:将成员变量声明为private
一、从几个角度考虑为什么要讲将成员变量设置为private1、一致性我们让客户能够访问对象的方法是通过成员函数,否则客户需要考虑加不加括号。2、使用函数可以对成员变量处理有更精确的控制3、从封装的角度考虑二、protect的封装性并不好总结:1、切记将成员变量声明为priv...原创 2019-05-30 21:01:52 · 169 阅读 · 0 评论 -
条款21:必须返回对象时,别妄想返回其reference
受条款20影响,可能会强烈追求传递引用,然而返回对象时,一定不要返回引用。一、不管在哪创建对象,都不可以返回引用二、甚至,你可能会想到静态变量然而情况更糟糕:总结:老老实实地返回值吧~绝不要返回pointer或reference指向一个localstack对象,或返回reference指向一个heap-allo...原创 2019-05-30 20:18:06 · 160 阅读 · 0 评论 -
条款20:宁以pass-by-reference-to-const替换pass-by-value
一、传递const引用的好处1.减少传值的拷贝成本:通过by value方式传递一个对象,成本是多次构造函数,析构函数的调用,加上继承代价。2.避免对象切割问题:二、内置类型传值注意:1、尽量以 pass-by-reference-to-const替换 pass-by- value。前者通常比较高效,并可避免切割问题( slicing problem...原创 2019-05-30 17:09:59 · 205 阅读 · 0 评论 -
条款19:设计class犹如设计type
本条款主要给出定义出高效的class 需要注意的地方:总结:Class的设计就是type的设计。在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题。...原创 2019-05-30 16:05:38 · 132 阅读 · 0 评论 -
条款18:让接口容易被正确使用,不易被误用
一、让接口不容易被误用这里给出的例子是关于日期的类的设计:二、限制类型内什么可做,什么不可做三、与内置类型兼容、保持接口一致四、消除客户管理的责任,使用智能指针如果函数返回指针,客户有可能没有删除指针,或者删除指针超过两次,因此返回智能指针比较好。总结:1、好的接口很容易被正确使用,不...原创 2019-05-30 15:49:19 · 207 阅读 · 0 评论 -
条款17:以独立语句将newed对象置入智能指针
一、shared_ptr构造函数是个explicit构造函数二、应以独立语句将newed对象存储于智能指针内注意:1、shared_ptr构造函数是explicit的,不能进性隐式构造2、以独立语句将newed对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。...原创 2019-05-29 23:21:13 · 167 阅读 · 0 评论 -
条款16:成对使用new和delete时要采取相同形式
本条款说的是:动态分配数组的时候一定要加[]。一、new delete工作机制二、数组最好不要typedef总结如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。...原创 2019-05-29 22:43:51 · 108 阅读 · 0 评论 -
条款15:在资源管理类中提供对原始资源的访问
一、RAII class 对象转化为 其所内含的原始资源1.get函数显示转化智能指针重载了指针取值操作符:2.隐式转换函数总结:1、APIs往往要求访问原始资源(rawresources),所以每一个RAIIclass应该提供一个“取得其所管理之资源”的办法。2、对原始资源的访问可能经由显式转换或隐式转换。一般...原创 2019-05-29 20:37:35 · 159 阅读 · 0 评论 -
条款14:在资源管理类中小心copying行为
一、当一个RAII对象被复制时的选择这两种选择要看所管理的资源来定,比如Lock函数就不能用引用计数,因为当引用次数为0时删除资源,这不是我们想要的行为,我们用上一个mutex,我们想做的释放动作是解除锁定而非删除。然而,shared_ptr允许指定所谓的“删除器”,那是一个函数或者函数对象,当引用次数为0时便被引用(auto没有这种机制)。...原创 2019-05-29 20:00:21 · 173 阅读 · 0 评论 -
条款13:以对象管理资源
一、我们使用指针可能存在的问题二、把资源放进对象中,利用析构函数自动释放资源三、智能指针析构函数内做delete 而不是 delete[]总结:1、为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。2、两个常被使用的RAILclasses分别是tr1:...原创 2019-05-29 19:29:34 · 108 阅读 · 0 评论 -
条款12:复制对象时勿忘其每一个成分
本条款要我们注意:编写一个copying函数时,请确保复制所有的local成员变量。调用所有base classes内的适当copying函数。令copy 赋值操作符调用copy构造函数,或者反方向都是不合理的:总结:1、Copying函数应该确保复制“对象内的所有成员变量”及“所有 base class 成分”。2、不要尝试以某个 c...原创 2019-05-28 17:32:37 · 134 阅读 · 0 评论 -
条款11:在operator = 中处理“自我赋值”
一、自我赋值现象由于指针和引用的存在,还有多态,使得存在自我赋值的现象。二、自我赋值存在的隐患这里存在的问题是 pb 和 rhs指向同一个对象的时候,,,,,,仍然存在隐患:new失败怎么办?pb指向一块被删除的内存。行得通,但是效率不高三、copy and swap技术这个技巧在《C++ primer》中详细有介绍。...原创 2019-05-28 17:14:08 · 301 阅读 · 0 评论 -
条款10: 令operator = 返回一个 reference to *this
赋值操作符返回reference to *this,不要问为什么原创 2019-05-28 16:56:56 · 126 阅读 · 0 评论 -
条款09:绝不在构造和析构过程调用virtual函数
本条款核心是说:base class中构造函数中有一个虚函数,当继承类去创建一个对象的时候,基类的构造函数内的虚函数不是继承类的,而是基类的。也就是说:在base class构造期间,virtual函数不是virtual函数。二、补偿方法总结:在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derivedcla...原创 2019-05-28 11:40:15 · 158 阅读 · 0 评论 -
条款08:别让异常逃离析构函数
一、C++ 不喜欢析构函数吐出异常析构函数吐出异常,程序不是结束执行就是导致不明确的行为。二、解决办法将责任给用户:总结:1、析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。2、如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提...原创 2019-05-28 11:16:04 · 206 阅读 · 0 评论 -
条款07:为多态基类声明为virtual析构函数
本节非常重要,也是几乎所有cpp面试必问的东西。一、多态实现中,base class中的析构函数需要为 virtual 函数任何class只要带有virtual函数都几乎可以确定应该有一个virtual析构函数。如果class不含virtual函数,通常表示它并不意图被用做一个base class。当class不企图当做base class,不能令其析构函数为...原创 2019-05-28 09:34:35 · 167 阅读 · 0 评论 -
条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
本节主要是通过将copy构造函数、copy assignment操作符声明为private,进而阻止人们去调用它。然而C++11里面已经有了更好的做法 =delete来表明阻止生成。通过base class 来阻止coping动作:总结:为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为...原创 2019-05-28 08:37:04 · 117 阅读 · 0 评论 -
条款05:了解C++默默编写并调用哪些函数
第二部分条款是关于拷贝控制的。C++默认为我们编写4个函数构造函数、析构函数、拷贝构造、赋值函数。默认都是non-virtual的,除非base类里的是virtual函数。我们自己声明一个构造函数,编译器便不会创建默认构造函数了。当不能拷贝、赋值、或销毁类的成员时,类的合成拷贝控制成员就被定义为删除的。指的是 引用 和 const成员!!!...原创 2019-05-27 10:25:52 · 109 阅读 · 0 评论 -
条款04:确定对象使用前已先被初始化
一、内置类型手工初始化emm,,二、区分赋值和初始化的区别我们要尽量使用成员初值列,这样比赋值高效。三、成员初始化顺序四、“不同编译单元内定义non-local static对象”的初始化C++对定义于不同编译单元内的non-local static对象的初始化次序无明确定义。...原创 2019-05-26 22:21:38 · 148 阅读 · 0 评论 -
条款03:尽可能使用const
一、const表示被指之物是常量C++primer 第二章二、const与函数声明函数返回一个常量值,往往可以降低因客户错误而造成的意外:三、const成员函数但是,顶层const会被忽略,所以顶层const不会重载。见《C++primer》 P191mutable:四、const和non-con...原创 2019-05-26 21:41:24 · 181 阅读 · 0 评论 -
条款02:尽量以const,enum,inline替换 #define
“宁可以编译器替换预处理器”:一、宏定义的名字被编译器看不到:二、关于class常量三、宏不注重作用域四、the enum hack所以,如果我们如果不想别人获得一个指针或引用指向你的某个整数常量,enum可以帮助你约束。五、宏定义max函数的缺陷...原创 2019-05-26 00:56:03 · 162 阅读 · 0 评论