複製建構子 (僅限 C++)

複製建構子 可讓您透過起始設定,從現有的物件建立新的物件。 類別 A 的複製建構子是一個非範本建構子,其中第一個參數的類型是 A&const A&volatile A&const volatile A&,其餘參數 (如果有的話) 具有預設值。

如果您未宣告類別 A的複製建構子,編譯器會隱含地為您宣告一個建構子,它將是行內公用成員。

下列範例示範隱含定義及使用者定義的副本建構子:
#include <iostream>
using namespace std;

struct A {
  int i;
  A() : i(10) { }
};

struct B {
  int j;
  B() : j(20) {
    cout << "Constructor B(), j = " << j << endl;
  }

  B(B& arg) : j(arg.j) {
    cout << "Copy constructor B(B&), j = " << j << endl;
  }

  B(const B&, int val = 30) : j(val) {
    cout << "Copy constructor B(const B&, int), j = " << j << endl;
  }
};

struct C {
  C() { }
  C(C&) { }
};

int main() {
  A a;
  A a1(a);
  B b;
  const B b_const;
  B b1(b);
  B b2(b_const);
  const C c_const;
//  C c1(c_const);
}
以下是上述範例的輸出:
Constructor B(), j = 20
Constructor B(), j = 20
Copy constructor B(B&), j = 20
Copy constructor B(const B&, int), j = 30

陳述式 A a1(a) 會使用隱含定義的 copy 建構子,從 a 建立新的物件。 陳述式 B b1(b) 會使用使用者定義的複製建構子 B::B(B&),從 b 建立新的物件。 陳述式 B b2(b_const) 會使用複製建構子 B::B(const B&, int)來建立新物件。 編譯器不容許陳述式 C c1(c_const) ,因為尚未定義以 const C& 類型的物件作為其第一個參數的複製建構子。

如果符合下列條件,則類別 A 的隱含宣告副本建構子將具有 A::A(const A&) 格式:

  • A 的直接和虛擬基礎具有 copy 建構子,其第一個參數已使用 constconst volatile 來限定
  • A 的非靜態類別類型或類別類型資料成員陣列具有 copy 建構子,其第一個參數已使用 constconst volatile 限定

如果上述對於類別 A不是 true ,編譯器會隱含地宣告格式為 A::A(A&)的複製建構子。

如果程式包含類別,則其格式不正確A當符合下列一或多個條件時,其複製建構子會隱含定義 ""或明確預設:

  • 類別 A 具有類型的非靜態資料成員,其具有無法存取或語意不明的複製建構子。
  • 類別 A 衍生自具有無法存取或不明確的複製建構子的類別。

如果您起始設定類型 A 的物件或衍生自類別 A的物件,編譯器會隱含地定義隱含宣告的 ""或明確預設的類別建構子 A

隱含定義的 ""或明確預設的複製建構子會依照建構子起始設定物件的基礎和成員的相同順序,來複製物件的基礎和成員。

"" 附註: 您可以將 copy 建構子宣告為明確預設函數或已刪除函數。 如需相關資訊,請參閱 明確預設函數 (C++11)已刪除函數 (C++11)