C ++ 핵심 원칙 C.44 : 기본적 생성자는 간단하고 최선을 던져하지 않습니다

C.44는 :로 기본 생성자를 선호 간단하고 비 던지기

C.44 : 기본 생성자는 간단하고 최선을 던져하지 않습니다

 

이유 (이유)

이동 작업에 대한 단순화의 오류 처리와 추론을 실패 할 수 있습니다 작업없이 "기본"에 값을 설정할 수 있다는.

요약 기본 생성자가 동작 불량을 초래하지 않고 디폴트 상태로 설정 될 수 있고, 오류 처리를 단순화하고, 이동 동작의 추정.

 

예, 문제 (샘플 질문)

template<typename T>
// elem points to space-elem element allocated using new
class Vector0 {
public:
    Vector0() :Vector0{0} {}
    Vector0(int n) :elem{new T[n]}, space{elem + n}, last{elem} {}
    // ...
private:
    own<T*> elem;
    T* space;
    T* last;
};

이것은 좋은 및 일반이지만, 오류가 발생한 후 비우기 위해 Vector0을 설정하면 실패 할 수 있습니다 할당을 포함한다. 또한, 벡터로서 표현되는 기본 가진 {새로운 T [0], 0, 0} 낭비 보인다. 예를 들어, Vector0 <INT> V [100] (100 개) 할당을 요한다.

이 코드는 깨끗하고 보통이지만, 실패 할 수 있습니다 메모리 할당과 관련된 오류 후 빈 Vector0 객체를 생성 한 경우. 동시에, 기본 그래서 벡터는 {새로운 T [0], 0, 0} 일부 폐기물을 보였다. 예컨대 Vector0 <INT> V [100] (100)에 필요한 메모리 할당.

 

(100) 메모리 할당 문제가 보인다. 번역기 이해는 한 주 유통 공간으로 100 개 정수 잘입니다.

또한, 새로운 T [0] 이상.

 

실시 예 (실시 예)

template<typename T>
// elem is nullptr or elem points to space-elem element allocated using new
class Vector1 {
public:
    // sets the representation to {nullptr, nullptr, nullptr}; doesn't throw
    Vector1() noexcept {}
    Vector1(int n) :elem{new T[n]}, space{elem + n}, last{elem} {}
    // ...
private:
    own<T*> elem = nullptr;
    T* space = nullptr;
    T* last = nullptr;
};

사용 {nullptr은 nullptr은 nullptr은} Vector1 {} 저렴하지만, 특별한 경우를 만들고 런타임 검사를 의미한다. 오류를 감지 한 후 비우기 위해 Vector1을 설정하는 것은 간단하다.

사용 Vector1 {} 비용이 덜 {nullptr, nullptr, nullptr}하지만, 특별한 경우 (데이터가 생성되지 않기 때문에, 번역자 주)에 필요한 런타임 검사. 빈 처리 할 수있는 작은 일들을 오류 Vector1을 검출 한 후.

시행 (제안)

  • 플래그는 기본 생성자를 던지고.

  • 팁 던져 생성자 예외입니다.

 

설명 링크

 

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c44-prefer-default-constructors-to-be-simple-and-non-throwing

 


 

이 기사가 도움이 생각? 에 오신 것을 환영합니다 엄지 손가락은 더 많은 사람들과 공유 할 수 있습니다.

더 업데이트 된 기사를 읽고, 객체 지향 사고의 마이크로 채널 대중 번호로하시기 바랍니다에주의 []

게시 된 408 개 원래 기사 · 원 찬양 653 · 전망 290 000 +

추천

출처blog.csdn.net/craftsman1970/article/details/104464162