中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的拷貝構造函數是什么

發布時間:2022-03-21 11:22:53 來源:億速云 閱讀:125 作者:小新 欄目:開發技術

這篇文章主要介紹了C++的拷貝構造函數是什么,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

拷貝構造函數用以將一個類的對象拷貝給同一個類的另一個對象,比如之前學習過的string類:

string s1;
string s2 = s1;

一般情況下的拷貝構造函數:

class A
{
private:
	int n;
	double d;
	char s;
public:
	A(const A& a);
};
A::A(const A& a)
{
	this->n = a.n;
	this->d = a.d;
	this->s = a.s;
}

即按照數據類型開辟一段內存空間用以存放拷貝進來的對象的數據。需要注意的是必須傳遞進來的是類的引用,如果是按值傳遞,將會生成一個臨時的類的對象a,并將傳遞進來對象拷貝給臨時對象,其實就是又調用了拷貝構造函數。

默認拷貝構造函數:

如果用戶沒有自定義拷貝構造函數,又使用了對象的拷貝,則編譯器會自動生成一個默認構造函數,格式同上。

淺拷貝和深拷貝:

大多數情況下,使用默認構造函數就可以完成對象的拷貝(淺拷貝),但是當對象中有諸如指針、動態數組等數據類型時使用默認構造函數則可能出錯,此時需要用戶自定義拷貝構造函數(深拷貝),以下是一個例子,首先是沒有自定義拷貝構造函數的情況:

class A
{
private:
	char* str;
	int len;
public:
	A(const char* s);
	~A();
	//A(const A& a);
};
A::A(const char* s)
{
	len = strlen(s);
	str = new char[len+1];
	strcpy(str, s);
	cout << str << " object construct." << endl;
}
A::~A()
{
	cout << str << " deleted." << endl;
	delete[]str;
}
//A::A(const A& a)
//{
//	this->len = a.len;
//	this->str = new char[a.len+1];
//	strcpy(str, a.str);
//}

調用函數:

int main(void)
{
	A a1("Hello");
	A a2 = a1;
	return 0;
}

運行結果:

Hello object construct.
Hello deleted.
葺葺葺葺葺葺葺葺攐? deleted.

這是因為在對象復制的時候,由于編譯器生成了默認拷貝構造函數,只是單純的將a1中指針str的值賦值給a2中的指針str,導致a2的生命周期結束時調用析構函數將str指向的內存空間內容釋放掉了,于是a1生命周期結束時調用析構函數釋放掉的內存中的內容就是無意義的字符了。

去掉注釋后的正確寫法:

class A
{
private:
	char* str;
	int len;
public:
	A(const char* s);
	~A();
	A(const A& a);
};
A::A(const char* s)
{
	len = strlen(s);
	str = new char[len+1];
	strcpy(str, s);
	cout << str << " object construct." << endl;
}
A::~A()
{
	cout << str << " deleted." << endl;
	delete[]str;
}
A::A(const A& a)
{
	this->len = a.len;
	this->str = new char[a.len+1];
	strcpy(str, a.str);
}

調用函數同上。

運行結果:

Hello object construct.
Hello deleted.
Hello deleted.

這里自定義了拷貝構造函數,申請了一塊新的內存空間來存放拷貝進來的字符串,因此釋放時就不會出錯了。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++的拷貝構造函數是什么”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

永平县| 清水县| 平利县| 大新县| 龙海市| 石棉县| 宜阳县| 阜新市| 西宁市| 济阳县| 威远县| 武义县| 崇阳县| 汉沽区| 勃利县| 珠海市| 旬邑县| 银川市| 泰来县| 沂源县| 湖口县| 偃师市| 鄂托克旗| 成都市| 宿松县| 漠河县| 泗洪县| 建瓯市| 西吉县| 邵阳县| 唐海县| 那曲县| 京山县| 天水市| 庄浪县| 白城市| 昌黎县| 峡江县| 邵东县| 页游| 浮山县|