自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用C++類構(gòu)造函數(shù)

開發(fā) 后端
開始時(shí)如果用一個(gè)已經(jīng)初始化過了的自定義C++類的類型對象去初始化另一個(gè)新構(gòu)造的對象的時(shí)候,函數(shù)的形式參數(shù)是C++類型的一個(gè)引用變量,且必須是引用。

下面講如何使用C++類構(gòu)造函數(shù),所謂C++類是定義同一類所有對象的變量和方法的藍(lán)圖或原型,C++類體內(nèi)的成員是需要開辟動(dòng)態(tài)開辟堆內(nèi)存的,如果我們不自定義拷貝構(gòu)造函數(shù)而讓系統(tǒng)自己處理。

我們已經(jīng)學(xué)習(xí)過了的構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)知識,對于普通型的對象來說,他們之間的復(fù)制是很簡單的,例如: 自己定義的的對象同樣是對象,誰也不能阻止我們用以下的方式進(jìn)行復(fù)制,例如:

  1. #include <iostream>    
  2. using namespace std;    
  3.     
  4. class Test    
  5. {    
  6. public:    
  7.     Test(int temp)    
  8.     {    
  9.         p1=temp;    
  10.     }    
  11. protected:    
  12.     int p1;    
  13.     
  14. };    
  15.     
  16. void main()    
  17. {    
  18.     Test a(99);    
  19.     Test b=a;    

普通對象和對象同為對象,他們之間的特性有相似之處也有不同之處,C++類對象內(nèi)部存在成員變量,而普通對象是沒有的,當(dāng)同樣的復(fù)制方法發(fā)生在不同的對象上的時(shí)候,那么系統(tǒng)對他們進(jìn)行的操作也是不一樣的,就C++類對象而言,相同型的對象是通過拷貝構(gòu)造函數(shù)來完成整個(gè)復(fù)制過程的。

在上面的代碼中,我們并沒有看到拷貝構(gòu)造函數(shù),同樣完成了復(fù)制工作,這又是為什么呢?因?yàn)楫?dāng)一個(gè)沒有自定義的拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),來完成復(fù)制工作。

下面,我們?yōu)榱苏f明情況,就普通情況而言(以上面的代碼為例),我們來自己定義一個(gè)與系統(tǒng)默認(rèn)拷貝構(gòu)造函數(shù)一樣的拷貝構(gòu)造函數(shù),看看它的內(nèi)部是如何工作的!

代碼如下:

  1. #include <iostream>    
  2. using namespace std;    
  3.     
  4. class Test    
  5. {    
  6. public:    
  7.     Test(int temp)    
  8.     {    
  9.         p1=temp;    
  10.     }    
  11.     Test(Test &c_t)//這里就是自定義的拷貝構(gòu)造函數(shù)    
  12.     {    
  13.         cout<<"進(jìn)入copy構(gòu)造函數(shù)"<<endl;    
  14.         p1=c_t.p1;//這句如果去掉就不能完成復(fù)制工作了,此句復(fù)制過程的核心語句    
  15.     }   

上面代碼中的Test(Test &c_t)就是我們自定義的拷貝構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)的名稱必須與C++類名稱一致,函數(shù)的形式參數(shù)是本C++類型的一個(gè)引用變量,且必須是引用。 當(dāng)用一個(gè)已經(jīng)初始化過了的自定義C++型對象去初始化另一個(gè)新構(gòu)造的對象的時(shí)候。

拷貝構(gòu)造函數(shù)就會(huì)被自動(dòng)調(diào)用,如果你沒有自定義拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)將會(huì)提供給一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)來完成這個(gè)過程。上面代碼的復(fù)制核心語句就是通過Test(Test &c_t)拷貝構(gòu)造函數(shù)內(nèi)的p1=c_t.p1;語句完成的。

如果取掉這句代碼,那么b對象的p1屬性將得到一個(gè)未知的隨機(jī)值;就上面的代碼情況而言,很多人會(huì)問到,既然系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)來處理復(fù)制,那么我們沒有意義要去自定義拷貝構(gòu)造函數(shù)呀。#t#

對,就普通情況而言這的確是沒有必要的,但在某寫狀況下,C++類體內(nèi)的成員是需要開辟動(dòng)態(tài)開辟堆內(nèi)存的,如果我們不自定義拷貝構(gòu)造函數(shù)而讓系統(tǒng)自己處理,那么就會(huì)導(dǎo)致堆內(nèi)存的所屬權(quán)產(chǎn)生混亂,試想一下,已經(jīng)開辟的一端堆地址原來是屬于對象a的。

由于復(fù)制過程發(fā)生,b對象取得是a已經(jīng)開辟的堆地址,一旦程序產(chǎn)生析構(gòu),釋放堆的時(shí)候,計(jì)算機(jī)是不可能清楚這段地址是真正屬于誰的,當(dāng)連續(xù)發(fā)生兩次析構(gòu)的時(shí)候就出現(xiàn)了運(yùn)行錯(cuò)誤。

責(zé)任編輯:chenqingxiang 來源: 博客園
相關(guān)推薦

2010-01-27 10:13:22

C++類對象

2010-01-20 18:06:06

C++虛基類

2010-01-28 10:49:22

C++構(gòu)造函數(shù)

2010-02-02 17:39:31

C++構(gòu)造函數(shù)

2010-01-25 14:43:00

C++構(gòu)造函數(shù)

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2011-07-20 13:40:09

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

2023-11-28 11:51:01

C++函數(shù)

2025-02-06 13:23:09

C++函數(shù)參數(shù)

2010-01-25 09:50:58

C++函數(shù)對象

2010-01-27 16:10:32

C++靜態(tài)構(gòu)造函數(shù)

2010-01-22 11:13:16

C++靜態(tài)

2010-02-05 17:16:05

C++構(gòu)造函數(shù)

2010-01-25 17:05:37

C++語言

2010-02-01 11:01:30

C++靜態(tài)構(gòu)造函數(shù)

2024-04-28 11:01:27

C++編程語言函數(shù)

2009-08-13 17:30:30

C#構(gòu)造函數(shù)

2010-01-26 14:23:50

C++類

2010-01-28 13:35:41

調(diào)用C++函數(shù)

2024-12-06 12:00:00

C++構(gòu)造函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號