#include <iostream>
#using <mscorlib.dll>
ref class A {
public:
int field;
};
int main(array<System::String ^> ^args)
{
array<int>^ objectI = gcnew array<int>(5);
//array は配列の情報を持つオブジェクトのハンドル
//c の配列の様に配列の先頭を示す物ではない
//int は自動的に 0 で初期化される
array<A^>^ objectA = gcnew array<A^>(5);
//配列が参照クラスの時は、ハンドルを配列にもつ
//この時点では配列の中身は nullptr なので中身も初期化する
for each(A^% obj in objectA)
obj = gcnew A();
//配列の数分 gcnew で確保する
//for each 内で A^% としないと objectA は初期化できない
//A^ obj だと
//1. ローカル変数 obj に objectA 内の 配列の要素 A^ がコピーされる
//2. obj に gcnew で新しいハンドルが入る
//3. obj は objectA 内の配列の要素 A^ とは別の変数なので objectA の要素は初期化されない
//A^% obj だと
//1. トラッキング参照 obj が objectA 内の 配列の要素 A^ のエイリアスとなる
//2. obj に gcnew で新しいハンドルが入る
//3. obj は objectA 内の配列の要素 A^ その物なので objectA の要素は初期化される
for each(int% n in objectI)
n++;
//とにかく配列そのものに手を加えたい場合は参照をつかう
getchar();
return 0;
}