C++ unique_ptr 사용

Use C Unique_ptr



스마트 포인터는 리소스를 동적으로 할당하는 데 사용됩니다. 많은 유형의 스마트 포인터가 다음과 같은 다양한 목적으로 C++에서 사용됩니다. auto_ptr , 고유_ptr , 그리고 공유_ptr . auto_ptr 포인터는 C++의 새 버전에서 더 이상 사용되지 않습니다. unique_ptr은 auto_ptr 대신 사용됩니다. 이 포인터의 개체는 포인터의 소유권을 가질 수 있습니다. 이 포인터의 개체는 포인터를 고유하게 소유하고 다른 포인터는 개체를 가리킬 수 없습니다. unique_ptr은 개체를 자동으로 삭제합니다. 이 포인터는 객체가 파괴되거나 객체의 값이 변경되거나 reset() 함수가 호출되는 경우 해당 객체를 관리합니다. unique_ptr의 기능과 이 포인터의 사용은 이 튜토리얼에서 설명합니다.

주요 구성 요소:







unique_ptr 개체의 두 가지 주요 구성 요소는 다음과 같습니다.



A. 저장된 포인터:



고유 포인터에 의해 생성된 개체를 관리하는 데 사용됩니다. 포인터 생성 시 생성되며 다양한 방식으로 변경할 수 있습니다.





B. 저장된 삭제자:

관리되는 개체를 삭제하는 데 사용되는 저장된 포인터 형식의 인수를 사용합니다. 포인터 생성 시에도 생성되며, 다양한 방법으로 변경할 수 있습니다.



예제 1: 생성자를 사용하여 클래스의 포인터 객체 만들기

클래스의 고유 포인터 객체를 선언하고 해당 클래스의 메소드에 접근하는 방법은 다음과 같이 객체를 사용하는 것이다. 생성자와 공용 메서드가 있는 클래스가 코드에서 선언되었습니다. 생성자에는 세 개의 인수가 있습니다. 첫 번째 고유 포인터는 세 개의 인수 값으로 생성자를 호출하여 생성되었습니다. NS 결과() 메서드는 생성자의 세 인수 값의 합을 계산하는 포인터 개체에 의해 호출됩니다. 다음으로 생성자를 호출하지 않고 두 번째 고유 포인터 개체를 만들고 첫 번째 포인터를 두 번째 포인터로 이동합니다. NS 결과() 메서드는 두 번째 포인터 개체에 의해 호출됩니다.

// //필요한 라이브러리 포함

#포함하다

#포함하다

네임스페이스 표준 사용;

// //클래스 정의
클래스 추가{

정수 번호1, 번호2, 번호3;
공공의:
// //생성자 선언
덧셈(정수 a, 정수 b, 정수 c)
{
번호1 = 에이;
숫자2 = b;
숫자 3 = c;
}
// //계산 방법 선언합집합
정수 결과()
{
반품숫자1 + 숫자2 + 숫자3;
}
};
정수 메인()
{
// //첫 번째 포인터 선언
unique_ptr 포인터1(새로운 추가(오분의 사,55,30));

비용<<'첫 번째 포인터를 사용한 합계 결과 :'<결과() <<'N';
// //두 번째 포인터 선언
unique_ptr 포인터2;
// //첫 번째 포인터를 두 번째 포인터로 이동
포인터2 = 이동(포인터1);

비용<<'두 번째 포인터를 사용한 합계 결과 :'<결과() <<'N';
반환0;
}

산출:

위의 코드를 실행하면 다음 출력이 나타납니다. 45, 55, 30의 합은 두 포인터 모두에 대해 인쇄된 130입니다.

예제 2: 생성자와 소멸자를 사용하여 클래스의 포인터 객체 생성

