欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中的拷貝構(gòu)造詳解

 更新時(shí)間:2022年01月15日 15:29:03   作者:悲傷土豆拌飯  
這篇文章主要為大家介紹了C++中的拷貝構(gòu)造,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

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

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

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

OBject(Object& obj)
{}

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

如果我們?cè)趯懙目截悩?gòu)造不加引用,這樣會(huì)引起死遞歸

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

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

這個(gè)問(wèn)題其實(shí)很簡(jiǎn)單,再?gòu)?fù)制對(duì)象時(shí)要分為兩個(gè)步驟:

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

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

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

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

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

拷貝構(gòu)造不止在使用一個(gè)對(duì)象去構(gòu)造另一個(gè)對(duì)象時(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è)對(duì)象呢,我們來(lái)看一下

在這里插入圖片描述

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

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

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++命名空間和缺省參數(shù)介紹

    C++命名空間和缺省參數(shù)介紹

    這篇文章主要介紹了C++命名空間和缺省參數(shù),使用命名空間的目的是對(duì)標(biāo)識(shí)符的名稱進(jìn)行本地化,以避免命名沖突或名字污染,namespace關(guān)鍵字的出現(xiàn)就是針對(duì)這種問(wèn)題的,缺省參數(shù)是聲明或定義函數(shù)時(shí)為函數(shù)的參數(shù)指定一個(gè)默認(rèn)值,更多詳細(xì)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-01-01
  • C語(yǔ)言中的運(yùn)算符優(yōu)先級(jí)和結(jié)合性一覽表

    C語(yǔ)言中的運(yùn)算符優(yōu)先級(jí)和結(jié)合性一覽表

    這篇文章主要介紹了C語(yǔ)言中的運(yùn)算符優(yōu)先級(jí)和結(jié)合性一覽表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無(wú)重復(fù)字符的子串)

    C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無(wú)重復(fù)字符的子串)

    這篇文章主要介紹了C++實(shí)現(xiàn)leetcode(3.最長(zhǎng)無(wú)重復(fù)字符的子串),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 如何使用VC庫(kù)函數(shù)中的快速排序函數(shù)

    如何使用VC庫(kù)函數(shù)中的快速排序函數(shù)

    下面呢,小編就為大家介紹一下VC中庫(kù)函數(shù)qsort()的用法。需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)

    C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(151.翻轉(zhuǎn)字符串中的單詞),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++標(biāo)準(zhǔn)庫(kù)中sstream與strstream的區(qū)別詳細(xì)解析

    C++標(biāo)準(zhǔn)庫(kù)中sstream與strstream的區(qū)別詳細(xì)解析

    以下是對(duì)C++標(biāo)準(zhǔn)庫(kù)中sstream與strstream的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • 淺析string 與char* char[]之間的轉(zhuǎn)換

    淺析string 與char* char[]之間的轉(zhuǎn)換

    與char*不同的是,string不一定以NULL('\0')結(jié)束。string長(zhǎng)度可以根據(jù)length()得到,string可以根據(jù)下標(biāo)訪問(wèn)。所以,不能將string直接賦值給char*
    2013-10-10
  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可展開)

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可展開)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,實(shí)現(xiàn)掃雷展開和提醒,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C++基本用法實(shí)踐之智能指針詳解

    C++基本用法實(shí)踐之智能指針詳解

    為了減少手動(dòng)管理內(nèi)存帶來(lái)的困擾,c++提出了智能指針,可以幫助我們進(jìn)行內(nèi)存管理,下面小編就來(lái)和大家簡(jiǎn)單聊聊C++中智能指針的基本用法吧
    2023-07-07
  • Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

    Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

    今天小編就為大家分享一篇關(guān)于Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論