C++學習——copy構造函數及淺拷貝和深拷貝

作爲面嚮對象語言,類的使用必不可少,構造參數自然也就無可避免。下面總結一下C++中的copy構造函數,在這之前需要了解淺拷貝和深拷貝的區別。

copy構造函數

copy構造函數的形式:
<span style="font-size:18px;">//copy構造函數,形參的實行必須是const Type& name
	classType (const classType& cs);</span>

copy構造函數的作用是使用一個對象去初始化另外一個對象,如果不寫系統會自動提供一個copy構造函數,但這個copy構造函數只是進行淺拷貝,當類中的屬性是複雜類型是會出現一些意料之外的問題。
class Name{
private:
	char *p;
	int len;
public:
	Name(char* myp)
	{
		len = strlen(myp);
		p = (char*)malloc(len + 1);
		strcpy(p, myp);
	}

	//copy構造函數
	Name(const Name &myName)
	{
		len = strlen(myName.p);
		p = (char*)malloc(len + 1);
		strcpy(p, myName.p);
	}

	~Name()
	{
		if(p != NULL){
			free(p);
			p = NULL;
			len = 0;
		}
	}
};
對於上面這個類,如果沒有自己的copy構造函數,當進行下面這個操作,在析構這兩個對象時程序會出現coredump;
Name name1("jhsdgfh");
Name name2 = name1;
這是因爲/調用C++提供的默認copy構造函數,只是進行淺拷貝,只是將name1內的值拷貝一份放到name2棧內存中,兩個對象中的p指針所指向的地址都是同一個塊地址。而在析構時析構name2後,p所指向的內存空間已經被析構。再析構name1是,由於p所指的內存空間已被析構,所以出現coredump
所以要自己寫copy構造函數,完成深拷貝,在初始化一個對象時另開闢出一塊單獨存儲空間存放;這樣就避免上述問題的出現。
PS:有點繞希望日後自己還能看的明白


發佈了29 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章