c++ 복사 생성자 예제

C ++에는 « 비트 복사 생성자 »와 같은 것은 없습니다. 그러나 기본 생성된 복사 생성자는 멤버에 복사 생성자 호출을 호출하고 원시 포인터 멤버의 경우 원시 포인터(즉, 원본이 아님)를 복사합니다. 일반적으로 컴파일러는 각 클래스(암시적 복사 생성자라고 함)에 대한 복사 생성자를 자동으로 생성하지만 특별한 경우 프로그래머는 사용자 정의 복사 생성자로 알려진 복사 생성자를 만듭니다. 이러한 경우 컴파일러는 컴파일러를 만들지 않습니다. 따라서 사용자 또는 시스템에 의해 정의 되는 하나의 복사본 생성자가 항상 있다. 예상과 달리 템플릿 복사 생성자는 사용자 정의 복사 생성자가 아닙니다. 따라서 사용자 정의 된 복사 생성자를 통해서만 딥 카피를 만들 수 있습니다. 사용자 정의 복사 생성자에서 복사된 개체의 포인터(또는 참조)가 새 메모리 위치를 가리키는지 확인합니다. T에 사용자 정의 소멸자 또는 사용자 정의 복사 할당 연산자가 있는 경우 암시적으로 정의된 복사 생성자의 생성이 더 이상 사용되지 않습니다.

A의 형식은 배열일 수 있습니다. Array에서 배열을 생성하려면 사용자 정의, 비템플릿 복사 생성자도 제공되어야 합니다. 딥 카피는 복사본에 대한 메모리를 동적으로 할당한 다음 실제 값을 복사하며 원본과 복사본 모두 고유한 메모리 위치를 갖습니다. 이러한 방식으로 원본과 복사본은 서로 다르며 동일한 메모리 위치를 공유하지 않습니다. 이 복사본을 사용하려면 사용자 정의 생성자를 작성해야 합니다. Copy 생성자는 다른 개체에서 개체를 선언하고 초기화하는 데 사용되는 오버로드된 생성자입니다. 일반 생성자 : 10 15 복사 생성자 : 10 15 동일한 예제를 볼 수 있지만 동일한 유형의 기존 개체를 사용하여 다른 개체를 만들기 위해 작은 변경으로 보자 -이 예제는 복사 생성자가 작동하는 방법과 때로는 필요한 이유를 보여줍니다. 복사 생성자가 클래스에 정의되지 않은 경우 컴파일러 자체가 하나를 정의합니다. 클래스에 포인터 변수가 있고 동적 메모리 할당이 있는 경우 복사 생성자가 있어야 합니다.

복사 생성자의 가장 일반적인 형태는 여기에 표시됩니다 – 암시적으로 선언 된 복사 생성자가 삭제되지 않으면 odr-used 경우 컴파일러에 의해 정의됩니다 (즉, 함수 본문이 생성되고 컴파일됨). 공용 구조체 형식의 경우 암시적으로 정의된 복사 생성자는 std::memmove와 같이 개체 표현을 복사합니다. 비union 클래스 형식(클래스 및 구조체)의 경우 생성자는 직접 초기화를 사용하여 개체의 기본 및 비정적 멤버의 전체 멤버별 복사본을 초기화 순서로 수행합니다. 이것이 constexpr 생성자의 요구 사항을 충족하면 생성된 복사 생성자는 constexpr입니다. (이후 C ++11) 위의 경우 복사 생성자는 복사된 개체를 수정해야 할 때 복사 생성자의 X 형식이 사용됩니다. 이것은 매우 드물지만 표준 라이브러리의 std::auto_ptr에서 사용할 수 있습니다. 참조가 제공되어야 합니다: 복사 생성자 비공개로 만들 수 있습니까? 예. 복사 생성자는 비공개로 만들 수 있습니다. 클래스에서 복사 생성자 개인으로 만들면 해당 클래스의 개체는 복사할 수 없게 됩니다. 이 기능은 클래스에 포인터가 있거나 동적으로 할당된 리소스가 있는 경우에 특히 유용합니다. 이러한 경우 String 예제와 같이 자체 복사 생성자를 작성하거나 사용자가 런타임시 놀라움이 아닌 컴파일러 오류를 얻을 수 있도록 개인 복사 생성자를 만들 수 있습니다.

이전 예제에서는 c1이 concatenate()라고 불릴 때 볼 수 있습니다. 함수 호출 또는 복사 초기화 구문에서 개체를 복사하지 못하도록 하는 데 사용됩니다. 복사 생성자는 언제 호출되나요? C++에서는 다음과 같은 경우 복사 생성자가 호출될 수 있습니다. 1. 클래스의 개체가 값으로 반환되는 경우. 2. 클래스의 개체가 인수로 값으로 (함수에) 전달될 때. 3. 객체가 동일한 클래스의 다른 개체를 기반으로 생성되는 경우.

Les commentaires sont fermés.