New演算子
C++/CLIでは、C++のnew演算子のほかに、マネージヒープから記憶域を確保するgcnew演算子が存在する。
gcnewには、配置構文は存在しない。
また、gcnewにはnew[]演算子に相当する配列構文も存在しない。CLI配列(マネージ配列)の作成には、arrayキーワード (cli::array型) を用いる。
ただし、gcnewには配列初期化の構文が存在する。
C++の場合、new演算子で記憶域確保に失敗すると、多くの場合、例外が投げられる。そのため、C言語関数のmallocなどと違い、newの結果は常に正当なオブジェクトを指し示しているものとして扱うことが可能である。ただし、古いコンパイラでは確保失敗時にNULLを返すものがあるので注意が必要である。また、組み込み用途など、コンパイラの設定で例外の使用を不可能にした場合も、確保に失敗したときはNULLが返却される。
C#およびJavaの場合、new演算子がnullを返すことはなく、必ず例外がスローされる。
C++やC++の影響を受けた言語では、概ね次のような構文となっている。
varは、作成されたインスタンスへの参照を保持するポインタ型もしくは参照型の変数である。Tは、作成されるインスタンスのデータ型を指定する。Tがクラス型の場合、Tのインスタンスを生成するためにデフォルトコンストラクタが呼ばれる。クラス以外の型を指定可能かどうかは言語による。
次のように、newでインスタンスを生成する際には、初期化子 (initializer) を指定できる。
initは初期化に用いる値を表す。Tがクラス型の場合、これを引数にしてコンストラクタが呼ばれる。
また、配列を作成することも可能である。なお、C++では、これをnew[]演算子として、new演算子と区別している。一方、JavaやC#では、new演算子の構文の一種として扱っている。
sizeは、作成する要素数を指定する。なお、C++やC#では、次のようにnewした配列に初期化子を与えられる。
C++では、初期化子リストの要素数よりもsizeが大きい場合、残りの要素はゼロもしくはデフォルトコンストラクタで初期化される。
C#では、初期化子リストの要素数とsizeは同じでなければならないが、初期化子を指定すればsizeは省略可能である。
Javaでは、初期化子を指定する場合はsizeを指定できない。
また、JavaやC#の配列は、常にnew演算子でヒープに作られる存在であり、(2)のような配列変数の初期化は、(1)に対する糖衣構文となっている。