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.復制對象時勿忘其每一個成員
特別是在給派生類寫復制時伤塌,一定要小心的復制其基類的成分
·