effective c++ 总结(二) 类的设计

1.默默生成的函数。

     C++为类默默生成了构造,拷贝构造,赋值与析构四个函数。

     class CTest{

     public:

          CTest(){…}//默认生成空参数构造。

          ~ CTest(){…}//默认生成非virtual的析构

          CTest(const CTest & ct){…}//默认生成拷贝构造,传入引用且不可修改

          Ctest& operator=(const Ctest&ct){...}//默认生成赋值函数传入引用且不可修改

     };

2.防止默认,给出拒绝。

     对于某些默认生成的函数不想使用时将其放入private区。

3.virtual在析构的使用。

     a.如果希望base-class作为指针或引用进行多态,则将析构变为virtual

      b.base-class不进行多态,则析构可以不为virtual

4.防止异常逃离析构。

      析构函数执行时期为对象销毁时期,对象销毁在delete或作用域结束时,则析构函数的调用处繁多,不可能在每一处都进行异常捕获,则应将异常吞入,并转交给异常处理函数统一处理或结束程序。

5.避免在构造与析构中调用virtual函数。

     a.由于virtual函数的动态调用依靠virtual的函数表,在生成子类时先调用父类的构造,则父类构造过程中virtual函数表内无子类信息,则父类调用virtual没任何效果。

     b.析构时先将子类的信息擦除,则父类的析构函数调用virtual函数时,virtual函数表内的子类信息已被擦除,则不会多态的调用。

6.连续赋值让operator=返回*this

     CTest&operator=(const CTest& ct){

              …

              return *this;//返回自身引用

     };

7.处理自我赋值。

     a.自身毁坏了自身。

     CTest &operator=(const CTest& ct){//自己向自己赋值,结果将自己的区域删除了

          delete p;//p区指向清除

          p=ct.p;//(浅拷贝)将清除区域的地址给p

          return *this;//返回自身

     };

     b.对自身增强了保护。

     CTest &operator=(const CTest& ct){//增强自我保护

          if(this==&ct){//判断是否自身

               return*this;//返回自身引用

          }

          delete p;//p区指向清除

          p=ct.p;//(浅拷贝)将清除区域的地址给p

          return *this;//返回自身

     };

     c.对异常的出现进行防范

     CTest &operator=(const CTest& ct){//利用新对象赋值

          char *bp=p;//对原地址进行保护

          p=createNew(ct.p);//(深拷贝)利用ct.p创建副本

          delete p;//删除原先区域

          return *this;//返回自身

     };

     CTest &operator=(const CTest& ct){//增强自我保护

          CTest temp(ct);//创建可由系统自动销毁的副本

          swap(temp);//交换内容

          return *this;//返回本体

     };

8.复制对象切勿遗忘每个成分。

     a.在复制子类成员前先将父类成员先复制。

     b.设置公有的copying函数,让拷贝和赋值函数调用,而不是他们互相调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值