생성자와 소멸자를 사용하여 클래스의 고유 포인터 객체를 선언하는 방법은 다음 예제와 같습니다. 클래스에는 하나의 인수가 있는 생성자, 클래스 변수 값에 대한 Display()라는 공용 메서드, 클래스의 개체를 삭제하기 전에 소멸 메시지를 인쇄하는 소멸자가 포함됩니다. Display() 메서드는 코드에서 고유한 포인터 개체를 만든 후 호출됩니다.

// //필요한 라이브러리 포함

#포함하다

#포함하다

네임스페이스 표준 사용;

// //클래스 정의
클래스 고객
{
문자열 이름;

공공의:
// //생성자 선언
고객(문자열 n)
{
이름 = n;
비용<<'자원이 할당되었습니다.N';
}

// //고객명을 출력하는 메소드 선언
보이드 디스플레이()
{
비용<<'고객의 이름은 '<<이름<<'N';
}

// //소멸자 선언
~고객()
{
비용<<'자원이 파괴되었습니다.N';
}
};
정수 메인()
{
// //unique_ptr이 소유한 Resource 개체를 할당합니다.
unique_ptruPointer{신규 고객('미르 압바스') };
유포인터->표시하다();
반환0;
}

산출:

위의 코드를 실행하면 다음 출력이 나타납니다.

예 3: 소유권 이전 후 포인터 확인

고유 포인터의 소유권을 확인하는 방법은 클래스의 고유 포인터를 두 개 생성하여 다음 예제와 같습니다. 두 개의 문자열 변수와 공용 메서드가 있는 클래스가 코드에서 선언되었습니다. 클래스의 Book_details() 메서드는 클래스의 첫 번째 고유 포인터 개체를 만든 후 호출됩니다. 다음으로 두 번째 고유 포인터 개체가 만들어지고 첫 번째 포인터가 첫 번째 포인터를 파괴하는 두 번째 포인터로 이동되었습니다. 두 포인터의 소유권은 나중에 확인해야 합니다.

// //필요한 라이브러리 포함

#포함하다

#포함하다

네임스페이스 표준 사용;

// //클래스 정의
교과서{

문자열 제목 ='C++ 프로그래밍 언어';
문자열 작성자 ='비얀 스트루스트럽';

공공의:
// //책 세부 정보를 인쇄하는 메서드 선언
voidBook_details()
{
비용<<'책 이름: '<<제목<<'N';
비용<<'작가 이름: '<<작가<<'N';
}
};
정수 메인()
{
// //첫 번째 포인터 선언
unique_ptr 포인터1(새 책());

포인터1->Book_details();
// //두 번째 포인터 선언
unique_ptr 포인터2;
// //첫 번째 포인터를 두 번째 포인터로 이동
포인터2 = 이동(포인터1);

// //첫 번째 포인터 확인
만약 (static_cast(포인터1))비용<<'첫 번째 포인터는 null이 아닙니다.N';
다른 사람<<'첫 번째 포인터는 null입니다.N';
// //두 번째 포인터 확인
만약 (static_cast(포인터2))비용<<'두 번째 포인터는 null이 아닙니다.N';
다른 사람<<'두 번째 포인터는 null입니다.N';

반환0;
}

산출:

위의 코드를 실행하면 다음 출력이 나타납니다. 출력에 따르면 첫 번째 포인터의 소유권이 제거되었으며 메시지, 첫 번째 포인터가 null입니다. 첫 번째 포인터에 대해 인쇄되었습니다. 두 번째 포인터의 소유권이 존재하고 메시지, 첫 번째 포인터가 null이 아닙니다. 두 번째 포인터에 대해 인쇄했습니다.

결론:

C++ 프로그래밍에서 고유 포인터를 사용하는 목적은 여러 예제를 사용하여 이 자습서에서 설명되었습니다. 고유 포인터를 생성하는 방법, 포인터의 소유권을 이전하는 방법, 포인터의 현재 소유권을 확인하는 방법은 독자가 고유 포인터의 올바른 사용법을 알 수 있도록 설명합니다.