Effective C++ 学习历程002

Effective C++ 学习历程002

      既然开始了,那就继续吧,每一个单元包含其中的5个条款。
主要内容就是代码的了,但是代码中也包含了一些注释。而这些
代码都是为各自对应的条款服务的,有些可以值得推敲。希望对
你有些帮助。ok,谢谢!
  1  //  ====================================================================
  2  //  --- 条款06:若不想实验编译器自动生成的函数,就该明确拒绝
  3  //  注意:
  4  //  1    为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private or protected
  5  //       并且不予实现。使用像Uncopyable这样的base class 也是一种做法
  6  namespace  testItem06
  7  {
  8       class  Uncopyable
  9      {
 10       protected :
 11          Uncopyable() {}
 12           ~ Uncopyable() {}
 13       private :
 14          Uncopyable( const  Uncopyable & ) ;
 15          Uncopyable &   operator   =  ( const  Uncopyable & ) ;
 16      } ;
 17       class  HomeForSale :  private  Uncopyable
 18      {  //  
 19      } ;
 20  } // namespace testItem06
 21  //  ====================================================================
 22  //  --- 条款07:为多态基类声明virtual 析构函数 
 23  //  注意:
 24  //  1    polymorphic(多态的)base class 应该声明一个virtual 析构函数。
 25  //       如果class带有任何virtual函数,她应该拥有一个virtual析构函数
 26  //  2    class 的设计目的如果不是作为base class使用,或不是为了具备多态性
 27  //       就不应该声明一个virtual 析构函数 
 28  //  3
 29  namespace  testItem07
 30  {
 31       class  TimeKeeper
 32      {
 33       public :
 34          TimeKeeper() {};
 35           virtual   ~ TimeKeeper() {};
 36           //  should virtual for delete pBase ; // destroy exactly
 37           //  
 38      } ;
 39       class  AtomicClock :  public  TimeKeeper{ } ; //  
 40       class  WaterClock :  public  TimeKeeper{ } ; //  
 41       class  WristClock :  public  TimeKeeper{ } ; //  
 42       class  AWOV
 43      {
 44       public :
 45           virtual   ~ AWOV()  =   0  ;
 46      } ;
 47      AWOV:: ~ AWOV() {}  // must has a defalut definition
 48  }
 49  //  ====================================================================
 50  //  --- 条款08:别让异常逃离析构函数 
 51  //  注意:
 52  //  1    析构函数绝对不要吐出异常。如果一个呗析构函数调用的函数可能抛出异常,
 53  //       那么在析构函数内应该捕捉任何异常,然后吞下它们(不传播)或是结束程序
 54  //  2    如果客户需要对某个操作函数运行期抛出的异常做出反应,那么class 应该提供
 55  //       一个普通的函数(而非在系后函数中)执行该操作 
 56  //  3
 57  namespace  testItem08
 58  {
 59       class  DBConnection
 60      {
 61           //  .
 62       public :
 63           void  start() {}
 64           void  close() {}
 65           //  .
 66      } ;
 67       class  DBConn
 68      {
 69       private :
 70           bool    bClose_ ;
 71          DBConnection db ;
 72       public :
 73           void  start()  //
 74          {
 75              db.start() ;
 76              bClose_  =   false  ;
 77          }
 78           void  close()  //  better .note 2
 79          {
 80              db.close() ;
 81              bClose_  =   true  ;
 82          }
 83           ~ DBConn() //  better .
 84          {
 85               if ( ! bClose_)
 86              {
 87                   try
 88                  {
 89                      db.close() ;
 90                  }
 91                   catch ()
 92                  { //  better .note 1
 93                      handleError() ; //  or: db.close() again 
 94                      bClose_  =   false  ;
 95                  }
 96              }
 97          }
 98       protected :
 99           void  handleError() {}  //  
100      } ;
101  } // namespace testItem08
102  //  ====================================================================
103  //  --- 条款09:绝不vuz构造和析构过程中调用virtual 函数 
104  //  注意:
105  //  1    在构造和析构过程中不要调用virtual函数,因为这类调用从不下降只derived class
106  //       (比起当前执行构造和析构函数的那一次 class)
107  //  2
108  //  3
109  namespace  testItem09
110  {
111       class  Transaction_Bad
112      {
113       private :
114           int      value_ ;
115       public :
116          Transaction_Bad() ;
117           virtual   void  logTransaction_Bad()  const   =   0  ;
118      } ;
119      Transaction_Bad::Transaction_Bad()
120      {    //  
121           // logTransaction_Bad() ;  //  warn !!! or error
122      }
123       void  Transaction_Bad::logTransaction_Bad()  const
124      { std::cout  <<   "   virtual void Transaction_Bad::logTransaction_Bad() const\n "  ; }
125       class  BuyTransaction_Bad :  public  Transaction_Bad
126      {
127       public :
128           // BuyTransaction_Bad():Transaction_Bad() {}
129           virtual   void  logTransaction_Bad()  const
130          { std::cout  <<   "   virtual void BuyTransaction_Bad::logTransaction_Bad() const\n "  ; }
131      } ;
132       class  SellTransaction_Bad :  public  Transaction_Bad
133      {
134       public :
135           // BuyTransaction_Bad():Transaction_Bad() {}
136           virtual   void  logTransaction_Bad()  const
137          { std::cout  <<   "  virtual void SellTransaction_Bad::logTransaction_Bad() const\n "  ; }
138      } ;
139       //  --------------
140       class  Transaction_Good
141      {
142       public :
143           explicit  Transaction_Good( const  std:: string &  logInfo)  ;
144           void  logTransaction_Good( const  std:: string &  logInfo)  const   ; // non-virtual
145      } ;
146      Transaction_Good::Transaction_Good( const  std:: string &  logInfo)
147      {
148           //  
149          logTransaction_Good(logInfo) ;  //  warn !!!
150      }
151       void  Transaction_Good::logTransaction_Good( const  std:: string &  logInfo)  const
152      {
153          std::cout  <<   "  void Transaction_Good::logTransaction_Good(const std::string& logInfo) const\n "
154                     <<   "  logInfo:  "   <<  logInfo  <<   " \n "  ;
155      }
156       class  BuyTransaction_Good :  public  Transaction_Good
157      {
158       private :
159           static   string  createLogStr( int  index)
160          {  return   "  static string BuyTransaction_Good::createLogStr(int index) "  ; }
161       public :
162          BuyTransaction_Good( int  index):Transaction_Good(createLogStr(index))
163          {}  //  
164           virtual   void  logTransaction_Good()  const
165          { std::cout  <<   "  virtual void BuyTransaction_Good::logTransaction_Good() const\n "  ; }
166      } ;
167       class  SellTransaction_Good :  public  Transaction_Good
168      {
169       private :
170           static   string  createLogStr( int  index)
171          {  return   "  static string SellTransaction_Good::createLogStr(int index) "  ; }
172       public :
173          SellTransaction_Good( int  index):Transaction_Good(createLogStr(index))
174          {}  //  
175           virtual   void  logTransaction_Good()  const
176          { std::cout  <<   "  virtual void SellTransaction_Good::logTransaction_Good() const\n "  ; }
177      } ;
178  } // namespace testItem09
179  //  ====================================================================
180  //  --- 条款10:令operator= 返回一个 referance to *this
181  //  注意:
182  //  1    令赋值(assignment)操作符返回一个 reference tio *this 
183  namespace  testItem10
184  {
185       class  Widget
186      {
187       private :
188           int  value_ ;
189       public :
190           // Widget():value_(0) {}  //   or remove
191          Widget( int  v = 0 ):value_(v) {}
192          Widget &   operator   =  ( const  Widget &  rhs) ;
193          Widget &   operator   +=  ( const  Widget &  rhs) ;
194           void  printW()
195          { std::cout  <<   "  Widget::value_:  "   <<  value_  <<   " \n "  ; }
196           //  
197      } ;
198      Widget &  Widget:: operator   =  ( const  Widget &  rhs)
199      {
200          value_  =  rhs.value_ ;
201           return   * this  ;
202      }
203      Widget &  Widget:: operator   +=  ( const  Widget &  rhs)
204      {
205          value_  +=  rhs.value_ ;
206           return   * this  ;
207      }
208  }


你可能感兴趣的:(Effective C++ 学习历程002)