次の方法で共有


new で割り当てたオブジェクトの初期化

オプションの initializer フィールドは、new 演算子の文法に含まれます。 これにより、新しいオブジェクトをユーザー定義コンストラクターで初期化できます。 初期化の実行方法の詳細については、「初期化」を参照してください。 次の例では、new 演算子で初期化式を使用する方法を説明します。

// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
    // Define default constructor and a constructor that accepts
    //  an initial balance.
    Acct() { balance = 0.0; }
    Acct( double init_balance ) { balance = init_balance; }
private:
    double balance;
};

int main()
{
    Acct *CheckingAcct = new Acct;
    Acct *SavingsAcct = new Acct ( 34.98 );
    double *HowMuch = new double ( 43.0 );
    // ...
}

この例では、オブジェクト CheckingAcct は new 演算子を使用して割り当てられますが、既定の初期化は指定されません。 したがって、Acct() クラスの既定のコンストラクターが呼び出されます。 その後、オブジェクト SavingsAcct は、同じように割り当てられます。ただし、明示的に 34.98 に初期化されます。 34.98 は double 型であるため、初期化を処理するために、その型の引数を受け取るコンストラクターが呼び出されます。 最後に、HowMuch 非クラス型は 43.0 に初期化されます。

オブジェクトがクラス型で、(前の例のように) そのクラスにコンストラクターがある場合、次の条件の 1 つが満たされる場合にのみオブジェクトを new 演算子で初期化できます。

  • 初期化子内に指定された引数は、コンストラクターの引数と一致します。

  • クラスには、既定のコンストラクター (引数を指定せずに呼び出すことができるコンストラクター) があります。

アクセス制御とあいまいさのコントロールは、「あいまいさ」と「特殊なメンバー関数を使用した初期化」に規定された規則に従って、operator new とコンストラクターで実行されます。

new 演算子を使用して配列を割り当てる場合は、明示的な要素ごとの初期化は実行できません。既定のコンストラクターがあれば、このコンストラクターのみ呼び出されます。 詳細については、「既定の引数」を参照してください。

メモリの割り当てに失敗すると (operator new が値 0 を返す)、初期化は行われません。 これによって、存在しないデータを初期化しようとすることを防止できます。

関数呼び出しの場合と同様に、初期化された式が評価される順序は定義されていません。 さらに、メモリの割り当てが実行される前に、これらの式が完全に評価されるものとして信頼しないでください。 メモリの割り当てに失敗し、new 演算子がゼロを返すと、初期化子の一部の式は完全に評価されない場合があります。

参照

関連項目

new 演算子 (C++)