programing tip

C ++에서 사소하지 않은 생성자는 무엇입니까?

itbloger 2020. 11. 24. 07:44
반응형

C ++에서 사소하지 않은 생성자는 무엇입니까?


나는 이것을 읽고 있었다 http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data

사소한 기본 생성자, 사소한 복사 생성자, 복사 할당 연산자, 사소한 소멸자를 언급합니다. 사소하고 사소하지 않은 것은 무엇입니까?


간단히 말해서 "사소한"특수 멤버 함수는 문자 그대로 매우 간단한 방식으로 작업을 수행하는 멤버 함수를 의미합니다. "직접적인 방식"은 특별한 멤버 함수의 종류에 따라 다른 것을 의미합니다.

기본 생성자와 소멸자의 경우 "사소한"것은 문자 그대로 "아무것도하지 않음"을 의미합니다. 복사 생성자 및 복사 할당 연산자의 경우 "사소하다"는 것은 문자 그대로 "단순한 원시 메모리 복사와 동일 함"을 의미합니다 (예 :를 사용한 복사 memcpy).

생성자를 직접 정의하면 아무 작업도하지 않더라도 사소하지 않은 것으로 간주되므로 사소한 생성자는 컴파일러에 의해 암시 적으로 정의되어야합니다.

특별한 멤버 함수가 위의 요구 사항을 충족시키기 위해서는 클래스가 매우 단순한 구조를 가져야하며, 객체가 생성되거나 소멸 될 때 숨겨진 초기화가 필요하지 않아야하며, 복사 될 때 숨겨진 추가 내부 조작이 필요하지 않아야합니다.

예를 들어, 클래스에 가상 함수가있는 경우이 클래스의 객체가 생성 될 때 (가상 메서드 테이블 초기화 등) 숨겨진 추가 초기화가 필요하므로이 클래스의 생성자는 사소한 것으로 간주되지 않습니다.

또 다른 예로, 클래스에 가상 기본 클래스가있는 경우이 클래스의 각 개체에는 동일한 개체의 다른 부분을 가리키는 숨겨진 포인터가 포함될 수 있습니다. 이러한 자체 참조 객체는 단순 원시 메모리 복사 루틴 (예 :)으로 복사 할 수 없습니다 memcpy. 복사본에서 숨겨진 포인터를 올바르게 다시 초기화하려면 추가 조작이 필요합니다. 이러한 이유로이 클래스의 복사 생성자 및 복사 할당 연산자는 사소한 것으로 간주되지 않습니다.

명백한 이유로이 요구 사항은 재귀 적입니다. 클래스의 모든 하위 개체 (기본 및 비 정적 멤버)에도 간단한 생성자가 있어야합니다.


A 클래스의 생성자 는 다음이 모두 참이면 간단 합니다.

  • 암시 적으로 정의 됨 (컴파일러가 합성 됨)
  • A에는 가상 기능과 가상 기본 클래스가 없습니다.
  • A의 모든 직접 기본 클래스에는 간단한 생성자가 있습니다.
  • A의 모든 비 정적 데이터 멤버의 클래스에는 간단한 생성자가 있습니다.

이미 정답이 있지만 여기에 Standard의 인용문이 있습니다 (이 게시물을 보았을 때 찾고 있었음).

(§12.1 / 5) 기본 생성자는 사용자가 제공하지 않고 다음과 같은 경우 사소한 것입니다.
— 해당 클래스에 가상 함수가없고 (10.3) 가상 기본 클래스 (10.1)가없는 경우, 그리고 — 해당 클래스의
비 정적 데이터 멤버가 없습니다. 클래스에는 중괄호 또는 같음 이니셜 라이저가 있고
-클래스의 모든 직접 기본 클래스에는 간단한 기본 생성자가 있으며
-클래스 유형 (또는 배열) 인 클래스의 모든 비 정적 데이터 멤버에 대해 이러한 각 클래스에는 간단한 기본 생성자가 있습니다.

이것은 C ++ 11에서 가져온 것입니다. C ++ 03에는 두 번째 항목 없으며 user-provided 대신 암시 적으로 선언 된 구문을 사용합니다 . 그렇지 않으면 동일합니다.

이 사양은 사소한 기본 생성자 만 다룹니다. 단어 속성 trivial 은 복사 생성자와 같은 다른 컨텍스트에서도 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/3899223/what-is-a-non-trivial-constructor-in-c

반응형