JavaとC++の「クラス」

 オブジェクト指向プログラミングの入門用言語として、今最も取り組みやすいのはJavaでしょう。クラス、オブジェクト、継承、データの隠蔽、といったオブジェクト指向の基本を自然に覚える事が可能で、文法も良く整理されています。何より無料で配布されていますから、CD−ROM付の入門書を買ってきて手軽に始められるのが良いですね。このJavaから、オブジェクト指向、さらにプログラミングの世界に入った、という方も多いと思います。
 ただ、現時点ではJavaには性能や互換性を始め大きな制約があるため、C++でプログラミングを組む機会もけっこうあるかもしれません。また、C++にはJavaにはない魅力的な機能も多数あるのでJavaでオブジェクト指向やプログラミングの基礎を覚えたらC++に挑戦するのも良いでしょう。

 私もJavaでオブジェクト指向を覚えた「Java使い」(って死語か)なのですが、最近C++にも興味を持ち始め、今C++で実験的な演習プログラムをいくつか書いているところです。今回は、そうした演習で感じたJavaC++の「クラス」について、その定義や扱いを比べてみようと思います。

C++のクラス

 C++におけるクラスは、一言で言うと「関数を定義でき、外部からアクセス可能な変数や関数を指定できる構造体」です(と言ってもJavaには構造体ないけど)。クラスでは、構造体のメンバ変数を定義するのと同様の感覚でメンバ関数を定義できます。

・簡単なクラス定義の例
  class CLASS1 {

  private:

      int a,b;

  public:

      void setA(int v) {

          a=v;

      }

      void setB(int v) {

          b=v;

      }

      int plus(void) {

          return a+b;

      }

  };

 この例では、変数a, bと関数setA(), setB(), plus()を持つクラスを定義しています。ただし、アクセス制御についてはJavaのように宣言子ではなく(Javaならpublic int plus()となる)、ブロック単位で行うので注意が必要です。またC++には、使われなくなったオブジェクトを自動的に破棄する「ガーベッジコレクタ」はないので、クラスから(動的に)生成したオブジェクトは不要になったらdeleteで明示的に破棄する必要があります。
 このように宣言やオブジェクトの管理で若干の違いはあっても、C++のクラスは基本的な部分についてはかなりJavaに近い構造になっていると言えるでしょう(JavaC++を元に設計されたのだから、当然と言えば当然だが)。Javaに比べるとやや難しい部分もありますが、その分自分で自由に指定できる範囲も広いので少しづつ「C++らしさ」を活かして行きたいですね。

 ちなみに、上のCLASS1Javaで書けば、以下のような感じでしょうか。

  class CLASS1 {

      private int a,b;

      public void setA(int v) {

          a=v;

      }

      public void setB(int v) {

          b=v;

      }

      public int plus() {

          return a+b;

  }

 次に、C++のクラスからオブジェクトを作ってみます。単にオブジェクトを作るだけなら、以下のようにCLASS1型の変数を定義すれば良いでしょう。

  CLASS1 cls;

 これで、CLASS1のオブジェクトclsが作成され、以後は(スコープが有効である限り)cls.setA(1);などとしてclspublicな要素を利用できます。C++では、クラス型の変数がオブジェクトへの「参照」ではなくオブジェクトそのものの「実体」になるので注意してください。オブジェクトへの参照を作るには、CLASS1 *testのようにポインタとして定義します。

プログラム

 今回のプログラムは、プログラム中で以下のようなTestクラスを定義し、そのオブジェクトtestのメンバ変数をアクセスメソッドで読み書きしてみます。クラス定義以外は、Win32APIベースのCプログラムそのままなので、あまりC++らしくないかもしれませんね。

  class Test {

  private:
      int a,b;

  public:

      Test() { // コンストラクタ

          a=0;
          b=0;

      }

      int getA(void) {

          return a;

      }

      int getB(void) {

          return b;

      }

      void setA(int v) {

          a=v;

      }

      void setB(int v) {

          b=v;

      }

  };

 プログラムを保存したら、まずファイルの拡張子をcppに変更します。その後は、いつも通りWin32 Applicationのプロジェクトを作ってファイルを追加・ビルドしてください。

プログラムソース表示

戻る