作爲面嚮對象語言,類的使用必不可少,構造參數自然也就無可避免。下面總結一下C++中的copy構造函數,在這之前需要了解淺拷貝和深拷貝的區別。
copy構造函數
<span style="font-size:18px;">//copy構造函數,形參的實行必須是const Type& name
classType (const classType& cs);</span>
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