物件的拷貝:
普通型別的物件拷貝:
int ntest = 88;
int ntest1 = ntest;
int ntest2( ntest );
類物件的拷貝:
對於類物件的拷貝來說,相同型別的類物件使通過拷貝建構函式來實現的。物件的拷貝分為淺拷貝和深拷貝。
拷貝建構函式:
拷貝建構函式的名稱必須和類名稱一致,引數只有乙個本型別的引用變數,該引數必須是const型別,用來確保該引數物件再拷貝建構函式內不能被改變。
拷貝建構函式格式如下:
ctest( const ctest& cvalue){}
當物件需要被拷貝時,就會呼叫拷貝建構函式,如果這個類中沒有生命拷貝建構函式的話,編輯器會生成乙個預設拷貝建構函式,該預設拷貝建構函式完成物件之間的淺拷貝。
會呼叫拷貝建構函式的情況:
物件以值傳遞的方式傳入函式體內。
物件以值傳遞的方式從函式中返回。
物件需要通過另外乙個物件進行初始化。
淺拷貝和深拷貝:
淺拷貝:
直接為資料成員賦值即可。
如果類物件中有指標型別的成員,但是沒有分配專門的記憶體,這時候淺拷貝是會帶來問題的。
**如下:
cshallowreplication.h檔案中
#include
// 淺拷貝
class cshallowrep
void show( )
void setname( char* pvalue )
void setage( int nvalue )
public:
char* pname;
int nage;
};
main.cpp檔案中
#include
#include
using
namespace
std;
#include "shallowreplication.h"
#include "deepreplication.h"
void main()
在啟動程式的時候會有報錯:
根據報錯資訊可以知道。程式試圖將」xiaoming」拷貝到pname指向的位置,而pname指向的位置並不是經過系統分配來的,是隨機的位址值,pname是乙個野指標。這種行為是不被接受的。
深拷貝:
在建構函式中,為指標型別的成員,分配專門的記憶體。
在類的物件發生拷貝過程的時候,資源重新分配了,則這個過程就是深拷貝。
**如下:
cdeepreplication.h檔案中
#include
// 深拷貝
class cdeeprep
cdeeprep(const cdeeprep& rdeeprep)
~cdeeprep()
void show( )
void setname( char* pvalue )
void setage( int nvalue )
public:
char* pname;
int nage;
};
main.cpp檔案中
#include
#include
using
namespace
std;
#include "shallowreplication.h"
#include "deepreplication.h"
void main()
執行結果如下:
C 淺拷貝和深拷貝
class test test const test t val new int t.val test private int val 現在定義兩個物件,test t1 9 test t2 t1 如果你不提供copy建構函式 注釋掉的那個 那麼t1和t2的成員 val指向同乙個物件,當析構的時候,同...
c 深拷貝和淺拷貝
深拷貝和淺拷貝 ca const ca c 就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特別的建構函式,函式的名稱必須和類名稱一致,他的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如 類x的拷貝建構函式的形式為x x x 當用乙個已初始化過了的自定義類型別物件...
c 深拷貝和淺拷貝
對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...