カテゴリー
C++

オブジェクト指向プログラミングについて

この章ではオブジェクト指向プログラミングについて説明します。
オブジェクト指向プログラミングはC言語にはない機能であり、C++で新たに取り入れられた機能です。
オブジェクト指向型プログラミングは構造体に似た機能を持っています。
オブジェクト指向型プログラミングを使用すると変数と関数を1つにまとめることが出来ますが、この作業は「クラス」を使って行います。
つまり、「クラス」を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る「設計図」に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引くなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
どのような「状態」や「ふるまい」を作りたいかは「オブジェクト」の役割です。
例えば「線を書く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では初めにクラスの基本から説明します。
クラスの中に「状態」を変数に書き、「ふるまい」を関数に書きます。
クラスの中の変数をデータメンバ、関数をメンバ関数と呼びます。
これをクラスの宣言と言います。1 クラス名が2文字で構成されている場合、それぞれの単語の先頭を大文字で書いて、その他は小文字で書くのが慣例になっています(この通り書かなくてもエラーにはなりません)。1
次はオブジェクトの作成方法について説明します。
オブジェクトについては先ほど以下のように説明しました。1 つまりオブジェクトから命令を出してクラスに対して仕事をさせる役割があります。1 今まではint型などの変数を作っていましたが、オブジェクトは「クラス型の変数」を作ることを意味します。
このオブジェクトを作る過程をインスタンスと言います。
ではクラスとオブジェクトの関係のイメージをつかむためにもう一度説明します。
例えば新築の家をつくるとします。
ある人は家にプールを作ったり、床暖房を付けます。
そのことを実現するには設計図に「プールや床暖房」や「その機能」を付け加えないといけません。
実際には設計図であるクラスの中にプール、床暖房という変数を設定し、プールや床暖房の機能を定義するために関数内で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。
その指揮者の役割がオブジェクトです。
オブジェクトは例えば冬になったらプールの水の温度を40度にするなど細かな指示をすることになります。11
では実際に例を見てみましょう。11111 改めてクラスの定義の記述方法について説明します。1 クラスはデータメンバとメンバ関数からできています。
クラスの中の変数をデータメンバ、クラスの中の関数をメンバ関数と呼ばれていることは説明しました。
アクセス指定子とはメンバに対して、どこからのアクセスを許可するのかを指定するものです。
つまり、クラスは複数作ることが出来ますので、どのクラスからアクセスすることができるのかを規定するのがアクセス指定子です。111 クラスの中ではアクセス指定子の右側に「:」を付けて、その下にメンバ関数やデータメンバを記述します。11
クラスの中に宣言をした後は、メンバ関数の実際の中身をクラスの宣言の下(つまりクラスの外)に書いていきます。1 例えばgetPoint関数は以下のように書いています。1 クラスの宣言の中にメンバ関数の中身を書いていく方法もありますが、説明は後ほどします。
次にクラスの中のメンバ変数にデータを入れる方法について説明します。
この例ではクラス名をkeisanと名付けていますが、クラスはただの設計図なので、これにデータを入れないと何も動きません。
データを入れるには初めに1のようにオブジェクトを作ります。この例では以下の箇所です。1 オブジェクトを作った後はオブジェクト変数名にドット「.」を付け、その後にデータメンバを置きます。
そして、その中に代入演算子を使ってデータを入れていきます。
つまり、1 という構文でデータを入れます。1 そして、次はメンバ関数を呼び出しますが、実際にメンバ関数を呼び出しているのは以下の箇所です。1 111tasu関数の中では入力した数が0より大きくて、200より小さい値だった場合、number変数にb変数の値を足したものをnumber変数に代入しています。
数値がそれ以外の数だった場合は1 が実行されて1でプログラムを終了させています。
次はobj.hiku(num2);の部分を説明します。1 ここでは入力した数が0より大きくて、200より小さい値だった場合、number変数からc変数の値を引いたものをnumber変数に代入しています。
number -= c;1と同じ意味なので、tasu関数で計算されたnumber変数の値からC変数を引いた値をnumber変数に代入しています。
number変数にはtasu関数で計算された値が入っているので、hiku関数ではその値が使われます。111
num1に5が入っているとすると1の箇所でnumberには5と12が足された数値である17が代入されます。1 num2に1が入っているとすると1の箇所でnumberには17から1を引いた数値である16が代入されます。
numberには上の3番で17が入っていますので、この値が使われます。1 getPoint関数はnumber変数の値を返すためだけに存在します。
次の例はアクセス指定子に「private」を指定した例をみてみましょう。111111 この例ではnumberにprivateを指定しています。
privateもpublicと同じくアクセス指定子です。
クラスの定義の中にデータメンバやメンバ関数を記述する時にはアクセス指定子を書くことになりますが、省略も出来ます。省略した場合にはデータメンバ、メンバ関数はprivateになります。1 publicは同じクラスはもちろん他のクラスからもデータメンバやメンバ関数にアクセスすることが出来ます。
privateの付いたデータメンバにはクラスの外から直接アクセスできないので、メンバ関数からアクセスすることになります。
この例のnumber変数はprivateなので、以下のsetNumber関数からnumber変数に値を入れています。11 ここで補足をしておきます。
publicやprivateはデータメンバやメンバ関数に付けますが、基本はデータメンバはprivateで、メンバ関数はpublicで指定します。
データメンバをpublicにするとどのような値でも入れることが出来るので思わぬ誤作動につながる可能性があります。
ですのでsetNumber関数のような関数を作って中身の1をしてからデータメンバに値を代入する方が安全です。1 次は関数の引数としてオブジェクトを使用する方法について説明します。
では例をみてみましょう。111111 この例で説明したい箇所は以下のs2関数です。
このs2関数はメンバ関数ではない普通の関数です。
この関数にアクセスする方法について説明します。1 ここでの注目点は仮引数が1のようにオブジェクト変数になっていることです。
このようにオブジェクト変数でデータを受け取ることも可能になっています。
ですのでs2関数を呼び出すときには実引数にオブジェクトを入れます。1 このオブジェクトを使って、普通の関数s2の中で1のように書くことで、メンバ関数のtriangleArea関数やsqureArea関数などの関数を呼び出すことができるようになります。
ではこのプログラムの説明をしていきます。111 結果は以下の通りです。1 次の例ではコンストラクタと言う機能を学びます。1111111 コンストラクタとはオブジェクトを作成すると必ず呼び出される特殊な関数です。
データメンバをオブジェクト作成と同時に初期化したい時にコンストラクタを使用します。
オブジェクトを作成と同時に初期化することでデータメンバに対してデータを入れ忘れることはなくなります。
以下の箇所がコンストラクタですが、numberを初期化しています。1 コンストラクタの基本構文は以下の通りです。1 引数があれば書きますが、無ければ書かなくても結構です。
引数を書かない場合にはコンストラクタの中で1のように直接データを入れます。1 引数のあるコンストラクタは以下の箇所です。1 そして、コンストラクタは必ずクラスの宣言の中のpublicの中で宣言をしてください。1
次にコンストラクタを呼び出す方法について説明します。
基本構文は以下の通りです。1 この例のコンストラクタの呼び出しは引数が無い場合には1のように引数なしで記述し、データを渡したい時には1のように引数を書いています。
「keisan obj;」で呼び出されるコンストラクタは以下の箇所です。1 「keisan obj2(5); 」で呼び出されるコンストラクタは以下の箇所です。1 このようにコンストラクタは引数の型や数が違うならば同じ名前のコンストラクタを複数定義することが出来ます。
この例では引数のあるコンストラクタと引数のないコンストラクタなのでオーバーロードが可能になっています。
結果は以下の通りです。1 11[補足2]
クラスの中にもインライン関数を書くことが出来ます。
通常、インライン関数を書くときにはinlineを付けますが、クラス宣言の中にインライン関数を書くときにはinlineを付けなくても、インライン関数としてみなされます。
以下の赤線で囲まれている箇所がインライン関数です。
通常の関数の書き方で書きます。
他のtasu関数などもクラスの中に書いても結構です。1

