配列の作成中に、コンパイラはそのサイズを知る必要がありますか? たとえば、次のコード スニペットはコンパイルされません。
class A
{
int n;
int arr[n];
};
しかし、以下はコンパイルされます。
int main()
{
int n;
std::cin >> n;
int arr[n];
}
なんで?
配列の作成中に、コンパイラはそのサイズを知る必要がありますか? たとえば、次のコード スニペットはコンパイルされません。
class A
{
int n;
int arr[n];
};
しかし、以下はコンパイルされます。
int main()
{
int n;
std::cin >> n;
int arr[n];
}
なんで?
標準 C++ は可変長配列をサポートしていません。1
この動作が必要な場合std::vector
は、生の C スタイルの配列ではなく、 を使用することをお勧めします。
1. ただし、C99 または非標準の言語拡張でそれらを見つけることができます。
(1) A のインスタンスを作成するときに最初に行われるのはメモリの割り当てです。その時点ではメンバーn
は存在しないため、必要なメモリ量を知ることは不可能arr
です。
(2) スタック上に配列を作成します。これは、スタックポインタを少し移動するだけです。
可変サイズの配列を作成したい場合は、 を使用してヒープ上で作成する必要がありますnew
。整数を定数として宣言した場合は、これをそのまま使用できる唯一の方法です。
コンパイルの時点では、変数 n の値は不明です (指定されたアドレスの下のメモリにあったものです)。そのため、未知のサイズの変数を作成することはできません。2 番目のケースでは、cin (sin ではなく) を使用したため、サイズがわかります。