タグ付けされた質問 「class-members」

10
メンバーデータでポインターまたは参照を優先する必要がありますか?
これは質問を説明するための単純化された例です: class A {}; class B { B(A& a) : a(a) {} A& a; }; class C { C() : b(a) {} A a; B b; }; したがって、BはCの一部を更新する責任があります。私はlintを介してコードを実行し、それは参照メンバーlint#1725を使用していました。これは、十分に公正なデフォルトのコピーと割り当てを処理することについて話しますが、デフォルトのコピーと割り当てもポインターに関して悪いので、そこにはほとんど利点がありません。 ネイキッドポインターは誰がそのポインターを削除する責任があるかについて不確実に導入するため、私は常に可能な限り参照を使用するようにしています。オブジェクトを値で埋め込むことを好みますが、ポインターが必要な場合は、ポインターを所有するクラスのメンバーデータでauto_ptrを使用し、オブジェクトを参照として渡します。 通常、メンバーデータでポインターを使用するのは、ポインターがnullになるか変更される可能性がある場合のみです。データメンバーの参照よりもポインターを優先する他の理由はありますか? 一度初期化されたリファレンスは変更されるべきではないので、リファレンスを含むオブジェクトは割り当て可能であるべきではないというのは本当ですか?

3
C ++ 11では、非静的メンバーと非定数メンバーのクラス内初期化が可能です。何が変わったの?
C ++ 11より前は、整数型または列挙型の静的constメンバーに対してのみクラス内初期化を実行できました。Stroustrupは、C ++ FAQでこれについて説明し、次の例を示しています。 class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral }; そして、次の理由: では、なぜこれらの不便な制限が存在するのでしょうか。クラスは通常、ヘッダーファイルで宣言され、ヘッダーファイルは通常多くの変換ユニットに含まれます。ただし、複雑なリンカールールを回避するために、C ++ではすべてのオブジェクトに一意の定義が必要です。C ++で、オブジェクトとしてメモリに格納する必要のあるエンティティのクラス内定義が許可されている場合、このルールは破られます。 ただし、C ++ 11はこれらの制限を緩和し、非静的メンバーのクラス内初期化を可能にします(§12.6.2/ 8)。 非委任コンストラクターで、特定の非静的データメンバーまたは基本クラスがmem-initializer-idで指定されていない場合(コンストラクターにctor-initializerがないためにmem-initializer-listがない場合を含む)エンティティが抽象クラス(10.4)の仮想基本クラスではない場合、 エンティティが中括弧または等しい初期化子を持つ非静的データメンバーである場合、エンティティは8.5で指定されているように初期化されます。 それ以外の場合、エンティティがバリアントメンバー(9.5)の場合、初期化は実行されません。 それ以外の場合、エンティティはデフォルトで初期化されます(8.5)。 セクション9.4.2では、非const静的メンバーがconstexpr指定子でマークされている場合、それらのクラス内初期化も許可されます。 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.