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 }
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 }