0

このクラスがあるとします:

class book {
  public:
  book(int pages = 0) {pages = m_pages;}
  getPages() { return m_pages;}
  setPages(int pages) { pages = m_pages;}
  private:
  int m_pages;
};

クラスへのポインターをいつ使用するか、またはそのオブジェクトをいつ作成するかがわかりません。例: 何が良いのか、その理由は?

book The_lord_of_the_rings;

また:

book* The_lord_of_the_rings;

ありがとう。

4

3 に答える 3

2

最初のケースでは、変数The_lord_of_the_rings オブジェクトです。2 番目のケースでは、変数は、オブジェクトがあるメモリ内の別の場所を指しています。

簡単な ASCII 画像を試してみましょう。

最初のケースでは、オブジェクトがあります:

+-----------------------------------------------------+
| | ロード・オブ・ザ・リング |
| | (オブジェクトに関連付けられたすべてのデータ) |
+-----------------------------------------------------+

2 番目の例では、ポインターがあります。

+------------------------------------+ +------------------------ ------+
| | ロード・オブ・ザ・リング | ----> | 実際のオブジェクトとそのデータ |
+------------------------------------+ +------------------------ ------+

ただし:コメントで juanchopanza が指摘したように、ポインターは実際に有効なオブジェクトを指している必要はありません。ポインターをローカル変数として宣言しただけでは、ポインターは初期化されず、メモリ内の一見ランダムな場所を指します。この場合、逆参照 (ポインターが指すデータへのアクセス) は未定義の動作につながり、実際にプログラムをクラッシュさせる可能性があります。ポインタは、使用する前に有効なオブジェクトを指すように常に初期化する必要があります。


最新の C++ では、ポインター、特に生のポインターを使用する理由はほとんどありません。std::unique_ptrやなどの優れた「スマート ポインター」が用意されstd::shared_ptrました。

ポインターをいつ使用するかは状況によって大きく異なりますが、一般的には、プレーンなオブジェクトと参照を使用すると長い道のりを歩むことができます。

于 2013-03-08T09:35:34.383 に答える
0

継承と仮想関数に関係する場合は、ポインターを使用することを好みます。関数にパラメーターとして渡すときに呼び出されるコピー コンストラクターを取り除くことも役立ちます。ポインターを使用すると、必要に応じて (new/delete キーワードで) 自由に割り当て/削除できます。一方、オブジェクトを使用すると、オブジェクトがスコープ外の場合にシステムが独自にメモリを要求するため、メモリ リークの問題を軽減するのに役立ちます。

于 2013-03-08T09:51:46.090 に答える
0

ポリモーフィズムを使用するには、クラスへのポインターを使用する必要があります。

http://www.cplusplus.com/doc/tutorial/polymorphism/

もう 1 つのシナリオは、組み込みシステムのプログラミングです。使用可能なメモリに制約がある場合はいつでも、ポインターを使用し、必要に応じてメモリを割り当て、使用が終了したらメモリの割り当てを解除して、必要なときに他の人がメモリを取得できるようにします。

于 2013-03-08T09:46:39.097 に答える