c++編譯器預設情況下會生成拷貝建構函式和賦值操作符用於新物件的構造和賦值。拷貝建構函式和賦值操作符分為兩種:位拷貝(bitwise copy)和成員拷貝(member copy)。當c++類不展現bitwise copy semantic時不會按照預設的bitwise copy,以下四種情況不展現bitwise copy semantic
:1)如果乙個類沒有拷貝建構函式,但是含有乙個類型別的成員變數,該型別含有拷貝建構函式(不管是預設的還是自己提供的),此時編譯器會為該類合成乙個拷貝建構函式;
2)如果乙個類沒有拷貝建構函式,但是該類繼承自含有拷貝建構函式的基類,此時編譯器會為該類合成乙個拷貝建構函式;
3)如果乙個類沒有拷貝建構函式,但是該類宣告或繼承了虛函式,此時編譯器會為該類合成乙個拷貝建構函式;
4)如果乙個類沒有拷貝建構函式,但是該類含有虛基類,此時編譯器會為該類合成乙個拷貝建構函式;
以繼承虛函式為例,以下**沒有顯式實現拷貝構造和賦值操作符:
#include "stdafx.h"
#include #include using namespace std;
// not impelement copy assignment operator and copy constructor
class cbase
/*cbase(const cbase& rhs)
cbase& operator = (const cbase& rhs)*/
virtual void func()
};class cderived : public cbase
};typedef void (*func)();
int _tmain(int argc, _tchar* argv)
執行結果:
b vtable address: 20109928
d vtable address: 20109968
b vtable address: 20109928
base::func()
base::func()
press any key to continue . . .
可以看到,基類的虛函式表位址沒有被以淺拷貝(bitwise copy)的方式被子類的虛函式表位址所覆蓋,而是reset為基類的虛函式表位址,說明編譯器預設合成的拷貝建構函式和賦值操作符顯式地指定了vptr到基類的virtual table。
另外,以下**
顯式實現拷貝構造和賦值操作符:
#include "stdafx.h"
#include #include using namespace std;
// impelement copy assignment operator and copy constructor
class cbase
cbase(const cbase& rhs)
cbase& operator = (const cbase& rhs)
virtual void func()
};class cderived : public cbase
};typedef void (*func)();
int _tmain(int argc, _tchar* argv)
執行結果:
b vtable address: 20634216
d vtable address: 20634284
cbase& operator = (const cbase& rhs)
b vtable address: 20634284
cderived::func()
cbase(const cbase& rhs)
cderived::func()
press any key to continue . . .
可以看到,當我們顯示的實現拷貝構造和賦值操作符並在其中進行淺拷貝操作後,成功地將虛函式指標指向了之類的虛函式表。 深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...