Effective C+(5)配列に関するいくつかの問題

1374 ワード

1.ポインタと配列は予期せぬエラーを生じやすい.一部は概念的な問題である:ポインタは低レベルの操作に用いられ、煩雑な細部に関連する(bookkeeping)エラーが発生しやすい.他のエラーは、ポインタを使用する構文規則、特にポインタを宣言する構文に由来します.
多くの有用なプログラムは配列やポインタを使用しないで実現することができ、現代のC++プログラムはvectorタイプと反復器を採用して一般的な配列に取って代わり、stringタイプを採用してCスタイルの文字列に取って代わる.
2.動的配列
配列を動的に割り当てる場合、配列要素にクラスタイプがある場合、そのクラスのデフォルト構造関数を使用して初期化されます.配列要素が組み込みタイプの場合、初期化はありません.

          string *psa = new string[10]; // array of 10 empty strings
          int *pia = new int[10];       // array of 10 uninitialized ints

 
配列を動的に割り当てるのは,コンパイル時に配列の長さが分からないためである.次のコードを書くことができます

          size_t n = get_size(); // get_size returns number of elements needed
          int* p = new int[n];
          for (int* q = p; q != p + n; ++q)
                ;

       

動的に割り当てられたメモリは最後に解放されなければなりません.そうしないと、メモリは最終的に消費されます.動的に作成された配列を使用する必要がなくなった場合、プログラマは、使用したストレージ領域をプログラムのフリーストレージ領域に明示的に返す必要があります.C++言語はポインタにdelete[]式を提供し、ポインタが指す配列空間を解放する.

          delete [] pia;

 
3.できるだけ前置きオペレータ++を使う
C言語を使用する背景のある読者は、なぜプログラムで使用する前に自増操作するのか不思議に思うかもしれません.道理は簡単です:前置操作の必要な仕事はもっと少ないので、1を加えた後に1を加えた結果を返すだけでいいです.後置オペレータは、操作数の元の値を保存して、操作の結果として1を追加しない前の値を返す必要があります.int型オブジェクトとポインタの場合、コンパイラはこの追加の作業を最適化します.しかし、より多くの複雑な反復器タイプでは、この追加の作業にはより大きな代価がかかる可能性があります.そのため、前置操作という良い習慣を身につけると、性能の違いの問題を心配する必要はありません.