복사 생성자 및 복사 할당 연산자(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 및 FILE1.DAT에 대한 두 번째 핸들을 만듭니 b 다." 다음과 같이 각 클래스에 적절한 복사 의미 체계를 연결해야 합니다.

  • 클래스 형식에 대한 참조를 반환하고 참조로 전달되는 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의 단일 인수를 사용하는 것으로 선언된 복사 생성자가 있는 경우입니다. 이 경우 컴파일러에서 생성된 복사 생성자의 인수도 const있습니다.

복사 생성자에 대한 인수 형식이 없 const으면 개체를 복사하여 const 초기화하면 오류가 발생합니다. 반대의 경우는 true가 아닙니다. 인수인 const경우 그렇지 않은 const개체를 복사하여 초기화할 수 있습니다.

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

참고 항목

컴파일러 생성 또는 사용자 정의에 관계없이 복사 생성자에 의해 가상 기본 클래스가 초기화되면 생성될 때 한 번만 초기화됩니다.

의미는 복사 생성자와 유사합니다. 인수 형식이 아닌 const경우 개체에서 const 할당하면 오류가 발생합니다. 반대의 경우는 true가 아닙니다. 값이 아닌 const값에 할당되면 const 할당이 성공합니다.

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