C++ クラスからオブジェクトを複数作る
C++ではCの構造体を拡張してクラスとして扱う。構造体は基本的に型の違う複数変数を扱うもの。対してクラスは変数と関数をまとめて扱うのが基本。クラスを利用するためにはメモリに展開する必要がある。そのことをインスタンス化すると言う。インスタンス化したものをオブジェクトと言う。
実際にC++で試していたら、Cでも構造体を使って似たようなものが出来そうだなぁ?と思って、Cでクラスぽいことをやってみた。構造体内部で関数ポインタを使いまくって、カプセル化したクラスぐらいまでは作れた。しかし・・・かなりソースが混沌としてしまった。たぶん誰がやってもCで見やすいというレベルのソースは書けない気がする。やっぱりクラスを利用したオブジェクト指向プログラミングをするなら素直にC++でやるべきだと思えた。ただCでもオブジェクト指向的プログラミングは可能だということが分かった。
またC++のクラスの書き方はJavaとは大分違うので、C++独特の構造体風クラスの書き方に慣れる必要がある。
いきなり長めになってしまった。やっていることはシンプルで、ひとつのクラスから、2つインスタンス化して、そこに値を足したり、引いたりして、残っている値を参照するプログラム。クラスの宣言部分に具体的な処理を書いてもよいのだが、その場合インライン関数となる。通常は外に書く。
コンストラクタはクラス名と同じ名前。初期化部分でインスタンス化してオブジェクトが作られたときに、「n」に10をあらかじめ入れるようにした。
デストラクタは使わなくなったらオブジェクトを破棄してメモリを解放する。
外からアクセス可能なメンバ関数。「Add」「Sub」「Clear」「Get」。
外からはアクセスできないprivateな変数「n」。これはmainでコメントアウトしている「box1.n = 20;」を実行しようとすると、コンパイル時にエラーになる。このようにすることで、不用意に値が変更されないようにする。値を変更するときはメンバ関数を通して行うことになる。これをカプセル化という。もしクラスで「private」を削除した場合は、「public」となるので、メイン関数からでも直接値を変更できるようになる。
Cで、これと同じことをやると、かなり混沌とするが、これならすっきり?という印象だ。
C++言語 Meadow & MinGW GCC 目次
実際にC++で試していたら、Cでも構造体を使って似たようなものが出来そうだなぁ?と思って、Cでクラスぽいことをやってみた。構造体内部で関数ポインタを使いまくって、カプセル化したクラスぐらいまでは作れた。しかし・・・かなりソースが混沌としてしまった。たぶん誰がやってもCで見やすいというレベルのソースは書けない気がする。やっぱりクラスを利用したオブジェクト指向プログラミングをするなら素直にC++でやるべきだと思えた。ただCでもオブジェクト指向的プログラミングは可能だということが分かった。
またC++のクラスの書き方はJavaとは大分違うので、C++独特の構造体風クラスの書き方に慣れる必要がある。
クラスのインスタンス化
mainから他のクラスをインスタンス化して実行してみるサンプル。
|
コンストラクタはクラス名と同じ名前。初期化部分でインスタンス化してオブジェクトが作られたときに、「n」に10をあらかじめ入れるようにした。
デストラクタは使わなくなったらオブジェクトを破棄してメモリを解放する。
外からアクセス可能なメンバ関数。「Add」「Sub」「Clear」「Get」。
外からはアクセスできないprivateな変数「n」。これはmainでコメントアウトしている「box1.n = 20;」を実行しようとすると、コンパイル時にエラーになる。このようにすることで、不用意に値が変更されないようにする。値を変更するときはメンバ関数を通して行うことになる。これをカプセル化という。もしクラスで「private」を削除した場合は、「public」となるので、メイン関数からでも直接値を変更できるようになる。
Cで、これと同じことをやると、かなり混沌とするが、これならすっきり?という印象だ。
constructor Add: 440 box1 Get: 450 constructor Add: 20 Sub: 200 box1 Get: 250 box2 Get: 30 destructor destructor |
C++言語 Meadow & MinGW GCC 目次