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

溫馨提示×

溫馨提示×

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

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

C++中的拷貝構造是怎樣的

發布時間:2022-01-17 13:35:43 來源:億速云 閱讀:149 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關C++中的拷貝構造是怎樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

拷貝構造函數

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

例如:

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);//一個對象初始化另一個對象空間,調用拷貝構造
}

當一個對象去初始化另一個對象空間,調用拷貝構造;若類中沒有寫拷貝構造,如同構造函數與析構函數一樣,系統會生成一個缺省的拷貝構造函數

OBject(Object& obj)
{}

拷貝構造中的引用

如果我們在寫的拷貝構造不加引用,這樣會引起死遞歸

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

為什么拷貝構造函數必須采用引用傳參,否則會引發無窮遞歸呢?

這個問題其實很簡單,再復制對象時要分為兩個步驟:

第一步:開辟一個臨時空間;

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

同時我們可以在拷貝構造參數前加上一個引用,來限制可能會出現的問題

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

什么情況會使用拷貝構造

拷貝構造不止在使用一個對象去構造另一個對象時調用,在下面這些情況也會調用:

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;
}

在上面這一段代碼中,我們總共創建了幾個對象呢,我們來看一下

C++中的拷貝構造是怎樣的

首先①②屬于對象的構造,調用構造函數;程序運行到objy = fun(objx);進入到fun函數,這是構造臨時對象obj③屬于拷貝構造;隨后④構造對象obja;最后⑤這里也屬于拷貝構造也需要創建一個臨時對象(將亡值)

并且我們無法將fun函數中obja對象之間return傳回給objy,因為在函數結束時obja會析構失效,所以這里會創建一個新的臨時對象

C++中的拷貝構造是怎樣的

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

向AI問一下細節

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

c++
AI

屯昌县| 赞皇县| 无棣县| 岳西县| 永宁县| 阿克苏市| 政和县| 浑源县| 虎林市| 平山县| 晋州市| 颍上县| 灵石县| 黑水县| 石狮市| 铜川市| 英德市| 英吉沙县| 兴文县| 信阳市| 大港区| 英山县| 鸡西市| 清丰县| 泸西县| 怀来县| 翁源县| 禄丰县| 镇巴县| 冀州市| 宿州市| 三明市| 鹰潭市| 石首市| 龙南县| 繁昌县| 河津市| 榕江县| 琼结县| 龙岩市| 海晏县|