カテゴリー
JavaScript

オブジェクト指向型プログラミングについて

この章ではオブジェクト指向型プログラミングについて説明します。
「オブジェクトリテラルについて知ろう」で説明したオブジェクトは配列と同じようなデータの集合体として説明しました。
しかし、オブジェクトをデータの集合体として使うだけだと大きなプログラムを作る時に少し不便です。
そこで、これから説明するオブジェクトを使った「オブジェクト指向型プログラミング」が必要になります。
JavaScriptのオブジェクト指向型プログラミングはPHPのような他の言語で使っているクラスの考え方とほぼ同じです。
JavaScriptの場合には関数が他言語でいうクラスの働きを受け持っています。
この本でもJavaScriptのオブジェクト指向型プログラミングをクラスと呼ばせていただきます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
その「状態」や「ふるまい」に指示を出すのはオブジェクトです。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
「状態」は変数で書くと言いましたが、クラスの中の変数のことをプロパティと言います。
「ふるまい」は関数で書くと言いましたが、クラスの中の関数のことをメソッドと言います。
この「状態」や「ふるまい」に対して指示を出すのがオブジェクトの役割です。
このオブジェクトからプロパティにデータを入れたり、メソッドに指示を出すことになります。
例を見てみましょう。11 ①関数が他言語でいうクラスの働きを受け持っていますと書きましたが、それが以下の箇所です。1 つまり、ここが設計図になります。
この関数を1に代入しますが、変数名は大文字で記述してください。
この変数名がクラス名になります。

