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
이 기사가 도움이 생각? 에 오신 것을 환영합니다 엄지 손가락은 더 많은 사람들과 공유 할 수 있습니다.
더 업데이트 된 기사를 읽고, 객체 지향 사고의 마이크로 채널 대중 번호로하시기 바랍니다에주의 []