一. 什麼是拷貝構造函數
首先對於普通類型的對象來說,它們之間的複製是很簡單的,例如:
- int a = 100;
- int b = a;
而類對象與普通對象不同,類對象內部結構一般較爲複雜,存在各種成員變量。
下面看一個類對象拷貝的簡單例子。
- #include <iostream>
- using namespace std;
- class CExample {
- private:
- int a;
- public:
- //構造函數
- CExample(int b)
- { a = b;}
- //一般函數
- void Show ()
- {
- cout<<a<<endl;
- }
- };
- int main()
- {
- CExample A(100);
- CExample B = A; //注意這裏的對象初始化要調用拷貝構造函數,而非賦值
- B.Show ();
- return 0;
- }
運行程序,屏幕輸出100。從以上代碼的運行結果可以看出,系統爲對象 B 分配了內存並完成了與對象 A 的複製過程。就類對象而言,相同類型的類對象是通過拷貝構造函數來完成整個複製過程的。
下面舉例說明拷貝構造函數的工作過程。
- #include <iostream>
- using namespace std;
- class CExample {
- private:
- int a;
- public:
- //構造函數
- CExample(int b)
- { a = b;}
- //拷貝構造函數
- CExample(const CExample& C)
- {
- a = C.a;
- }
- //一般函數
- void Show ()
- {
- cout<<a<<endl;
- }
- };
- int main()
- {
- CExample A(100);
- CExample B = A; // CExample B(A); 也是一樣的
- B.Show ();
- return 0;
- }
CExample(const CExample& C) 就是我們自定義的拷貝構造函數。可見,拷貝構造函數是一種特殊的構造函數,函數的名稱必須和類名稱一致,它必須的一個參數是本類型的一個引用變量。
二. 拷貝構造函數的調用時機
在C++中,下面三種對象需要調用拷貝構造函數!
1. 對象以值傳遞的方式傳入函數參數
- class CExample
- {
- private:
- int a;
- public:
- //構造函數
- CExample(int b)
- {
- a = b;
- cout<<"creat: "<<a<<endl;
- }
- //拷貝構造
- CExample(const CExample& C)
- {
- a = C.a;
- cout<<"copy"<<endl;
- }
- //析構函數
- ~CExample()
- {
- cout<< "delete: "<<a<<endl;
- }
- void Show ()
- {
- cout<<a<<endl;
- } <li class="alt" style="box-sizing: border-box; margin-left: 40px; list-style: decimal; border-top: none;%2