• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オブジェクトの参照を返す関数の扱い)

オブジェクトの参照を返す関数の扱い

このQ&Aのポイント
  • オブジェクトの参照を返す関数で、関数内で作成されたオブジェクトは関数終了後に実体がなくなるため、アドレスのような数列が表示されます。
  • 関数でオブジェクトを作成しプログラム本体に渡す際は、オブジェクト自体をコピーしなければ参照で渡すことはできません。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

質問A:その理解で正しいです。 質問B:作ったオブジェクトを参照で返すのは止めた方が良いです。 オブジェクトをコピーで返しましょう。 あるいはnewで作ってポインタで返しましょう。 関数内で自動変数を宣言して作ったオブジェクトはその関数を終えると削除されるので、そこへの参照は懸垂参照という不正な状態になります。 newで作成したオブジェクトはdeleteするまで存在するので関数から返せます。このときは参照でなくポインタを返しましょう。参照を返すとdeleteが面倒です。

hydrozoa
質問者

お礼

回答ありがとうございました。 ポインタはなにかと面倒そうなイメージもあり、参照が使えないかと思っていたんですがそうもいかないようですね。 今回のようなオブジェクトの有効な範囲というのは私がプログラミングでいまいち感覚がつかめていなかった部分なのですが、今回の件でとても勉強になりました。

その他の回答 (1)

  • jagd-doga
  • ベストアンサー率31% (14/45)
回答No.2

rinkun さんがおっしゃるとおり、 「関数がおわるとその実体がなくなるため」 という理解で正しいです。 newしてポインタを返すほかには、関数内の自動変数を静的に宣言する方法があります。 シングルトンパターンになるんですかね。 こんな感じです。 class A& method() {   static class A;   return A; } これなら、method() をreturnした後も class Aはなくならないので大丈夫なはずです。 また、呼び出し元でdeleteしなくても済みます。 ただし、複数の呼び出し元で、ひとつのインスタンスを共通して使用することになるので、その点は注意が必要です。 特に、起動後初回の呼び出しで class Aのコンストラクタが処理されるので、初回呼び出し時に複数スレッドから同時にアクセスされると例外が発生することがあります。

hydrozoa
質問者

お礼

具体的なコードありがとうございます。勉強になりました。 new, staticなどは知識としては多少ありましたが、実際に使うのはちょっと躊躇してしまっていました。これからは積極的に使ってみようと思います。