Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3011513
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: C/C++

2013-07-16 11:08:12

   今天继续Scott的神作《Effective C++》的第二章:构造/析构/赋值运算
Item5. 了解C++默默编写并调用哪些函数
   当定义个类时,如果没有明确定义constructor和destructor,则编译器会使用默认函数创建constructor/destructor/copy constructor/copy assignment函数,其中感觉新鲜的是复制构造函数和复制赋值运算符。复制构造函数和复制赋值运算符的使用类似下面这样:
   class GamePlayer gp1;
   class GamePlayer gp2(gp1);
   class GamePlayer gp3 = gp2;
   对于复制赋值运算符需要注意,对于含引用或者const成员的类对象不能使用默认的复制赋值运算符,因为C++不允许引用改指不同对象,const成员也不能被重新赋值。此外,private层次的赋值运算符派生类无权调用。

Item6. 若不想使用编译器自动生成的函数,就该明确拒绝
   如果想禁止C++自带的默认copy构造函数和copy赋值运算符,则可以将它们统统定义为private层次且置于空定义。
item7. 为多态基类声明virtual析构函数
   当通过基类的接口来调用派生类对象实现多态时,必须相应定义基类的的destructor为virtual属性,否则只会调用基类的destructor导致派生类部分内存泄漏。如果不是以上的情况,不要使用virtual destructor。
item8. 别让异常逃离虚构函数
   析构函数中发生异常时(如:close()异常)如果不做处理会导致程序终止或导致不可知的行为,为了避免不可知行为的危害,在析构函数中使用try-catch方法捕捉异常予以终止程序。
item9. 绝不在构造和析构过程中调用virtual函数
   不要再类的constructor和destructor中调用虚函数,因为这类调用从来不会下降到derived class层。
item10. 令operator= 返回一个reference to *this
   Widget& operator= (const Widget& rhs)
{
    ... ...
    return *this;
}
item11. 在operator= 中处理“自我赋值”
item12. 复制对象时勿忘其每一个成分
   Coping函数应该确保复制源对象内所有成员变量及所有基类成分;不要尝试在某个coping函数实现另一个coping函数,应该将共同技能放入第三个函数中,并由两个coping函数共同调用。

阅读(2006) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~