溫馨提示×

溫馨提示×

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

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

C++中的拷貝構(gòu)造是怎樣的

發(fā)布時(shí)間:2022-01-17 13:35:43 來源:億速云 閱讀:143 作者:柒染 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)C++中的拷貝構(gòu)造是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

拷貝構(gòu)造函數(shù)

同一個(gè)類的對象在內(nèi)存中有完全相同的結(jié)構(gòu),如果作為一個(gè)整體進(jìn)行復(fù)制或稱拷貝是完美可行的,這個(gè)拷貝過程只需要拷貝數(shù)據(jù)成員,而函數(shù)成員是公用的(只有一份代碼);在建立對象時(shí)可用同一類的另一個(gè)對象來初始化該對象的存儲(chǔ)空間,這時(shí)所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)

例如:

class Object
{
	int value;
public:
	Object(int x = 0) :value(x) {}
	~Object() {}
	Object(Object& obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}
};
int main()
{
	Object obja(10);
	Object objb(obja);//一個(gè)對象初始化另一個(gè)對象空間,調(diào)用拷貝構(gòu)造
}

當(dāng)一個(gè)對象去初始化另一個(gè)對象空間,調(diào)用拷貝構(gòu)造;若類中沒有寫拷貝構(gòu)造,如同構(gòu)造函數(shù)與析構(gòu)函數(shù)一樣,系統(tǒng)會(huì)生成一個(gè)缺省的拷貝構(gòu)造函數(shù)

OBject(Object& obj)
{}

拷貝構(gòu)造中的引用

如果我們在寫的拷貝構(gòu)造不加引用,這樣會(huì)引起死遞歸

	//Object(Object& obj):value(obj.value)
	Object(Object obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}

為什么拷貝構(gòu)造函數(shù)必須采用引用傳參,否則會(huì)引發(fā)無窮遞歸呢?

這個(gè)問題其實(shí)很簡單,再復(fù)制對象時(shí)要分為兩個(gè)步驟:

第一步:開辟一個(gè)臨時(shí)空間;

第二步:由于臨時(shí)空間是需要構(gòu)造的,重新調(diào)用拷貝構(gòu)造函數(shù)(無窮遞歸形成&hellip;)

同時(shí)我們可以在拷貝構(gòu)造參數(shù)前加上一個(gè)引用,來限制可能會(huì)出現(xiàn)的問題

	//Object(Object& obj):value(obj.value)
	Object(const Object& obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}
	//這里的const修飾,令我們不能修改被拷貝對象

什么情況會(huì)使用拷貝構(gòu)造

拷貝構(gòu)造不止在使用一個(gè)對象去構(gòu)造另一個(gè)對象時(shí)調(diào)用,在下面這些情況也會(huì)調(diào)用:

class Object{int value;public:Object(){cout << "Object::Object" << this << endl;}Object(int x = 0) :value(x){cout << "Object::Object" << this << endl;}~Object(){cout << "Objecet::~Object" << this << endl;}Object(Object& obj) :value(obj.value){cout << "Copy Create" << this << endl;}void SetValue(int x) { value = x; }int GetValue() const { return value; }};Object fun(Object obj){int val = obj.GetValue();Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);return 0;}class Object
{
	int value;
public:
	Object()
	{
		cout << "Object::Object" << this << endl;
	}
	Object(int x = 0) :value(x)
	{
		cout << "Object::Object" << this << endl;
	}
	~Object()
	{
		cout << "Objecet::~Object" << this << endl;
	}
	Object(Object& obj) :value(obj.value)
	{
		cout << "Copy Create" << this << endl;
	}
	void SetValue(int x) { value = x; }
	int GetValue() const { return value; }
};
Object fun(Object obj)
{
	int val = obj.GetValue();
	Object obja(val);
	return obja;
}
int main()
{
	Object objx(0);
	Object objy(0);
	objy = fun(objx);
	return 0;
}

在上面這一段代碼中,我們總共創(chuàng)建了幾個(gè)對象呢,我們來看一下

C++中的拷貝構(gòu)造是怎樣的

首先①②屬于對象的構(gòu)造,調(diào)用構(gòu)造函數(shù);程序運(yùn)行到objy = fun(objx);進(jìn)入到fun函數(shù),這是構(gòu)造臨時(shí)對象obj③屬于拷貝構(gòu)造;隨后④構(gòu)造對象obja;最后⑤這里也屬于拷貝構(gòu)造也需要?jiǎng)?chuàng)建一個(gè)臨時(shí)對象(將亡值)

并且我們無法將fun函數(shù)中obja對象之間return傳回給objy,因?yàn)樵诤瘮?shù)結(jié)束時(shí)obja會(huì)析構(gòu)失效,所以這里會(huì)創(chuàng)建一個(gè)新的臨時(shí)對象

C++中的拷貝構(gòu)造是怎樣的

上述就是小編為大家分享的C++中的拷貝構(gòu)造是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI