Mixture

身未动,心已远

导航

2014年4月6日 #

effective c++ 10: Have assignment operators return a reference to *this

摘要: 为了实现连锁赋值,赋值操作符需要返回一个reference指向操作符的左侧实参。就像这样:class Widget {public: ... Widget& operator=(const Widget& rhs) { ... return *this; } ...};除了标准赋值,任何赋值相关的运算都应当返回一个reference to *this。 阅读全文

posted @ 2014-04-06 23:39 parapax 阅读(140) 评论(0) 推荐(0) 编辑

effective c++ 9: Never call virtual functions during construction or destruction

摘要: 因为base class的构造函数的执行早于derived class,所以如果在构造函数里调用virtual函数,很可能derived class部分的成员变量还没初始化。并且在derived class对象的base class构造期间,对象是被看做一个base class对象的,所以显然调用virtual函数不会达到想象的效果。比较好的方式是把原本在构造函数中调用的virtual函数改为non-virtual,并通过derived lass构造函数传递信息给baseclass构造函数。比如:class Transaction {public: explicit Transactio... 阅读全文

posted @ 2014-04-06 23:33 parapax 阅读(190) 评论(0) 推荐(0) 编辑

effective c++ 8: Prevent exceptions from leaving destrctors

摘要: 析构函数的异常会导致不确定行为。比如说我要有若干个自定义类的对象存在vector里,但是在析构函数里销毁这个vector第一个元素的时候发生了异常,那后面的元素可能无法正确销毁从而导致内存泄露。解决析构函数抛异常的方法有这样两种:1. 一旦抛异常就结束程序(catch里abort()),这样避免了异常继续传播。2. 吞下异常(catch里记录异常原因等等)。但是更好的方式是把可能导致异常的操作写在析构函数外面的普通函数里,这样就有机会去处理这个可能的异常。 阅读全文

posted @ 2014-04-06 23:18 parapax 阅读(145) 评论(0) 推荐(0) 编辑

effective c++ 7: Declare destructors virtual in polymorphic base classes

摘要: 比如我们有个factory函数,这个函数返回一个base class的指针,指向derived class对象。在使用完毕后要正确的删除这个factory返回的每个对象。但是假如derived class对象通过一个base的指针删除,但是这个base class的析构函数是non-virtual的话,这个对象的derived部分一般是无法被销毁的。对于上面这种带有多态性质的base class应该声明一个virtual析构函数。任何class只要带有virtual函数都应该有个virtual析构函数。但是如果一个class不含virtual函数的话就不要随便乱写virtual析构函数了,那样 阅读全文

posted @ 2014-04-06 23:08 parapax 阅读(178) 评论(0) 推荐(0) 编辑