1

私の懸念は、デフォルトのコンストラクターとその初期化リストです。単純なケースでは、次のように明確です。

class A
{
  protected:
       double d1;
       //classB obj1; //how to initialize this one in a default constructor?
  public:
       A (double x = 0.0): d1(x){} //constructor
       virtual ~A(void) {};
  //something
}

しかし、大量のメンバを持つ classB のオブジェクトを初期化するにはどうすればよいでしょうか。または、一般的に、初期化するパラメーターの量が多いか不明なタイプをデフォルトのコンストラクターで初期化する方法は?

4

3 に答える 3

1

member initializer listデフォルトのコンストラクターまたは他のコンストラクターを呼び出すことで、 obj1 を初期化できます。

class A
{
  protected:
       double d1;
       classB obj1; 
       pthread_mutex_t m_mutex;
  public:
       A (double x = 0.0): d1(x), obj1(), m_mutex(PTHREAD_MUTEX_INITIALIZER) {} 
       virtual ~A(void) {}
       //something
}

あなたが説明したようにclassBに大きなメンバーがいる場合、クラス設計のルールを破る可能性があります- one class does one thing. classB を小さな独立したクラスに分割したい場合があります。

于 2012-12-07T12:04:52.177 に答える
1

オブジェクトを明示的に初期化したい場合は、コンストラクターの初期化リストに追加するだけです。

struct Foo
{
    Foo(int arg) { ... }
};

struct Bar
{
    Foo foo;

    Bar()
        : foo(123)  // Initialize `foo` with an argument
    { ... }
};
于 2012-12-07T12:05:02.867 に答える
1

デフォルトのコンストラクターでメンバーを初期化できる場合、デフォルトのコンストラクターにはパラメーターがないため、メンバーを初期化リストに含める必要さえありません。デフォルトのコンストラクターが呼び出されます。プリミティブにはデフォルトのコンストラクターがないため、初期化する場合は初期化リストに含める必要があります。

于 2012-12-07T12:12:37.890 に答える