DATE : 2006/10/02 (Mon)
(;´Д`)そういえば、配列については全然触れていませんでした。そこで、この記事で簡単に触れたいと思います。
Java では、配列は次のように生成します。
int[] numbers = new int[3];
配列の要素数は、変数や定数で指定することもできます。
int[] numbers = new int[count];
int[] numbers = new int[COUNT];
C++ の場合は、これまでにオブジェクトを生成してきた場合と同様に、静的に宣言する方法と動的に生成する方法があります。
静的に宣言するには、次のようになります。
int numbers[3];
ただし、静的に宣言する場合、変数を要素数の指定に使うことはできません。静的な宣言の場合に使えるのは、整数値と定数のみです。
ちなみに、定数は次のように宣言します。
static const int COUNT = 3;
(;^ω^)Java の static final と似ていますね。
初期化も同時に行うには、次の通りです。
int numbers[3] = {1, 2, 3};
また、動的に生成するには、次のようにします。
int* numbers = new int[3];
この場合は、変数も要素数の指定に使えます。
初期化も同時に行うには、次の通りです。
int* numbers = new int(1, 2, 3);
なお、動的に生成した配列を解放するには、次のようにします。
delete [] numbers;
delete の後に「[]」を付けるところがミソです。「[]」を付けない場合、配列全体のメモリは解放されますが、numbers が直接指すオブジェクト(numbers[0])のデストラクタしか呼ばれません。すると、numbers[1]~[9]のデストラクタが呼ばれず、メモリリークを起こす可能性があります。
ちなみに、Java の配列と C++ と配列には大きな違いが2つあります。
- C++ の配列は要素数を保持しない。
- C++ の配列の要素は未初期化状態。
Java では、次のようにすることで配列の要素数を取得できました。
numbers.length
しかし、C++ の配列そのものから要素数を取得する方法はありません。
また、Java の配列は、生成すると全要素が自動的に初期化されます。例えば、int 型の配列の場合は、生成時に全要素が0に初期化されます。
しかし、C++ の配列は、静的な宣言、動的な生成ともに要素が初期化されていません。そのため、配列を初期化する処理が必要になります。
(;^ω^)ここらへんは実に C らしいですね
ちなみに、C++ の標準ライブラリには vector というクラスがあります。このクラスは、要素数が動的に変わる配列を実現したもので、要素数を取得できたり、要素を追加・削除と言った処理も簡単に行えるようになります。
(;^ω^)そういえば、Java にも java.util.Vector というクラスがありました。