亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

仪陇县| 阳东县| 榆树市| 绥德县| 台东县| 苏尼特左旗| 龙陵县| 余姚市| 梅河口市| 公安县| 昂仁县| 荆门市| 拜城县| 黄山市| 合川市| 昌图县| 壤塘县| 临猗县| 汶川县| 上饶县| 桦甸市| 鹤岗市| 应城市| 揭西县| 竹北市| 平江县| 丰镇市| 聂荣县| 新巴尔虎右旗| 临潭县| 高要市| 靖安县| 沈阳市| 柳林县| 宁南县| 宿松县| 平舆县| 和政县| 邵武市| 防城港市| 芜湖县|