C.40:クラスは不変を持っている場合は、コンストラクタを定義します。
C.40:クラスが含まれている場合は不変が定義されているコンストラクタ
理由(理由)
これは、コンストラクタはのためにあるものです。
これは、存在コンストラクタの目的です。
実施例(実施例)
class Date { // a Date represents a valid date
// in the January 1, 1900 to December 31, 2100 range
Date(int dd, int mm, int yy)
:d{dd}, m{mm}, y{yy}
{
if (!is_valid(d, m, y)) throw Bad_date{}; // enforce invariant
}
// ...
private:
int d, m, y;
};
多くの場合、コンストラクタに保証さとして不変を表現するのは良いアイデアです。
コンストラクタでは不変で、性能を確認してください通常は良いアイデアです。
Note(注意)
コンストラクタは、クラスは不変を持っていない場合でも、利便性のために使用することができます。例えば:
便宜上、不変が含まれていないクラスは、クラスのコンストラクタのために定義されていても。
struct Rec {
string s;
int i {0};
Rec(const string& ss) : s{ss} {}
Rec(int ii) :i{ii} {}
};
Rec r1 {7};
Rec r2 {"Foo bar"};
Note(注意)
C ++ 11リストルール初期化子は、多くのコンストラクタが不要になります。例えば:
C ++ 11の排除多くのコンストラクタの必要性初期化リスト。例えば:
struct Rec2{
string s;
int i;
Rec2(const string& ss, int ii = 0) :s{ss}, i{ii} {} // redundant
};
Rec2 r1 {"Foo", 7};
Rec2 r2 {"Bar"};
REC2コンストラクタは冗長です。また、int型のデフォルトは、より良いメンバー初期化子として行われることになります。
REC2コンストラクタは冗長です。一方、メンバーの初期化int型で提供されるデフォルト値が有利になるだろう。
参照:構文有効なオブジェクトとコンストラクタがスローされます。
[ビルド]と[法的なオブジェクトのコンストラクタが例外をスロー]:も参照してください。
関連リンク
メンバー初期化子:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-in-class-initializer
法律上のオブジェクトの構築:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-complete
コンストラクタが例外をスローします。
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-throw
施行(提案)
-
旗、ユーザー定義のコピー操作を持つクラスが、コンストラクタ(ユーザー定義のコピーはクラスが不変であることを示す良い指標です)
-
このクラスは、ユーザ定義の操作が含まれていますが(ユーザー定義の明確な指示のコピーがクラスで不変である)コピーコンストラクタを提供しない場合
説明リンク
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c40-define-a-constructor-if-a-class-has-an-invariant
私はこの記事は参考になりましだと思いますか?ようこそ親指アップし、より多くの人と共有することができます。
より多くの更新の記事を読む、オブジェクト指向の考え方のマイクロチャンネル公衆数にしてください注意を払います[]