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 <整数> V [100]は100個の割り当てがかかります。

このコードは、清潔で普通ですが、失敗する可能性があり、メモリの割り当てに関連するエラーの後に空Vector0オブジェクトを生成していた場合。同時に、デフォルトのでベクトルは{新しいT [0]、0、0}いくつかの廃棄物を示しました。例えばVector0 <整数> 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}を使用すると、ベクトル2 {}安いが、特殊なケースを行い、実行時チェックを意味しています。エラーを検出した後、空にするベクトル1を設定することは簡単です。

使用ベクトル2 {}コストそれほど{nullptr、nullptr、nullptr}が、特別な場合(データが生成されないため、翻訳者注)必要なランタイムチェック。空のハンドルにささいなことをエラーベクトル1を検出した後。

施行(提案)

  • フラグはデフォルトコンストラクタを投げます。

  • ヒントスローコンストラクタ例外。

 

説明リンク

 

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