다음을 통해 공유


복사 생성자 및 복사 대입 연산자(C++)

참고 항목

C++11부터 언어에서 복사 할당이동 할당이라는 두 가지 할당이 지원됩니다. 이 문서에서 별도로 명시하지 않는 한 "할당"은 복사 할당을 의미합니다. 이동 할당에 대한 자세한 내용은 이동 생성자 및 이동 대입 연산자(C++)를 참조하세요.

할당 작업과 초기화 작업은 모두 개체를 복사합니다.

  • 할당: 한 개체의 값이 다른 개체에 할당하면 첫 번째 개체를 두 번째 개체에 복사합니다. 따라서 이 코드는 b의 값을 a에 복사합니다.

    Point a, b;
    ...
    a = b;
    
  • 초기화: 새 개체를 선언할 때, 값으로 함수 인수를 전달하거나 함수에서 값으로 반환할 때 초기화가 발생합니다.

클래스 형식의 개체에 대해 "복사"의 의미를 정의할 수 있습니다. 예를 들어 다음 코드를 고려합니다.

TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;

앞의 코드는 "FILE1.DAT의 내용을 FILE2.DAT에 복사"를 의미하거나, "FILE2.DAT를 무시하고 b를 FILE1.DAT의 두 번째 핸들로 만들기"를 의미할 수도 있습니다. 다음과 같이 각 클래스에 적절한 복사 의미 체계를 연결해야 합니다.

  • 클래스 형식에 대한 참조를 반환하고 const 참조로 전달된 하나의 매개 변수를 사용하는 대입 연산자 operator=를 사용합니다(예: ClassName& operator=(const ClassName& x);).

  • 복사 생성자를 사용합니다.

복사 생성자를 선언하지 않으면 컴파일러는 자동으로 멤버 단위 복사 생성자를 생성합니다. 마찬가지로 복사 대입 연산자를 선언하지 않으면 컴파일러는 멤버별 복사 대입 연산자를 생성합니다. 복사 생성자를 선언해도 컴파일러에서 생성된 복사 대입 연산자가 억제되지 않으며 그 반대의 경우도 마찬가지입니다. 둘 중 하나를 구현하는 경우 다른 것도 구현하는 것이 좋습니다. 두 가지를 모두 구현하면 코드의 의미가 명확해집니다.

복사 생성자는 ClassName& 형식의 인수를 사용합니다. 여기서 ClassName은 클래스 이름입니다. 예시:

// spec1_copying_class_objects.cpp
class Window
{
public:
    Window( const Window& );            // Declare copy constructor.
    Window& operator=(const Window& x); // Declare copy assignment.
    // ...
};

int main()
{
}

참고 항목

가능할 때마다 복사 생성자의 인수 const ClassName&의 형식을 만듭니다. 이렇게 하면 복사 생성자가 복사된 개체를 실수로 변경하는 것을 방지할 수 있습니다. 또한 const 개체에서 복사할 수도 있습니다.

컴파일러에서 생성된 복사 생성자

사용자 정의 복사 생성자와 같이 컴파일러에서 생성된 복사 생성자에는 "class-name에 대한 형식 참조"의 단일 인수가 있습니다. 한 가지 예외는 형식 const class-name&의 단일 인수로 사용할 때 모든 기본 클래스와 멤버 클래스에서 복사 생성자를 선언하는 경우입니다. 이런 경우 컴파일러에서 생성된 복사 생성자의 인수는 const이기도 합니다.

복사 생성자의 인수 형식이 const가 아닌 경우 const 개체를 복사하여 초기화하면 오류가 발생합니다. 인수가 const이면 const가 아닌 개체를 복사하여 초기화할 수 있지만 반대의 경우는 불가능합니다.

컴파일러에서 생성된 대입 연산자는 const에 대해 동일한 패턴을 따릅니다. 모든 기본 클래스와 멤버 클래스의 대입 연산자가 const ClassName& 형식의 인수를 취하지 않는 한, 이는 ClassName& 형식의 단일 인수를 사용합니다. 이 경우 클래스에 대해 생성된 대입 연산자는 const 인수를 사용합니다.

참고 항목

가상 기본 클래스가 복사 생성자에 의해 초기화되면(컴파일러 생성이든 사용자 정의이든) 해당 클래스는 생성되는 시점에 한 번만 초기화됩니다.

의미는 복사 생성자의 의미와 유사합니다. 인수 형식이 const가 아닌 경우 const 개체의 할당은 오류를 생성합니다. const 값이 const가 아닌 값에 할당될 수 있지만 반대의 경우는 불가능합니다.

오버로드된 대입 연산자에 대한 자세한 내용은 할당을 참조하세요.