c++拷貝構造函數的詳解



一. 什麼是拷貝構造函數

首先對於普通類型的對象來說,它們之間的複製是很簡單的,例如:

[c-sharp] view plain copy
  1. int a = 100;  
  2. int b = a;   

而類對象與普通對象不同,類對象內部結構一般較爲複雜,存在各種成員變量。
下面看一個類對象拷貝的簡單例子。

[c-sharp] view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class CExample {  
  5. private:  
  6.      int a;  
  7. public:  
  8.       //構造函數  
  9.      CExample(int b)  
  10.      { a = b;}  
  11.   
  12.       //一般函數  
  13.      void Show ()  
  14.      {  
  15.         cout<<a<<endl;  
  16.       }  
  17. };  
  18.   
  19. int main()  
  20. {  
  21.      CExample A(100);  
  22.      CExample B = A; //注意這裏的對象初始化要調用拷貝構造函數,而非賦值  
  23.       B.Show ();  
  24.      return 0;  
  25. }  

運行程序,屏幕輸出100。從以上代碼的運行結果可以看出,系統爲對象 B 分配了內存並完成了與對象 A 的複製過程。就類對象而言,相同類型的類對象是通過拷貝構造函數來完成整個複製過程的

下面舉例說明拷貝構造函數的工作過程。

[c-sharp] view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class CExample {  
  5. private:  
  6.     int a;  
  7. public:  
  8.     //構造函數  
  9.     CExample(int b)  
  10.     { a = b;}  
  11.       
  12.     //拷貝構造函數  
  13.     CExample(const CExample& C)  
  14.     {  
  15.         a = C.a;  
  16.     }  
  17.   
  18.     //一般函數  
  19.     void Show ()  
  20.     {  
  21.         cout<<a<<endl;  
  22.     }  
  23. };  
  24.   
  25. int main()  
  26. {  
  27.     CExample A(100);  
  28.     CExample B = A; // CExample B(A); 也是一樣的  
  29.      B.Show ();  
  30.     return 0;  
  31. }   

CExample(const CExample& C) 就是我們自定義的拷貝構造函數。可見,拷貝構造函數是一種特殊的構造函數,函數的名稱必須和類名稱一致,它必須的一個參數是本類型的一個引用變量


二. 拷貝構造函數的調用時機

在C++中,下面三種對象需要調用拷貝構造函數!
1. 對象以值傳遞的方式傳入函數參數

[c-sharp] view plain copy
  1. class CExample   
  2. {  
  3. private:  
  4.  int a;  
  5.   
  6. public:  
  7.  //構造函數  
  8.  CExample(int b)  
  9.  {   
  10.   a = b;  
  11.   cout<<"creat: "<<a<<endl;  
  12.  }  
  13.   
  14.  //拷貝構造  
  15.  CExample(const CExample& C)  
  16.  {  
  17.   a = C.a;  
  18.   cout<<"copy"<<endl;  
  19.  }  
  20.    
  21.  //析構函數  
  22.  ~CExample()  
  23.  {  
  24.   cout<< "delete: "<<a<<endl;  
  25.  }  
  26.   
  27.      void Show ()  
  28.  {  
  29.          cout<<a<<endl;  
  30.      }  <li class="alt" style="box-sizing: border-box; margin-left: 40px; list-style: decimal; border-top: none;%2
發佈了11 篇原創文章 · 獲贊 21 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章