- ベストアンサー
Java→C++:オブジェクトの扱いに戸惑ってます
- Java→C++のオブジェクトの扱い方について、戸惑っています。
- C++ではオブジェクトを宣言するだけでコンストラクタが動き、メンバ変数を使うことができます。
- new演算子の違いやコードの実行結果についても教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Java の型にはプリミティブ型と参照型がある、それは理解してますよね? C++ の場合、型名だけを書いた場合、たとえクラスであってもすべてプリミティブ型のようにふるまいます。 ですから、 Hoge hoge; となっている時点で int i; と同様に変数の宣言と同時にその値の生成が行われ、その過程でコンストラクタが呼ばれます。 C++ で Java の参照型を表すものはポインタになります。 たとえば、 Hoge* p_hoge = new Hoge(); という感じで Java の Hoge hoge = new Hoge(); と同じに……なったらいいんだけどねぇ。 このポインタというもの、Java の参照と比べて厄介です。というか、C/C++ のポインタの厄介な部分を全部オミットしたものが Java の参照です。 簡単に言えば、Java ではガーベージコレクタに任せていたメモリ管理を自分でやらなくてはならないという事です。これがどれだけ大変かというと、ポインタだけで本が一冊書けるくらい大変です。 Java の参照型の感覚でポインタを扱ったら「アイエェェェ メモリーリーク? メモリーリークナンデ?」か「一般保護違反なんて Java のテストに出ないよお…」となること確実です。 どうしても Java と同じ感覚でオブジェクトを扱いたいのであればスマートポインタというものを調べてみてください。 でも、メモリ管理を自分でやらなくてはならないということは逆にメモリ解放のタイミングを自分で決められるという事でもあります。それを利用すれば Java よりも効率的なプログラムを書くこともできます。 また、C++ では Hoge hoge; の方もいろいろと便利なのでポインタを使って new するのと同じくらい使います。 特に、RAII と呼ばれるテクニックでは、上記のように記述することでブロックを抜けるときに確実にデストラクタが呼ばれるという性質を利用しています。 http://ja.wikipedia.org/wiki/RAII ……finally? 知らない子ですね。というか、インスタンス破棄のタイミングがガーベージコレクション任せでプログラマ自身では確実に制御できない Java では finally は必要でしょう。しかし上記のテクニックが使える C++ では finally のような構文は特に必要がないという趣旨のことを C++ の設計者は『C++ の設計と進化』という本の中で書いています(16.5節)。厚いし難しい本なので万人向けではありませんが、C++ という言語がどのように生み出されたか、C++ の構文選択の際どのような選択がされたかを知る上で重要な本ですので、C++ を深く知りたいのであれば読んでおいた方がいい本です。
その他の回答 (1)
- wormhole
- ベストアンサー率28% (1626/5665)
何だか変数の宣言とインスタンスの生成がごっちゃになられているような。 >しかし、Javaでは型の宣言はあくまで型を宣言しただけだったのに対し、 ここでいわれている「型」というのは「クラス」の事だと思いますが、 Javaでいう「クラスの宣言」は public class AAA { ... } とクラスを書く事ですけど。 ちなみにC++では「宣言」ではなく「定義」になります。 >Hoge hoge; とするのと Javaではhogeという名前の変数(インスタンスの入れ物)を用意しているだけですが C++ではhogeという名前の変数であり、その変数はインスタンス自身です。 見た目は同じ書き方ですが意味が違うんです。 C++でJavaと同じような事をするなら Hoge *hoge; になります。 >Hoge hoge = new Hoge(); C++だとエラー。