생성자 복사 (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) 명령문은 내재적으로 정의된 복사 생성자를 사용하여 a 에서 새 오브젝트를 작성합니다. B b1(b) 명령문은 사용자 정의 복사 생성자 B::B(B&)를 사용하여 b 에서 새 오브젝트를 작성합니다. B b2(b_const) 명령문은 복사 생성자 B::B(const B&, int)를 사용하여 새 오브젝트를 작성합니다. 첫 번째 매개변수로 const C& 유형의 오브젝트를 사용하는 복사 생성자가 정의되지 않았으므로 컴파일러가 C c1(c_const) 명령문을 허용하지 않습니다.

A 클래스의 내재적으로 선언된 복사 생성자의 양식은 다음과 같은 경우 A::A(const A&) 입니다.

  • A 의 직접 및 가상 기반에는 첫 번째 매개변수가 const 또는 const volatile 로 규정된 복사 생성자가 있습니다.
  • A 의 비정적 클래스 유형 또는 클래스 유형 데이터 멤버의 배열에는 첫 번째 매개변수가 const 또는 const volatile 로 규정된 사본 생성자가 있습니다.

위의 사항이 클래스 A에 대해 참이 아닌 경우, 컴파일러는 내재적으로 A::A(A&)양식으로 복사 생성자를 선언합니다.

프로그램이 클래스를 포함하는 경우 잘못 형성됩니다.A사본 생성자가 내재적으로 정의되거나 ""다음 조건 중 하나 이상이 true인 경우 명시적으로 기본값으로 설정됩니다.

  • A 클래스에 액세스할 수 없거나 모호한 복사 생성자가 있는 유형의 비정적 데이터 멤버가 있습니다.
  • A 클래스가 액세스 불가능하거나 모호한 복사 생성자가 있는 클래스에서 파생되었습니다.

컴파일러는 A 유형의 객체 또는 A 클래스에서 파생된 객체를 초기화하는 경우 암시적으로 선언된 ""또는 명시적으로 기본값이 지정된 A 클래스의 생성자를 암시적으로 정의합니다.

내재적으로 정의된 ""또는 명시적으로 기본 설정된 복사 생성자는 생성자가 오브젝트의 기본 및 멤버를 초기화하는 순서와 동일한 순서로 오브젝트의 기본 및 멤버를 복사합니다.

"" 참고: 복사 생성자를 명시적으로 기본 설정된 함수 또는 삭제된 함수로 선언할 수 있습니다. 자세한 정보는 명시적으로 기본 설정된 함수 (C++11)삭제된 함수 (C++11)를 참조하십시오.