0

C++の配列にC++11(std :: array)までメンバー関数size()がなかったのはなぜですか?この背後にある理由は何でしたか?「配列のサイズを取得する方法」などの質問。かなり頻繁です。

エディション プレーン配列はCから継承されているので、そのような機能がない理由は何ですか?配列内のデータの種類を確認できるので。

4

5 に答える 5

4

それらはCから来ており、Cにはメンバー関数がないためです(配列もクラス型でもありません)。

既存のCコードベースをC++としてコンパイルできるようにすることで、言語の採用率が大幅に向上したため、Cとの互換性が最も重要でした。新しい言語機能を設計する場合、互換性を心配しながら機能するものをいじることは優先順位リストでは低かった。

C ++ 11では、言語はこれらすべての素敵な小さなものが生まれるまでになりました。では、今すぐ追加してみませんか?C配列はまだ問題なく動作し、それを変更するのは大変な作業になるからです。新しいコンテナ(およびその非常に単純なコンテナ)を導入する方がはるかに簡単であり、まさにそれが起こったのです。

于 2013-02-26T20:56:34.703 に答える
2

std::array他のコンテナクラスと同様に、テンプレートクラスです。プレーン配列には、C++11のメンバーはまだありません。

プレーン配列はCから継承されているので、そのような機能がない理由は何ですか?

演算子を使用して、プレーン配列の要素の量を確認できます。sizeof

int a[10];
std::cout << sizeof(a) / sizeof(*a);

これにより、「10」が出力されます。配列とポインタを混同している可能性があります。ここ:

int* a = new int[10];

a配列ではありません。それはポインタです。

于 2013-02-26T20:57:21.360 に答える
2

プリミティブ配列はオブジェクトではないため、メンバー関数はありません。はstd::array配列をラップするクラスであるため、配列の長さを取得するためのメンバー関数とロジックを持つことができます。

次のような配列を宣言する場合:

int * myArray = new int[5];

その長さを取得する方法はありません。

于 2013-02-26T20:57:36.530 に答える
2

C ++の配列(std :: arrayではない)はCの配列と同じです。これらは、メモリ内に(同じタイプの)データを保持するために割り当てられたメモリの連続した領域です。

タイプは、int、float、charなどのプリミティブデータ型、または構造やクラスなどの複雑なデータ型にすることができます。配列の要素へのアクセスは、次のように変換されます。

base address + (sizeof(datatype) * index)

対照的に、std :: arrayは、配列アクセスのために[]演算子をオーバーロードするクラスであり、サイズを取得するための特別なメソッドがあります。std::vectorと非常によく似ています。内部的には、これらのクラスは配列を使用して要素にアクセスする場合がありますが、[]演算子をオーバーロードすることで巧妙に隠されています。

于 2013-02-26T20:59:21.907 に答える
1

C配列には、既知の取得可能なサイズがあります。これは、sizeofオペレーターがアクセスします。配列とポインタを混乱させているようです。ポインターが指しているメモリのブロックの大きさはもうわかりません。ダウニング街10番地に住んでいると言ったら、通りに家がいくつあるかを教えてください。

C配列は、実際にはポインタの特殊なケースにすぎません。それらはスタックに直接割り当てられ、宣言された元の配列変数が表示されている間、コンパイラーは配列のサイズを通知できます。ただし、配列は頻繁にポインタに分解されます。これは、別のメソッドに渡されたか、別の変数に格納されたことが原因である可能性があります。これが発生すると、コンパイラーはポインターが配列を指していることを100%確信できなくなるため(つまり、すべての場合)、ポインターによって参照される配列のサイズを知ることができなくなります。

于 2013-02-26T21:28:42.923 に答える