![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
effective c++
chasinguu
这个作者很懒,什么都没留下…
展开
-
条款1
c++包含多种类型编程语言:1.以c为基础2.object-oriented c++ 面向对象3.template c++ 泛型编程4.STL原创 2019-07-30 20:07:09 · 199 阅读 · 0 评论 -
条款13:以对象管理资源
1.把资源放进对象中,在析构函数中把内存释放掉2.获得资源后立刻放进管理对象(在构造函数中操作)3.使用智能指针可以避免内存泄漏原创 2019-08-02 09:28:14 · 66 阅读 · 0 评论 -
条款12: 复制对象时勿忘其每一个成分
1.复制所有local成员变量2.调用所有base classes内适当的copying函数。3.不能在赋值拷贝函数内调用拷贝构造函数,反过来也不可以。相同机能应该放入第三个函数中,被两个拷贝函数调用。...原创 2019-07-31 20:21:16 · 87 阅读 · 0 评论 -
条款11:在operator=中处理“自我赋值”
1.如果在赋值中传入的是自己本身,需要注意先判断是否是自己,如果是,则返回,以防止两个都销毁,不能赋值。2.或者可以先用一个变量把自身存起来,先不删除空间,申请新空间后如果出错,也不会没有空间,之后再删除临时变量,可以保证安全性。3.或者可以用数据交换的方法,把传入和自身数据交换。...原创 2019-07-31 11:50:45 · 85 阅读 · 0 评论 -
条款10:令operator=返回一个reference to *this
1.为了能够连续赋值,赋值相关运算都应该写为reference to *this的形式。原创 2019-07-31 11:35:28 · 130 阅读 · 0 评论 -
条款9:绝不在构造和析构过程中调用virtual函数
1.基类的构造函数比派生类的构造函数早运行,如果为虚,转到派生类,而派生类还没有构造,会出现问题。2.派生类在基类的构造期间,对象的类型是基类类型...原创 2019-07-31 11:32:32 · 79 阅读 · 0 评论 -
条款8:别让异常逃离析构函数
1.c++不喜欢在析构函数中吐出异常,因为如果要析构一个vector 类型的对象,每一个类的对象都要析构,则会重复抛出异常。2.需要在析构函数中自己对异常进行回收,如果客户需要对异常做出反应,应该提供普通函数执行,而不是在析构函数中。...原创 2019-07-31 11:10:44 · 65 阅读 · 0 评论 -
条款7:为多态基类声明virtual析构函数
1.如何虚基类的析构函数不声明为虚,则在释放的时候,子类并不会释放掉,而只是释放父类的空间。因此要把含有虚函数的基类的析构函数也声明为虚。2.如果基类没有虚函数,则析构函数不能为虚,否则会增大对象的空间,浪费空间。...原创 2019-07-31 11:01:16 · 68 阅读 · 0 评论 -
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
1.可以把拷贝构造函数或赋值构造函数声明为private,则可以禁止调用这两个默认函数,并且没有这两个函数的实现,可以禁止member函数和friend函数。2.也可以声明一个基类,让目标类私有继承这个基类,并且不写赋值和拷贝构造函数,则调用时就会报错。...原创 2019-07-30 20:44:17 · 127 阅读 · 0 评论 -
条款5:了解c++默默编写并调用哪些函数
1.构造类时默认生成default构造函数,copy构造函数,copy assignment,和一个析构函数2.如果自己构建了这些函数,编译器不会再构建默认的函数。3.如果要包含reference成员或const 成员的class内支持赋值操作,必须自己定义赋值构造函数,...原创 2019-07-30 20:34:55 · 76 阅读 · 0 评论 -
条款4:确定对象被使用前已先被初始化
由于模式不同(条款1),初始化后的初始值可能不一样,因此需要在使用对象之前进行初始化。!区分清楚赋值和初始化。初始化应该在默认构造函数被调用时(使用成员初始化列表).const 或引用必须初始化。父类比子类更早初始化,初始化列表的初始化顺序为成员变量的声明顺序。为避免在一个类的初始化时,要用到另一个模块的对象,而这个对象不一定已经初始化了。可以用一个函数创建对象,并声明为static,...原创 2019-07-30 20:04:31 · 108 阅读 · 0 评论 -
条款3:尽可能使用const
const在星号左边表示被指物是常量,在星号右边说明指针自身是常量,在两边说明两者都是常量。const vector::iterator iter类似const T* 即迭代器不可改变,所指之物可以改变。vector::const_iterator 类似T* const 即迭代器可以改变,所指之物不可改变。const在函数前,修饰返回值时,表示返回值是const的,可以防止手误打错为(a *...原创 2019-07-30 20:05:50 · 77 阅读 · 0 评论 -
条款2:尽量以const,enum,inline替换#difine
#define 不安全,如果发生错误,调试信息中不会显示定以后的变量,而是原始变量,可以用static const或者const代替。enum back:enum { NumTurns= 5 };可以防止其他的取地址或引用,更类似于#define,但是更加安全。形似函数的宏最好用inline函数替代。...原创 2019-07-30 20:06:07 · 92 阅读 · 0 评论 -
条款14:在资源管理类中小心copying行为
两种选择:1.禁止复制2.采用引用计数法原创 2019-08-14 20:46:23 · 185 阅读 · 0 评论