拷貝建構函式是一種特殊的建構函式:
const Object(類名)& other
class Object
{
public:
Object(const Object& other);
};
作用:以一個物件爲藍本,來構造另一個物件,a是b的一個拷貝/備份,兩者內容完全相同。
Object b;
Object a(b); //或寫成 Object a = b;
拷貝建構函式的呼叫,不顯式呼叫,三種情況:定義物件,動態建立物件,函數的傳值呼叫
Object a;
Object b(a); Object b = a;
Object a;
Object* p = new Object(a);
void Test(Object obj);
上面爲構造(建立物件時候給初始值,拷貝建構函式被呼叫),區分賦值,下面 下麪爲賦值(不會呼叫拷貝建構函式)
Object a(1,2);
Object b;
b =a;
在拷貝建構函式,可以存取參數物件的任意成員,因爲是同類,存取不受限制
Object (const Object& other)
{
this->a = other.a;
this->b = other.b;
}
預設拷貝建構函式,當沒有寫,編譯器會提供一個預設的,將每一個成員逐個拷貝。除非必要,不用新增拷貝建構函式。
寫拷貝建構函式的時候注意的兩點:
只有在下面 下麪情況才需要自己新增拷貝建構函式:深度拷貝和淺拷貝
class Text
{
public:
Text(const char* str)
{
//申請一塊記憶體,儲存此字串
m_size = strlen(str)+1;
m_buf = new char[m_size];
strcpy(m_buf,str);
}
~Text()
{
//釋放此字串
delete [] m_buf;
}
private:
int m_size;
char* m_buf;
}
淺:
Text(const Text& other)
{
m_size = other.m_size;
m_buf = other.m_buf; //這個只是把這個的地址指向了要拷貝的地址,不行
}
深度:
Text(const Text& other)
{
m_size = other.m_size;
m_buf = new char[m_size];
strcpy(m_buf,other.m_buf); //這個只是把這個的地址指向了要拷貝的地址,不行
}