あなたの質問は、いくつかの異なる問題を 1 つにまとめています。実際には、ここでの主な問題は、その混合物が本当に必要かどうかです。
「ポインタを返す」ということ自体はありません。「ポインターを返したい」という理由だけで「ポインターを返す」わけではありません。ポインターを返すことは特定の理由で行われ、その理由によって、それがどのように行われ、適切に機能するために何をする必要があるかが決まります。
元の例では、ポインターを返す意味のある理由がないため、元の例は実際にはそれを示していません。単に返すことができるようですint
。
たとえば、ポインタは動的に割り当てられたオブジェクト (つまり、有効期間が言語のスコープ規則に従わないオブジェクト) へのポインタであるため、多くの場合、ポインタを返したいと思うでしょう。この場合のカジュアルな関係は逆方向に機能することに注意してください。動的オブジェクトが必要です -> ポインターを返す必要があります。そのように、その逆ではありません。あなたの例では、それを逆に使用しているようです: ポインターを返したい -> オブジェクトを動的に割り当てる必要があります。後者の推論には根本的な欠陥がありますが、予想以上に頻繁に使用されていることがわかります。
動的に割り当てられたオブジェクトが本当に必要な場合 (上で述べたように、主な理由は、言語のスコープベースの有効期間規則をオーバーライドすることです)、メモリの所有権の問題が問題になります。このメモリの割り当てをいつ解除できるか、または解除する必要があるか、および誰が割り当てを解除する必要があるかを知るには、排他的 (常に 1 人の指定された所有者) または共有 (参照カウントなど) 所有権スキームを実装する必要があります。これは生のポインタでも実行できますが、ライブラリが提供するさまざまなスマート ポインタ クラスを使用することをお勧めします。
しかし、多くの場合、非動的オブジェクト (静的または自動) へのポインターを返すこともできます。これは、これらのポインターの有効期間が、それらが指すオブジェクトの有効期間と同じかそれよりも短いと仮定すると、まったく問題ありません。
つまり、ポインターを返すという決定の背後にある理由は、C と C++ の間で実際には違いはありません。言語関連よりもデザイン/意図関連です。C++ は、ポインターを返すことを決めた後で作業を容易にするためのツールを提供するだけです。(これは、C++ プログラマーが隠しポインターを乱用するインセンティブとして機能することがあります)。
いずれにしても、これは実装しようとしている機能の問題です。それがわかれば、「ポインターを返す」必要があるかどうかについて適切な決定を下すことができます。最終的にポインターを返すことにした場合は、適切な戻り方法を選択するのに役立ちます。それがどのように機能するかです。後ろ向きに考えようとすると (「ポインターを返したいだけですが、まだ本当の理由はありません」)、学問的に役に立たない答えしか得られません。特定の状況。