이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

클로 피

이동 의미 체계는 RAII 클래스에 적합합니다. 그들은 무거운 사본의 비용없이 가치 의미론을 가진 것처럼 프로그래밍 할 수 있습니다. 이에 대한 좋은 예 는 함수에서 std :: vector를 반환하는 것 입니다. 그러나 값 의미론을 사용한 프로그래밍은 유형이 원시 데이터 유형처럼 작동 할 것으로 예상한다는 것을 의미합니다. 이 두 가지 측면은 때때로 상충되는 것처럼 보입니다.

한편으로 RAII에서는 기본 생성자가 완전히 초기화 된 개체를 반환하거나 리소스 획득에 실패한 경우 예외를 throw 할 것으로 예상합니다. 이렇게하면 생성 된 모든 객체가 유효하고 일관된 상태 (즉, 사용하기에 안전함)가됩니다.

반면에 이동 의미론을 사용하면 객체가 유효하지만 지정되지 않은 상태 에있는 지점이 있습니다 . 마찬가지로 기본 데이터 유형은 초기화되지 않은 상태 일 수 있습니다. 따라서 값 의미 체계를 사용하면 기본 생성자가이 유효하지만 지정되지 않은 상태에서 개체를 생성하여 다음 코드가 예상되는 동작을 가질 것으로 예상합니다.

// Primitive Data Type, Value Semantics
int i;
i = 5;

// RAII Class, Move Semantics
Resource r;
r = Resource{/*...*/}

두 경우 모두 "무거운"초기화가 한 번만 발생할 것으로 예상합니다. 이것에 대한 모범 사례가 무엇인지 궁금합니다. 분명히 두 번째 접근 방식에는 약간의 실질적인 문제가 있습니다. 기본 생성자가 지정되지 않은 상태에서 개체를 만드는 경우 리소스를 획득하지만 추가 매개 변수를 사용하지 않는 생성자를 어떻게 작성합니까? (태그 발송이 떠오른다 ...)

편집 : 일부 답변은 클래스가 원시 데이터 유형처럼 작동하도록 시도하는 이유에 의문을 제기했습니다. 내 동기 중 일부는 Alexander Stepanov의 Efficient Programming with Components 에서 비롯됩니다 . 여기서 그는 정규 유형에 대해 이야기합니다. 특히 다음과 같이 인용하겠습니다.

c [내장 유형의 경우]에서 자연스러운 관용적 표현이 무엇이든 일반 유형에 대한 자연스러운 관용적 표현이어야합니다.

그는 계속해서 위와 거의 동일한 예를 제공합니다. 그의 주장이이 맥락에서 유효하지 않습니까? 내가 잘못 이해하고 있습니까?

편집 : 많은 토론이 없었기 때문에 가장 높은 표를 얻은 답변을 수락하려고합니다. 기본 생성자에서 "moved-from like"상태로 객체를 초기화하는 것은 좋은 생각이 아닐 것입니다. 기존 답변에 동의 한 모든 사람이 그 동작을 기대하지 않기 때문입니다.

벤자민 린들리

그러나 값 의미론을 사용한 프로그래밍은 유형이 원시 데이터 유형처럼 작동 할 것으로 예상한다는 것을 의미합니다.

키워드 "like". "동일"하지 않습니다.

따라서 값 의미론을 사용하면 기본 생성자가이 유효하지만 지정되지 않은 상태에서 개체를 생성 할 것으로 예상합니다.

왜 그렇게 기대해야하는지 모르겠습니다. 나에게는 그다지 바람직한 기능이 아닌 것 같습니다.

이것에 관한 모범 사례는 무엇입니까?

POD가 아닌 클래스가 원시 데이터 유형과 공통으로이 기능을 공유해야한다는 생각은 잊어 버리십시오. 방향이 잘못되었습니다. 매개 변수없이 클래스를 초기화하는 현명한 방법이없는 경우 해당 클래스에는 기본 생성자가 없어야합니다.

객체를 선언하고 싶지만 초기화를 보류하고 싶다면 (아마도 더 깊은 범위에서) std::unique_ptr.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

분류에서Dev

"이 클래스에는 기본 생성자가 있어야합니다."[Android]

분류에서Dev

super ()를 사용하여 기본 클래스 생성자에 액세스해야하는 이유는 무엇입니까?

분류에서Dev

파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

분류에서Dev

통합 또는 통합 유사 클래스에 대해 기본 생성자가 삭제되는 이유는 무엇입니까?

분류에서Dev

기본 클래스의 기본 소멸자는 멤버가있는 경우 자식 클래스의 이동 생성자를 비활성화합니다.

분류에서Dev

생성자 내부 또는 외부에서 클래스 속성의 기본값을 설정하는 것의 차이점은 무엇입니까?

분류에서Dev

기본 클래스의 멤버가 생성자에서 처음 초기화 된 값을 유지하지 않는 이유는 무엇입니까?

분류에서Dev

기본 생성자가없는 가상베이스에서 클래스 파생

분류에서Dev

모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

분류에서Dev

선언을 사용하여 생성 된 생성자가 기본 클래스와 동일한 액세스 수준을 갖는 이유는 무엇입니까?

분류에서Dev

다른 클래스의 이동 생성자 내부에서 이동 클래스 (기본 생성자 없음)

분류에서Dev

기본 클래스에서 정의한 후 파생 클래스에서 동일한 인터페이스를 정의해야합니까?

분류에서Dev

참조 클래스 생성기는 클래스 자체와 동일한 이름을 가져야합니까?

