할당 연산자(C++)

Assignment operator (C++)

C++프로그래밍 언어에서 할당 연산자는=할당에 사용되는 연산자입니다.C++의 대부분의 다른 연산자와 마찬가지로 과부하가 될 수 있습니다.

할당 연산자」라고 불리는 카피 할당 연산자는, 송신원(오른쪽)과 행선지(왼쪽)가 같은 클래스 타입의 할당 연산자의 특수한 경우입니다.이것은 특별한 멤버 함수 중 하나이며, 이는 프로그래머가 디폴트 버전을 선언하지 않을 경우 컴파일러에 의해 자동으로 생성되는 것을 의미합니다.디폴트 버전에서는 멤버별 복사가 실행됩니다.각 멤버는 독자적인 복사 할당 연산자에 의해 복사됩니다(프로그래머 선언 또는 컴파일러 생성도 가능합니다).

복사 할당 연산자는 할당 대상의 데이터 구성원을 정리해야 하며(및 자체 할당을 올바르게 처리해야 함) 복사 생성자는 초기화되지 않은 데이터 [1]구성원에 값을 할당해야 한다는 점에서 복사 생성자와 다릅니다.예를 들어 다음과 같습니다.

My_Array(My_Array) 첫번째;           // 기본 생성자에 의한 초기화 My_Array(My_Array) 둘째(첫번째);   // 복사 생성자에 의한 초기화 My_Array(My_Array) 셋째 = 첫번째;   // 또한 복사 생성자에 의한 초기화 둘째 = 셋째;           // 복사 할당 연산자에 의한 할당 

오버로드된 할당 연산자의 반환 값

언어를 사용하면 오버로드된 할당 연산자가 임의의 반환 유형(다음 포함)을 가질 수 있습니다.void단, 일반적으로 연산자는 피할당자에게 참조를 반환하도록 정의됩니다.이것은 삽입형(할당값 되돌리기)에 대한 할당 연산자의 동작과 일치하며, 예를 들어 제어문이나 체인 할당에서 연산자 호출을 식으로서 사용할 수 있습니다.또한 C++ 표준 라이브러리에서는 일부 사용자 제공 유형에 [2]대해 이 동작이 필요합니다.

복사 할당 연산자를 오버로드하는 중

물체의 깊은 복사를 해야 경우 예외적인 안전성을 고려해야 한다.자원 할당 해제가 실패하지 않을 때 이를 실현하는 한 가지 방법은 다음과 같습니다.

  1. 새로운 자원의 취득
  2. 오래된 자원의 해방
  3. 개체에 새 리소스 핸들 할당
학급 My_Array(My_Array){     인트* 배열;     인트 세어보세요; 일반의:     My_Array(My_Array)& 교환입니다.=(컨스턴트 My_Array(My_Array)& 다른.)     {         한다면 (이것. != &다른.) { // 무효 자기 평가로부터 보호             // 1: 새 메모리 할당 및 요소 복사             인트* new_array = 신규 인트[다른..세어보세요];             표준::알았다.(다른..배열, 다른..배열 + 다른..세어보세요, new_array);              // 2: 오래된 메모리 할당 해제             삭제하다[] 배열;              // 3: 새 메모리를 개체에 할당합니다.             배열 = new_array;             세어보세요 = 다른..세어보세요;         }         // 관례상 항상 반환 *this         돌아가다 *이것.;     }     // ... }; 

단, 모든 멤버서브오브젝트에 대해 no-fail(no-throw) 스왑 함수를 사용할 수 있으며 클래스가 복사 컨스트럭터디스트럭터를 제공하는 경우(3개의 규칙에 따라 수행해야 함) 복사 할당을 구현하는 가장 간단한 방법은 다음과 같습니다.[3]

일반의:      무효 바꾸다(My_Array(My_Array) & 다른.) // 스왑 멤버 기능(실패하면 안 됩니다!)     {         // 모든 멤버(및 해당되는 경우 기본 서브 오브젝트)를 다른 멤버와 스왑합니다.         사용. 표준::바꾸다; // 컴파일러는 ADL을 사용하기 때문에         // 멤버의 커스텀스왑(존재하는 경우)         // 표준으로 폴백:: 예         바꾸다(배열, 다른..배열);         바꾸다(세어보세요, 다른..세어보세요);     }      My_Array(My_Array) & 교환입니다. = (My_Array(My_Array) 다른.) // 참고: 인수가 값으로 전달되었습니다!     {         // 이것을 다른 것과 스왑합니다.         바꾸다(다른.);          // 관례상 항상 반환 *this         돌아가다 *이것.;          // 다른 것이 파괴되어 메모리가 해방됩니다.     } 

다른 클래스 간의 할당

C++는 타깃인스턴스 클래스가 소스인스턴스 클래스의 상위인 경우 암묵적인 복사 컨스트럭터와 할당 연산자를 통해 서로 다른 클래스 간의 할당을 지원합니다.

학급 조상 { 일반의:     인트 a; };  학급 후예 : 일반의 조상 { 일반의:     인트 b; };  인트 주된() {     후예 d;     조상 a(d);     조상 b(d);     a = d; } 

상위 개체에서 하위 개체로 복사할 수 없으며, 하위 개체의 필드가 초기화되지 않은 상태로 남아 있을 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Stroustrup, Bjarne (2000). The C++ Programming Language (3 ed.). Addison-Wesley. p. 244. ISBN 978-0-201-70073-2.
  2. ^ 작업 초안, 프로그래밍 언어 C++ 표준, 섹션 17.6.3.1, 표 23; http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
  3. ^ Sutter, H.; Alexandrescu, A. (October 2004), C++ Coding Standards, Addison-Wesley, ISBN 0-321-11358-6

외부 링크