②次はクラスのオブジェクトを作成します。11 クラスのオブジェクトは「new演算子」を使って生成します。
先ほど「状態」「ふるまい」に対して指示を出すのがオブジェクトの役割ですと言いましたが、このオブジェクトから設計図の中のプロパティにデータを入れたり、メソッドに指示を出すことになります。
カッコの中の引数1000と2はクラスのプロパティを初期化するために存在します。
このようにオブジェクトを作成すると同時にプロパティが初期化される機能をコンストラクタといいます。1 引数である1000と2がクラスのa,bにそれぞれ代入されます(1000がaに、2がbにそれぞれ代入されます)。
そして、1にaが代入され、1にbが代入されます。

次はthisについて説明します。
thisとはオブジェクト自身を指します。
this.kingakuはオブジェクト自身のkingakuにaを入れる
this.kazuはオブジェクト自身のkazuにbを入れる
と言う意味です。
つまり、thisを使って、オブジェクトとプロパティの関連付けを行なうと考えていただいて結構です。
次にクラスにメソッドを追加する方法について説明します(スペースの都合でreturn文を2行で書いていますが1行で書いても結構です)。11 と言う形式でメソッドをクラスに追加します。
メソッドを入れる位置は1の記述より後にします。
つまり、オブジェクトの後にメソッドを追加します。
この例では1という形式でメソッドを追加しましたが、最初から以下のようにfunction内に記述することも出来ます。11 function内に書くときには1のようにthisを付けます。

では次の例をみてみましょう。11 変数を追加するには1の形式で書きます。
最初から変数を設定しなくても後からでも追加できることを覚えておいてください。
この例では1の箇所です。
この変数をメソッド内で使用する時にはいつもの通り、thisを付けて使用します。
最後に以下の箇所で結果を出力します(スペースの都合で2行で書いていますが1行で書いても結構です)。1 shop.getGoukei()と記述することで、計算結果が出力されます。
結果は「消費税は1000円です」です。

次の例でオブジェクトについての注意点を説明します。111 ここではオブジェクトを以下のように2つ作成していますが、このようにオブジェクトは複数作成することが出来ることを覚えておいてください。1 この例ではshopオブジェクトに以下のようにメソッドの追加をしていますが、これはshopオブジェクトに属しているもので、shop2オブジェクトに属しているわけではありません。1 ですので以下のように記述しても、結果を得ることは出来ませんので注意してください。1 次の例のように初めからfunction内にgetGoukeiメソッドを記述していれば上の文は問題なく出力できます。11