분류에서Dev

기본 클래스 생성자가 값을 설정하지 않는 이유는 무엇입니까?

분류에서Dev

Compass / Blueprint Grid에 시맨틱 클래스 이름을 사용하지 않는 이유는 무엇입니까?

분류에서Dev

파생 클래스의 복사 생성자를 정의하려면 기본 클래스의 기본 생성자를 정의해야하는 이유는 무엇입니까?

분류에서Dev

기본 클래스의 함수에서 파생 클래스의 유형을 얻는 방법이 있습니까?

분류에서Dev

기본 클래스에서 파생 클래스 멤버를 사용해야하는 클래스를 디자인하는 방법은 무엇입니까?

분류에서Dev

암시 적 슈퍼 생성자 Num ()은 기본 생성자에 대해 정의되지 않습니다. 명시 적 생성자를 정의해야합니다.이 뒤에 논리는 무엇입니까?

분류에서Dev

기본 클래스의 가상 성이 복사 생성자의 동작을 변경하는 이유 / 방법은 무엇입니까?

분류에서Dev

파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

분류에서Dev

C ++에서 이니셜 라이저 목록에서 기본 클래스의 템플릿 인수를 반복해야하는 이유는 무엇입니까?

분류에서Dev

기본 클래스 생성자로 이동하기 전에 unique_ptr에서 원시 포인터를 어떻게 추출 할 수 있습니까?

분류에서Dev

내 기본 클래스의 정적 생성자가 호출되지 않는 이유는 무엇입니까?

분류에서Dev

기본 클래스 생성자를 호출 할 수없는 이유는 무엇입니까?

분류에서Dev

모든 기본 클래스 생성자가 호출되지 않는 이유는 무엇입니까?

분류에서Dev

기본 클래스에서 파생 클래스 특성을 사용하는 방법은 무엇입니까? 씨#

Related 관련 기사

  1. 1

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  2. 2

    이동 시맨틱이있는 RAII 클래스에서 기본 생성자는 무엇을해야합니까?

  3. 3

    "이 클래스에는 기본 생성자가 있어야합니다."[Android]

  4. 4

    super ()를 사용하여 기본 클래스 생성자에 액세스해야하는 이유는 무엇입니까?

  5. 5

    파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

  6. 6

    통합 또는 통합 유사 클래스에 대해 기본 생성자가 삭제되는 이유는 무엇입니까?

  7. 7

    기본 클래스의 기본 소멸자는 멤버가있는 경우 자식 클래스의 이동 생성자를 비활성화합니다.

  8. 8

    생성자 내부 또는 외부에서 클래스 속성의 기본값을 설정하는 것의 차이점은 무엇입니까?

  9. 9

    기본 클래스의 멤버가 생성자에서 처음 초기화 된 값을 유지하지 않는 이유는 무엇입니까?

  10. 10

    기본 생성자가없는 가상베이스에서 클래스 파생

  11. 11

    모든 기본 인수가있는 명시 적 생성자는 동일한 클래스의 다른 생성자에서 호출 할 수 없습니다.

  12. 12

    선언을 사용하여 생성 된 생성자가 기본 클래스와 동일한 액세스 수준을 갖는 이유는 무엇입니까?

  13. 13

    다른 클래스의 이동 생성자 내부에서 이동 클래스 (기본 생성자 없음)

  14. 14

    기본 클래스에서 정의한 후 파생 클래스에서 동일한 인터페이스를 정의해야합니까?

  15. 15

    참조 클래스 생성기는 클래스 자체와 동일한 이름을 가져야합니까?

  16. 16

    기본 클래스 생성자가 값을 설정하지 않는 이유는 무엇입니까?

  17. 17

    Compass / Blueprint Grid에 시맨틱 클래스 이름을 사용하지 않는 이유는 무엇입니까?

  18. 18

    파생 클래스의 복사 생성자를 정의하려면 기본 클래스의 기본 생성자를 정의해야하는 이유는 무엇입니까?

  19. 19

    기본 클래스의 함수에서 파생 클래스의 유형을 얻는 방법이 있습니까?

  20. 20

    기본 클래스에서 파생 클래스 멤버를 사용해야하는 클래스를 디자인하는 방법은 무엇입니까?

  21. 21

    암시 적 슈퍼 생성자 Num ()은 기본 생성자에 대해 정의되지 않습니다. 명시 적 생성자를 정의해야합니다.이 뒤에 논리는 무엇입니까?

  22. 22

    기본 클래스의 가상 성이 복사 생성자의 동작을 변경하는 이유 / 방법은 무엇입니까?

  23. 23

    파생 클래스의 const 값을 기본 예기치 않은 동작의 생성자에 전달하는 C ++

  24. 24

    C ++에서 이니셜 라이저 목록에서 기본 클래스의 템플릿 인수를 반복해야하는 이유는 무엇입니까?

  25. 25

    기본 클래스 생성자로 이동하기 전에 unique_ptr에서 원시 포인터를 어떻게 추출 할 수 있습니까?

  26. 26

    내 기본 클래스의 정적 생성자가 호출되지 않는 이유는 무엇입니까?

  27. 27

    기본 클래스 생성자를 호출 할 수없는 이유는 무엇입니까?

  28. 28

    모든 기본 클래스 생성자가 호출되지 않는 이유는 무엇입니까?

  29. 29

    기본 클래스에서 파생 클래스 특성을 사용하는 방법은 무엇입니까? 씨#

뜨겁다태그

보관