91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

西林县| 阳泉市| 临颍县| 大同县| 禹州市| 洞口县| 新干县| 鞍山市| 康乐县| 钦州市| 涟水县| 准格尔旗| 开原市| 洛川县| 龙泉市| 庄浪县| 靖江市| 通江县| 成都市| 六盘水市| 凤阳县| 南昌市| 泸水县| 吴旗县| 北京市| 和顺县| 应用必备| 西青区| 汉沽区| 梨树县| 河津市| 米脂县| 桐柏县| 肇东市| 巴楚县| 马关县| 金山区| 绍兴市| 永宁县| 利津县| 乃东县|