《C/C++學習指南》語法篇—筆記 (二十、拷貝建構函式)

2020-08-08 20:33:18

《C/C++學習指南》語法篇—筆記 (二十、拷貝建構函式)

拷貝建構函式是一種特殊的建構函式:

  • 是構造韓叔叔,函數名的類名、沒有返回值
  • 特殊的建構函式,參數形式的固定的 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);  //這個只是把這個的地址指向了要拷貝的地址,不行
}