構造、析構、拷貝語意學
來源:程序員人生 發(fā)布時間:2015-03-18 09:35:29 閱讀次數(shù):3078次
對象的構造
無繼承下的對象構造
引子
下面是1個定義類對象的例子:
Point global;
Point foobar()
{
Point local;
Point *heap = new Point;
*heap = local;
delete heap;
return local;
}
在上面的例子中,存在3種對象:全局對象、局部對象、堆對象;這些對象的生命周期是該對象的履行期屬性。全局對象的生命周期從定義開始到程序結束;局部對象的生命周期是從定義開始到局部作用域的終止;堆對象的生命周期是從new
創(chuàng)建該對象開始到delete
該對象;
下面根據(jù)Point
類的不同聲明會表現(xiàn)出不同的行動:
與C兼容的 Plain Old Data(POD)類型:
在 POD 類型中類Point
聲明以下:
typedef struct{
float x, y, z;
}Point;
在 POD 類型中,對象的定義不會調用 constructor 和 destructor;由于對象沒有顯示的初始化操作;
抽象數(shù)據(jù)類型(ADT)
在 ADT 類型中類Point
聲明以下:
class Point{
public:
Point(float x = 0.0, float y = 0.0, float z = 0.0)
:_x(x), _y(y), _z(z)
{}
private:
float _x, _y, _z;
}Point;
在 ADT 類型中,創(chuàng)建對象時編譯器會調用顯示定義的構造函數(shù);
繼承體系下的對象構造
繼承體系下構造函數(shù)的調用時,編譯器會根據(jù)繼承的情況進行以下的擴充操作:
- member initialization list 中的 data member 會在構造函數(shù)本體中進程初始化操作,并以 members 的聲明順序進行;
- 若某個 member 沒有在 member initialization list 中,但是該 member 存在 default constructor,則該 member 的 default constructor 會被調用;
- 若 class object 存在 virtual table pointer(vptr),則必須設置 vptr 的初值,使其指向適當?shù)?virtual table;
- base class constructors 都會被調用,調用順序為 base class 的聲明順序;
- 若 base class 在 member initialization list 中,則任何顯示指定的參數(shù)都應當傳遞過去;
- 若 base class 不在 member initialization list 中,且 base class 存在 default constructor,則會調用該 default constructor;
- 若 base class 是多重繼承下的第2或后繼的 base class,則需調劑 this 指針;
- 所有 virtual base class constructors 都會被調用,從左到右,從深到淺:
- 若 class 在 member initialization list 中,則任何顯示指定的參數(shù)都應當傳遞過去;若 class 不在 member initialization list 中,且 class 存在 default constructor,則會調用該 default constructor;
- class 中的每個 virtual base class subobject 的偏移位置必須在履行期可被存??;
- 若 class object 是最底層的 class,其 constructor 可能會被調用;
對象的復制語意學
1個 class 在以下情況會合成默許的 從copy assignment operator:
- 當 class 內含1個具有 copy assignment operator 的 member object;
- 當 class 繼承自1個具有 copy assignment operator 的 base class;
- 當 class 聲明有 virtual functions;
- 當 class 派生自 virtual base class(es);
對象析構語意學
只有在 class 內含1個具有 destructor 的 member class 時,編譯器才會自動合成1個 destructor。
由程序員定義的 destructor 被擴大的方式類似構造函數(shù)被擴大的方式,但是順序相反:
- 如果對象內帶1個 vptr,那末首先重設相干的virtual table;
- 析構的函數(shù)本體現(xiàn)在被履行,也就是說 vptr 會在程序員的代碼履行前被重設;
- 如果類具有成員類對象,且該成員類對象具有析構函數(shù),那末他們會以其聲明順序的相反順序被調用;
- 如果有任何直接的非虛基類具有析構函數(shù),他們會以其聲明順序的相反順序被調用;
- 如果有任何虛基類具有析構函數(shù),而當前討論的這個類是最尾真?zhèn)€類, 那末他們會以其原來的構造順序的相反順序被調用;
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