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 演算子がゼロを返すと、初期化子の一部の式は完全に評価されない場合があります。