5.C++默默編寫并調(diào)用的函數(shù)
class Empty{
public:
//Empty(){}
//Empty(const Empty& rhs){}
//~Empty(){}
//Empty& operator=(const Empty&rhs){}
};
6.若不想使用編譯器自動生成的函數(shù)就要明確拒絕
為了駁回編譯器自動提供的功能,可以將相應(yīng)的成員函數(shù)聲明為private并且不予實現(xiàn),比如創(chuàng)建一個阻止copying的base class。
class Uncopyable()
{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncapyable &);
Uncopyable& operator=(const Uncopyable &);
}
7.為多態(tài)基類聲明virtual析構(gòu)函數(shù)
當派生類經(jīng)由一個基類指針被刪除時,如果基類是一個非虛的析構(gòu)函數(shù),結(jié)果就是對象中的派生成分沒被撤銷。
- 如果class帶有任何的virtual函數(shù),它就應(yīng)該擁有一個virtual析構(gòu)函數(shù)
- 如果class的設(shè)計目的不是作為基類,或不是為了具備多態(tài)性,就不該聲明virtual 析構(gòu)函數(shù),因為virtual table pointer會加大內(nèi)存開銷。
8.別讓異常逃離析構(gòu)函數(shù)
析構(gòu)函數(shù)絕對不要吐出異常。如果一個被析構(gòu)函數(shù)調(diào)用的函數(shù)可能拋出異常,析構(gòu)函數(shù)應(yīng)該吞下他們或結(jié)束程序。
9.決不在構(gòu)造和析構(gòu)過程中調(diào)用virtual函數(shù)
因為這類調(diào)用從不下降至派生類。實例化一個派生類時,首先調(diào)用的是基類的構(gòu)造函數(shù),若這時構(gòu)造函數(shù)調(diào)用了一個virtual函數(shù),則這個肯定是調(diào)用基類里的函數(shù),而不是派生類的,因為這時派生類部分還沒有初始化。這樣就會造成誤解 。
10,令賦值操作符返回一個reference to *this
class Widget{
public:
Widget & operator=(const Widget& rhs)
{...
return * this}
};
11.在賦值操作符中處理自我賦值問題
如果不進行證同測試,在delete指針的時候有可能把自己也刪掉了,解決辦法可以是記住原先的pb,先復制,再刪除..
class Bitmap {};
class Widget {
...
private:
Bitmap* pb;
};
Widget& Widget::operator=(const Widget& rhs)
{
if(this == &rhs) return *this;
delete pb;
pb = new Bitmap(*rhs.pb);//用rhs.pb指向的內(nèi)容初始化一個Bitmap類對象
return *this;
}
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrigin = pb;
pb = new Bitmap(*rhs.pb);//用rhs.pb指向的內(nèi)容初始化一個Bitmap類對象
delete pOrigin;
return *this;
}
12.復制對象時勿忘其每一個成員
特別是在給派生類寫復制時,一定要小心的復制其基類的成分
·