Gegründet 2006

복사 생성자 예제

아래 예제에서는 동일한 메모리 위치를 가리키는 개체 c1과 c2를 모두 볼 수 있습니다. c1.connate() 함수가 호출되면 c2에도 영향을 줍니다. 따라서 c1.display() 및 c2.display() 모두 동일한 출력을 제공합니다. 위의 예제를 관찰하는 경우 복사 생성자(user1)의 인스턴스를 만들고 사용자 개체의 인스턴스를 매개 변수 유형으로 사용합니다. 따라서 사용자 개체의 속성은 user1 개체로 보내지고 user1 개체의 속성 값을 변경하지만 사용자 개체 속성 값에는 영향을 주지 않습니다. 컴파일러는 우리를 위해 복사 생성자를 생성했으며 C ++에는 „비트 복사 생성자“와 같은 것이 없습니다. 그러나 기본 생성된 복사 생성자는 멤버에 복사 생성자 호출을 호출하고 원시 포인터 멤버의 경우 원시 포인터(즉, 원본이 아님)를 복사합니다. Copy 생성자는 다른 개체에서 개체를 선언하고 초기화하는 데 사용되는 오버로드된 생성자입니다. 복사 생성자는 객체가 동일한 유형의 다른 개체에서 초기화될 때마다 호출됩니다(오버로드 해상도가 더 나은 일치를 선택하거나 호출이 해제되지 않는 한) 딥 카피를 포함합니다. 동적으로 복사본에 대 한 메모리를 할당 하 고 실제 값을 복사, 소스와 복사 모두 별개의 메모리 위치. 이러한 방식으로 원본과 복사본은 서로 다르며 동일한 메모리 위치를 공유하지 않습니다. 이 복사본을 사용하려면 사용자 정의 생성자를 작성해야 합니다.

복사된 개체를 수정해야 하는 경우 복사 생성자의 X 형식이 사용됩니다. 이것은 매우 드물지만 표준 라이브러리의 std::auto_ptr에서 사용할 수 있습니다. 참조가 제공되어야 합니다: 동일한 예제를 보지만 작은 변경으로 동일한 형식의 기존 개체를 사용하여 다른 개체를 만들 수 있습니다 – In c#, Copy 생성자는 동일한 클래스 형식의 매개 변수를 포함하는 매개 변수화된 생성자입니다. c#의 복사 생성자는 새 인스턴스를 기존 인스턴스의 값으로 초기화하려는 경우에 유용합니다. 복사 생성자가 클래스에 정의되지 않은 경우 컴파일러 자체가 하나를 정의합니다. 클래스에 포인터 변수가 있고 동적 메모리 할당이 있는 경우 복사 생성자가 있어야 합니다. 복사 생성자의 가장 일반적인 형태는 여기에 표시됩니다 – 다음은 잘못된 복사 생성자 (이유 – copy_from_me는 참조로 전달되지 않음) : 객체가 포인터 또는 공유 할 수없는 참조를 소유 할 때 사용자 정의 된 복사 생성자가 일반적으로 필요합니다. 파일과 같은 경우 소멸자와 할당 연산자도 작성해야 합니다(규칙 3 참조). A의 형식은 배열일 수 있습니다. Array에서 배열을 생성하려면 사용자 정의, 비템플릿 복사 생성자도 제공되어야 합니다. 프로그래머는 사용자 정의 복사 생성자를 사용하여 개체를 복사할 때 수행할 동작을 정의할 수 있습니다.

원본 객체에 대한 참조를 복사하는 얕은 복사본입니다. 컴파일러는 기본 복사 생성자를 제공합니다. 기본 복사 생성자는 아래 예제와 같이 얕은 복사본을 제공합니다. 개체의 약간 현명한 복사본입니다. 복사된 정보에 대해 복사된 메모리를 할당합니다. 따라서 소스와 복사본이 다릅니다. 한 메모리 위치에서 변경한 내용은 다른 위치의 복사본에 영향을 주지 않습니다. 포인터를 사용하여 동적 메모리를 할당할 때 사용자 정의 된 복사 생성자가 필요합니다. 두 개체 모두 서로 다른 메모리 위치를 가리킵니다. 복사 생성자는 기존 개체의 복사본으로 기존 개체에서 새 개체를 만들 때 호출됩니다. 할당 연산자는 이미 초기화 된 개체가 다른 기존 개체에서 새 값을 할당 할 때 호출됩니다. 위의 예제 (1)에서 복사 생성자 및 (2) 호출 할당 연산자 호출합니다.

자세한 내용은 이쪽을 참조하십시오.

Comments are closed.