【C++】拷貝構(gòu)造函數(shù)-創(chuàng)新互聯(lián)

目錄

成都創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營(yíng)銷需求!成都創(chuàng)新互聯(lián)具備承接各種類型的網(wǎng)站制作、做網(wǎng)站項(xiàng)目的能力。經(jīng)過(guò)十余年的努力的開(kāi)拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。

默認(rèn)拷貝構(gòu)造函數(shù)?

拷貝構(gòu)造函數(shù)的原型:

為什么不用值傳遞?

為什么不用指針傳遞?

調(diào)用拷貝構(gòu)造函數(shù)的3種情況 (舊對(duì)象去構(gòu)造新對(duì)象)


我們熟悉的類型有以下操作:

1.聲明:int a;

2.聲明并初始化:int a = 10;

3.賦值:int a = 10;int b = a;

類作為一個(gè)類型當(dāng)然也有以上操作,其中默認(rèn)的構(gòu)造函數(shù)可以完成操作1,人為建立的構(gòu)造函數(shù)可以完成操作2,3。對(duì)于第三種操作,類中也提供了默認(rèn)的函數(shù)——拷貝構(gòu)造函數(shù)。

默認(rèn)拷貝構(gòu)造函數(shù)?

類會(huì)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),用已有對(duì)象的值去依此初始化新對(duì)象的值;如果人為提供了,則類不會(huì)提供默認(rèn)。

? 拷貝構(gòu)造函數(shù)又叫復(fù)制構(gòu)造函數(shù)。

拷貝構(gòu)造函數(shù)的原型:

類名(const 類名& 形參名) :(初始化列表){}

可以看到,這里是引用傳遞,加了const防止值被修改

為什么不用值傳遞?

值傳遞將待傳的值賦值一份過(guò)去,形參需要初始化,如果使用值傳遞,像下面這樣,程序會(huì)掉入死循環(huán):

假如有:A a = 10;A b(a);

將a傳入成員b時(shí)調(diào)用拷貝構(gòu)造函數(shù)A(A t);

而A(A t)函數(shù)中的形參成員t需要初始化,這又需要調(diào)用拷貝構(gòu)造函數(shù)A(A t);

如此下去不斷調(diào)用拷貝構(gòu)造函數(shù),無(wú)窮無(wú)盡。

class A
{
public:
	A(int i = 0) :m_i(i) { cout<< "A"<< m_i<< endl; }
	~A() { cout<< "~A"<< m_i<< endl; }
	A(A t) :m_i(t->m_i)//值傳遞
	{
		cout<< "A(A)"<< endl;
	}
	void print() { cout<< m_i<< endl; }
private:
	int m_i;
};
為什么不用指針傳遞?

A(A* t) :m_i(t->m_i)
{cout<< "A(A)"<< endl;}

其實(shí)指針傳遞的結(jié)果是對(duì)的,但是看的時(shí)候有歧義

A a = 10;A b = &a;//人們無(wú)法確定是用a初始化b,還是用&a初始化b;A b(&a)的作用同A b = &a

調(diào)用拷貝構(gòu)造函數(shù)的3種情況 (舊對(duì)象去構(gòu)造新對(duì)象)

1.用已有對(duì)象去初始化新對(duì)象
2.函數(shù)傳參--值傳遞 由實(shí)參傳遞給形參的過(guò)程
3.函數(shù)返回值 --類類型的值返回,由局部對(duì)象構(gòu)造臨時(shí)對(duì)象

情況1很好理解

?A a(5); //A(int) 5
?A b(a);//用a去初始化b對(duì)象

情況2就是拷貝構(gòu)造函數(shù)為什么不用值傳遞的原因

void fun(A t){}?

情況3在const關(guān)鍵字那篇中提到過(guò),函數(shù)傳參時(shí)不是把本身的變量傳過(guò)去,而是生成一個(gè)臨時(shí)存儲(chǔ)空間,這個(gè)臨時(shí)的空間如果是類類型的則需要調(diào)用拷貝構(gòu)造函數(shù)。

A fun(){}

最后看一下這些函數(shù)的調(diào)用:

class A
{
public:
	A(int i = 0) :m_i(i) { cout<< "A"<< m_i<< endl; }
	~A() { cout<< "~A"<< m_i<< endl; }

	A(const A& t) :m_i(t.m_i)  //拷貝構(gòu)造函數(shù)
	{
		cout<< "A(A)"<< m_i<< endl;
	}
	void print() { cout<< m_i<< endl; }
private:
	int m_i;
};
void fn(A s)  //A s(c) 用c構(gòu)造s 調(diào)用拷貝構(gòu)造 A(A) 30
{
	cout<< "fn"<< endl;
	//fn在即將退出的時(shí)候,要將局部對(duì)象s析構(gòu) ~A 30
}
A test()
{
	A tt(60);  //A 60
	return tt; //從tt到臨時(shí)對(duì)象調(diào)用拷貝構(gòu)造
} 

void main()
{
	A a(5); 
	A b(a); 
	A c(30);  //調(diào)用普通構(gòu)造  A 30
	fn(c);
	c = test();
}

結(jié)果:

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前文章:【C++】拷貝構(gòu)造函數(shù)-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article12/djhidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站制作、關(guān)鍵詞優(yōu)化、做網(wǎng)站、微信公眾號(hào)外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)