0

重複の可能性:
C++ オブジェクト: いつポインターまたは参照を使用する必要があるか

Java から来たばかりで、C++ は初めてです。1 か月かけて、なんとか C++ を独学で習得しました。私はあちこちでいくつかの基本的なものをコーディングし、いくつかの概念 (ポリモーフィズム、仮想関数など) を理解しています。ポインターがどのように機能するかは知っていますが、いつ使用するかを知るのにまだ苦労しています。

new を使用してヒープ上に何かを作成する場合は、ポインターを使用する必要があることは知っていますが、ポインターと参照を使用する必要がある他の状況を認識できません。私が知っておくべきポインターをいつ使用するかについて、ある種の経験則はありますか? 関数パラメーターに & または * が含まれている必要がある場合など。初心者の質問で申し訳ありません。

4

2 に答える 2

1

他の質問で同じ答え (http://stackoverflow.com/questions/7058339/c-when-to-use-references-vs-pointers):

できる限り参照を使用し、必要な場合はポインタを使用してください。

できなくなるまでポインターを避けます。

その理由は、ポインターを使用すると、他の構成要素よりも追跡/読み取りが難しくなり、安全性が低下し、操作がはるかに危険になるためです。

したがって、経験則では、他に選択肢がない場合にのみポインターを使用します。

たとえば、オブジェクトへのポインターを返すことは、関数が場合によっては nullptr を返す可能性があり、それが想定される場合に有効なオプションです。そうは言っても、boost::optional に似たものを使用する方が良いでしょう。

もう 1 つの例は、特定のメモリ操作のために raw メモリへのポインタを使用することです。コードベース全体の危険な部分を制限するために、コードの非常に狭い部分に隠してローカライズする必要があります。

あなたの例では、ポインターをパラメーターとして使用しても意味がありません。

パラメータとして nullptr を指定すると、undefined-behaviour-land になります。参照属性のバージョンは、(トリックを簡単に見つけることができない限り)1の問題を許容しません。参照属性のバージョンは、ユーザーにとって理解しやすいです。nullになる可能性のあるものではなく、有効なオブジェクトを提供する必要があります。関数の動作が特定のオブジェクトの有無にかかわらず機能する必要がある場合、ポインターを属性として使用すると、 nullptr をパラメーターとして渡すことができ、関数には問題ありません。これは、ユーザーと実装コードの間の一種の契約です。

于 2012-11-01T05:40:21.167 に答える
0
  • 参照を関数の引数として使用します (単純、効率的、(ほとんど) 安全)。

  • ポインターをオブジェクトの非所有メンバーとして使用します (再割り当ては、参照よりもポインターを使用する方が理にかなっている傾向があります)。

  • ヒープ割り当てオブジェクトの所有にはスマート ポインターを使用します (ほとんどのオブジェクトではヒープ割り当てを避けます)。

ポインターはnullptr、ポインターの望ましい可能な値である場合や、ポインター演算を使用したい状況で使用することもできます。

于 2012-11-01T05:39:04.737 に答える