91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
詳細(xì)介紹C++類(lèi)對(duì)象的拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù),是一種特殊的構(gòu)造函數(shù),它由編譯器調(diào)用來(lái)完成一些基于同一類(lèi)的其他對(duì)象的構(gòu)建及初始化。其***的參數(shù)(對(duì)象的引用)是不可變的(const類(lèi)型)。此函數(shù)經(jīng)常用在函數(shù)調(diào)用時(shí)用戶(hù)定義類(lèi)型的值傳遞及返回。拷貝構(gòu)造函數(shù)要調(diào)用基類(lèi)的拷貝構(gòu)造函數(shù)和成員函數(shù)。如果可以的話(huà),它將用常量方式調(diào)用,另外,也可以用非常量方式調(diào)用。

對(duì)于普通類(lèi)型的對(duì)象來(lái)說(shuō),它們之間的復(fù)制是很簡(jiǎn)單的,例如:

 
 
  1. int a=100;
  2. int b=a;

而類(lèi)對(duì)象與普通對(duì)象不同,類(lèi)對(duì)象內(nèi)部結(jié)構(gòu)一般較為復(fù)雜,存在各種成員變量。下面看一個(gè)類(lèi)對(duì)象拷貝的簡(jiǎn)單例子。

 
 
  1. #include 
  2. using namespace std;
  3. class CA
  4. {
  5. public:
  6. CA(int b)
  7. {
  8. a=b;
  9. }
  10. void Show ()
  11. {
  12. cout<
  13. }
  14. private:
  15. int a;
  16. };
  17. int main()
  18. {
  19. CA A(100);
  20. CA B=A;
  21. B.Show ();
  22. return 0;
  23. }

運(yùn)行程序,屏幕輸出100。 從以上代碼的運(yùn)行結(jié)果可以看出,系統(tǒng)為對(duì)象B分配了內(nèi)存并完成了與對(duì)象A的復(fù)制過(guò)程。 就類(lèi)對(duì)象而言,相同類(lèi)型的類(lèi)對(duì)象是通過(guò)拷貝構(gòu)造函數(shù)來(lái)完成整個(gè)復(fù)制過(guò)程的。下面我們舉例說(shuō)明拷貝構(gòu)造函數(shù)的工作過(guò)程。

 
 
  1. #include 
  2. using namespace std;
  3. class CA
  4. {
  5. public:
  6. CA(int b)
  7. {
  8. a=b;
  9. }
  10. CA(const CA& C)
  11. {
  12. a=C.a;
  13. }
  14. void Show()
  15. {
  16. cout<
  17. }
  18. private:
  19. int a;
  20. };
  21. int main()
  22. {
  23. CA A(100);
  24. CA B=A;
  25. B.Show ();
  26. return 0;
  27. }

CA(const CA& C)就是我們自定義的拷貝構(gòu)造函數(shù)??梢?jiàn),拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),函數(shù)的名稱(chēng)必須和類(lèi)名稱(chēng)一致,它的***的一個(gè)參數(shù)是本類(lèi)型的一個(gè)引用變量,該參數(shù)是const類(lèi)型,不可變的。例如:類(lèi)X的拷貝構(gòu)造函數(shù)的形式為X(X& x)。

當(dāng)用一個(gè)已初始化過(guò)了的自定義類(lèi)類(lèi)型對(duì)象去初始化另一個(gè)新構(gòu)造的對(duì)象的時(shí)候,拷貝構(gòu)造函數(shù)就會(huì)被自動(dòng)調(diào)用。也就是說(shuō),當(dāng)類(lèi)的對(duì)象需要拷貝時(shí),拷貝構(gòu)造函數(shù)將會(huì)被調(diào)用。以下情況都會(huì)調(diào)用拷貝構(gòu)造函數(shù):

  • 一個(gè)對(duì)象以值傳遞的方式傳入函數(shù)體
  • 一個(gè)對(duì)象以值傳遞的方式從函數(shù)返回
  • 一個(gè)對(duì)象需要通過(guò)另外一個(gè)對(duì)象進(jìn)行初始化。  

如果在類(lèi)中沒(méi)有顯式地聲明一個(gè)拷貝構(gòu)造函數(shù),那么,編譯器將會(huì)自動(dòng)生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),該構(gòu)造函數(shù)完成對(duì)象之間的位拷貝。位拷貝又稱(chēng)淺拷貝,后面將進(jìn)行說(shuō)明。

自定義拷貝構(gòu)造函數(shù)是一種良好的編程風(fēng)格,它可以阻止編譯器形成默認(rèn)的拷貝構(gòu)造函數(shù),提高源碼效率。
淺拷貝和深拷貝

在某些狀況下,類(lèi)內(nèi)成員變量需要?jiǎng)討B(tài)開(kāi)辟堆內(nèi)存,如果實(shí)行位拷貝,也就是把對(duì)象里的值完全復(fù)制給另一個(gè)對(duì)象,如A=B。這時(shí),如果B中有一個(gè)成員變量指針已經(jīng)申請(qǐng)了內(nèi)存,那A中的那個(gè)成員變量也指向同一塊內(nèi)存。這就出現(xiàn)了問(wèn)題:當(dāng)B把內(nèi)存釋放了(如:析構(gòu)),這時(shí)A內(nèi)的指針就是野指針了,出現(xiàn)運(yùn)行錯(cuò)誤。

深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類(lèi)擁有資源,當(dāng)這個(gè)類(lèi)的對(duì)象發(fā)生復(fù)制過(guò)程的時(shí)候,資源重新分配,這個(gè)過(guò)程就是深拷貝,反之,沒(méi)有重新分配資源,就是淺拷貝。下面舉個(gè)深拷貝的例子。

 
 
  1. #include 
  2. using namespace std;
  3. class CA
  4. {
  5. public:
  6. CA(int b,char* cstr)
  7. {
  8. a=b;
  9. str=new char[b];
  10. strcpy(str,cstr);
  11. }
  12. CA(const CA& C)
  13. {
  14. a=C.a;
  15. str=new char[a]; //深拷貝
  16. if(str!=0)
  17. strcpy(str,C.str);
  18. }
  19. void Show()
  20. {
  21. cout<
  22. }
  23. ~CA()
  24. {
  25. delete str;
  26. }
  27. private:
  28. int a;
  29. char *str;
  30. };
  31. int main()
  32. {
  33. CA A(10,"Hello!");
  34. CA B=A;
  35. B.Show();
  36. return 0;
  37. }

好吧,就說(shuō)這些,希望本文能對(duì)您有所幫助。


分享標(biāo)題:詳細(xì)介紹C++類(lèi)對(duì)象的拷貝構(gòu)造函數(shù)
URL地址:http://m.jiaoqi3.com/article/coshjsp.html