この章ではオブジェクト指向プログラミングについて説明します。
オブジェクト指向プログラミングはC言語にはない機能であり、C++で新たに取り入れられた機能です。
オブジェクト指向型プログラミングは構造体に似た機能を持っています。
オブジェクト指向型プログラミングを使用すると変数と関数を1つにまとめることが出来ますが、この作業は「クラス」を使って行います。
つまり、「クラス」を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る「設計図」に例えられます。
設計図は車や家や鉛筆などをつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引くなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
どのような「状態」や「ふるまい」を作りたいかは「オブジェクト」の役割です。
例えば「線を書く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
では初めにクラスの基本から説明します。
クラスの中に「状態」を変数に書き、「ふるまい」を関数に書きます。
クラスの中の変数をデータメンバ、関数をメンバ関数と呼びます。
これをクラスの宣言と言います。 クラス名が2文字で構成されている場合、それぞれの単語の先頭を大文字で書いて、その他は小文字で書くのが慣例になっています(この通り書かなくてもエラーにはなりません)。
次はオブジェクトの作成方法について説明します。
オブジェクトについては先ほど以下のように説明しました。 つまりオブジェクトから命令を出してクラスに対して仕事をさせる役割があります。 今まではint型などの変数を作っていましたが、オブジェクトは「クラス型の変数」を作ることを意味します。
このオブジェクトを作る過程をインスタンスと言います。
ではクラスとオブジェクトの関係のイメージをつかむためにもう一度説明します。
例えば新築の家をつくるとします。
ある人は家にプールを作ったり、床暖房を付けます。
そのことを実現するには設計図に「プールや床暖房」や「その機能」を付け加えないといけません。
実際には設計図であるクラスの中にプール、床暖房という変数を設定し、プールや床暖房の機能を定義するために関数内で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。
その指揮者の役割がオブジェクトです。
オブジェクトは例えば冬になったらプールの水の温度を40度にするなど細かな指示をすることになります。
では実際に例を見てみましょう。 改めてクラスの定義の記述方法について説明します。 クラスはデータメンバとメンバ関数からできています。
クラスの中の変数をデータメンバ、クラスの中の関数をメンバ関数と呼ばれていることは説明しました。
アクセス指定子とはメンバに対して、どこからのアクセスを許可するのかを指定するものです。
つまり、クラスは複数作ることが出来ますので、どのクラスからアクセスすることができるのかを規定するのがアクセス指定子です。 クラスの中ではアクセス指定子の右側に「:」を付けて、その下にメンバ関数やデータメンバを記述します。
クラスの中に宣言をした後は、メンバ関数の実際の中身をクラスの宣言の下(つまりクラスの外)に書いていきます。 例えばgetPoint関数は以下のように書いています。 クラスの宣言の中にメンバ関数の中身を書いていく方法もありますが、説明は後ほどします。
次にクラスの中のメンバ変数にデータを入れる方法について説明します。
この例ではクラス名をkeisanと名付けていますが、クラスはただの設計図なので、これにデータを入れないと何も動きません。
データを入れるには初めにのようにオブジェクトを作ります。この例では以下の箇所です。 オブジェクトを作った後はオブジェクト変数名にドット「.」を付け、その後にデータメンバを置きます。
そして、その中に代入演算子を使ってデータを入れていきます。
つまり、 という構文でデータを入れます。 そして、次はメンバ関数を呼び出しますが、実際にメンバ関数を呼び出しているのは以下の箇所です。 tasu関数の中では入力した数が0より大きくて、200より小さい値だった場合、number変数にb変数の値を足したものをnumber変数に代入しています。
数値がそれ以外の数だった場合は が実行されてでプログラムを終了させています。
次はobj.hiku(num2);の部分を説明します。 ここでは入力した数が0より大きくて、200より小さい値だった場合、number変数からc変数の値を引いたものをnumber変数に代入しています。
number -= c;はと同じ意味なので、tasu関数で計算されたnumber変数の値からC変数を引いた値をnumber変数に代入しています。
number変数にはtasu関数で計算された値が入っているので、hiku関数ではその値が使われます。
num1に5が入っているとするとの箇所でnumberには5と12が足された数値である17が代入されます。 num2に1が入っているとするとの箇所でnumberには17から1を引いた数値である16が代入されます。
numberには上の3番で17が入っていますので、この値が使われます。 getPoint関数はnumber変数の値を返すためだけに存在します。
次の例はアクセス指定子に「private」を指定した例をみてみましょう。 この例ではnumberにprivateを指定しています。
privateもpublicと同じくアクセス指定子です。
クラスの定義の中にデータメンバやメンバ関数を記述する時にはアクセス指定子を書くことになりますが、省略も出来ます。省略した場合にはデータメンバ、メンバ関数はprivateになります。 publicは同じクラスはもちろん他のクラスからもデータメンバやメンバ関数にアクセスすることが出来ます。
privateの付いたデータメンバにはクラスの外から直接アクセスできないので、メンバ関数からアクセスすることになります。
この例のnumber変数はprivateなので、以下のsetNumber関数からnumber変数に値を入れています。 ここで補足をしておきます。
publicやprivateはデータメンバやメンバ関数に付けますが、基本はデータメンバはprivateで、メンバ関数はpublicで指定します。
データメンバをpublicにするとどのような値でも入れることが出来るので思わぬ誤作動につながる可能性があります。
ですのでsetNumber関数のような関数を作って中身のをしてからデータメンバに値を代入する方が安全です。 次は関数の引数としてオブジェクトを使用する方法について説明します。
では例をみてみましょう。 この例で説明したい箇所は以下のs2関数です。
このs2関数はメンバ関数ではない普通の関数です。
この関数にアクセスする方法について説明します。 ここでの注目点は仮引数がのようにオブジェクト変数になっていることです。
このようにオブジェクト変数でデータを受け取ることも可能になっています。
ですのでs2関数を呼び出すときには実引数にオブジェクトを入れます。 このオブジェクトを使って、普通の関数s2の中でのように書くことで、メンバ関数のtriangleArea関数やsqureArea関数などの関数を呼び出すことができるようになります。
ではこのプログラムの説明をしていきます。 結果は以下の通りです。 次の例ではコンストラクタと言う機能を学びます。 コンストラクタとはオブジェクトを作成すると必ず呼び出される特殊な関数です。
データメンバをオブジェクト作成と同時に初期化したい時にコンストラクタを使用します。
オブジェクトを作成と同時に初期化することでデータメンバに対してデータを入れ忘れることはなくなります。
以下の箇所がコンストラクタですが、numberを初期化しています。 コンストラクタの基本構文は以下の通りです。 引数があれば書きますが、無ければ書かなくても結構です。
引数を書かない場合にはコンストラクタの中でのように直接データを入れます。 引数のあるコンストラクタは以下の箇所です。 そして、コンストラクタは必ずクラスの宣言の中のpublicの中で宣言をしてください。
次にコンストラクタを呼び出す方法について説明します。
基本構文は以下の通りです。 この例のコンストラクタの呼び出しは引数が無い場合にはのように引数なしで記述し、データを渡したい時にはのように引数を書いています。
「keisan obj;」で呼び出されるコンストラクタは以下の箇所です。 「keisan obj2(5); 」で呼び出されるコンストラクタは以下の箇所です。 このようにコンストラクタは引数の型や数が違うならば同じ名前のコンストラクタを複数定義することが出来ます。
この例では引数のあるコンストラクタと引数のないコンストラクタなのでオーバーロードが可能になっています。
結果は以下の通りです。 [補足2]
クラスの中にもインライン関数を書くことが出来ます。
通常、インライン関数を書くときにはinlineを付けますが、クラス宣言の中にインライン関数を書くときにはinlineを付けなくても、インライン関数としてみなされます。
以下の赤線で囲まれている箇所がインライン関数です。
通常の関数の書き方で書きます。
他のtasu関数などもクラスの中に書いても結構です。
タグ: exit
ファイルの操作について知ろう
この章ではファイルの取り扱い方法について学習します。
これまではprintf関数などを使って、文字列や計算結果を画面に出力していましたが、その処理が終われば、データは失われてしまいます。
そこで、そのようなデータはファイルに保存しておけば後で確認したい時に便利です。
ではファイルの取り扱いの流れを説明します。
(1) ファイルをオープンします
(2)ファイルの読み書きをします
(3)ファイルをクローズします
では例をみてみましょう。 次にファイルをオープンするのですが、それにはfopen関数を使います。
fopen関数を実行すると、ファイル情報を持つFILE型のポインタ(ファイルポインタといいます)が返されますので、先ほどのファイル構造体の変数に代入します。 以下のようにFILE構造体の宣言とfopen関数の代入を分けて書くこともできます。 「オープンモード」はどのような状態でファイルをオープンするのかをアルファベットで指定します。以下の表を参考にしてください。
この例では”w”を使っていますが、このモードを使うとファイルの中身を上書きして、ファイルがない時は新規作成してくれます。
wモードであればこの例の「net.txt」と言うファイルが自身のフォルダに無くても、自動的に作ってくれます。 fprintf関数はファイルポインタで指定したファイルに変換指定文字を使ってデータを書き込みます。 この例では以下の箇所がfprintf関数の箇所です。 この意味はdouble型のiを変換指定文字の通りにファイルに書き込んでいます。 次に残りのプログラムの説明します。 NULLと言う見慣れない文字がありますが、ファイルが何らかの理由でオープンできなかった時にfopen関数がこのNULLを返します。
「fp ==NULL」はfpがNULLならばを出力してプログラムを終了します。
「exit(1)」はexit関数を使用していますが、引数に1を使用すると異常終了という意味になり、ファイルが開かなかった時はプログラムを終了します。
ファイルが正常に開けば「net.txt」には変数iの値である8.1が入力されます。
次の例ではscanfで読み込んだデータをファイルに書き込みます。 では説明を始めます。 while文の中にEOFという箇所がありますが、これはキーボードでを押すと返される値です(whileの条件式を2行で書いていますが、1行で書いていただいても結構です)。
EOFの前に「!」が付いているので、が押されない間は入力する行為を繰り返すという意味になります。
気を付けることは以下のfprintf関数の変換指定子の箇所に「-6」という箇所がありますが、マイナス指定をするとファイルの中のデータを左詰めにするという意味になります。ファイルに書き込むときには左詰めで入力するのが基本です。 左詰めでファイルにデータを入れているので、「net.txt」は以下のようになります。
次は「net.txt」に書き込んだデータを取り出してみましょう。 ファイルからデータを読み込むにはfscanf関数を使用します。このfscanf関数は書式指定文字に従ってデータを取り出します。 この例でfscanfが使われている箇所は以下です。 ここでもEOFが出てきますが、の意味はファイルの終端までデータを読み込むと言う意味になります。
読み込む時にはfopen関数のオープンモードは「r」になります。
結果は以下の通りです。
次の例ではfputs関数を使ってデータをファイルに書き込む方法について説明します。fputs関数はファイルポインタで指定したファイルへ1行ずつ文字列を出力します。 結果は以下の通りです。 注意点としては以下のように改行を入れないと1行でファイルに書き込まれるので気を付けてください。もちろん、初めから1行で書き込む意図があるのならば改行は入れる必要はありません。 結果は以下の通りです。 次の例は「net.txt」に書き込んだテキストファイルから指定した文字数を読み込むプログラムです。 ファイルから指定した文字を読み込むにはfgets関数が必要です。 fgetsはファイルポインタで指定したファイルから、指定した文字の数だけを読み込んで、配列に代入します。そして、読み取るものが無くなるとNULLを返すので、NULLになったらwhile文を終了します。
読み取るときのオープンモードはを指定してください。 次の例は「net.txt」に書き込んだテキストファイルから1文字ずつ読み込むプログラムです。 fgetc関数はファイルポインタで指定したファイルから1文字読み取ります。 この例では以下の箇所がfgetc関数が使われている箇所です。 ここでは読み込んだ1文字をchar型の変数に入れています。
読み込みに成功すると、その読み込んだ1文字を返し、ファイルの終わりまで読んだ場合は、EOFを返します。ここでは最後にEOFが返された時にループを終了します。
putcharは1文字ずつ出力する機能があります。
ファイルの操作について知ろう
この章ではC言語におけるファイルの取り扱い方法について学習します。
これまではprintf関数などを使って、文字列や計算結果を画面に出力していましたが、その処理が終われば、データは失われてしまいます。
そこで、そのようなデータはファイルに保存しておけば後で確認したい時に便利です。
C言語におけるファイルの取り扱いの流れを説明します。
(1) ファイルをオープンします
(2)ファイルの読み書きをします
(3)ファイルをクローズします
この順序でファイルを操作を行います。
では例をみてみましょう。 ではファイルをオープンする手順について説明します。
初めに以下の構文でファイル構造体のポインタを作ります。この例では以下の箇所です。 ファイル構造体はファイルに関する入出力などの機能を備えています。
次に操作したいファイルを以下の構文でオープンします。 fopen関数を実行すると、ファイル情報を持つFILE型のポインタ(ファイルポインタといいます)が返されます。
そして、このfopen関数をファイル構造体の変数に代入します。 オープンモードではファイルをどのような状態で開きたいのかを設定します。
この例ではwを使っていますが、このモードを使うとファイルの中身を上書きして、ファイルが無い時は新規作成してくれます。
wモードであればこの例の「net.txt」と言うファイルが自身のフォルダに無くても、自動的に作ってくれます。次の表を参考にしてください。
次にファイルを読み書きする方法について説明します。
ファイルに書き込むにはfprintf関数を使います。
fprintf関数はファイルポインタで指定したファイルに変換指定文字を使ってデータを書き込みます。 この例では以下の箇所でdouble型のiのデータを変換指定文字であるの通りにファイルに書き込んでいます。
次はファイルをクローズする方法について説明します。
ファイルを開いた後には閉じなくてはいけません。
その時に使うのがfclose関数です。
次は以下の箇所の説明します。 NULLと言う見慣れない文字がありますが、ファイルが何らかの理由でオープンできなかった時にfopen関数がこのNULLを返します。 exit関数を使用する時にはの記述が必要です。
結果は「net.txt」に変数iの値である8.1が書き込まれます。
次の例ではscanfで読み込んだデータをファイルに書き込みます。
while文の中にEOFという箇所がありますが、これはキーボードでを押すと返される値です。
EOFの前に「!」が付いているので、を押さない間は入力する行為を繰り返すという意味になります。 気を付けることは以下の箇所で「-6」という箇所がありますが、マイナス指定をするとファイルの中のデータを左詰めにするという意味になります。ファイルに書き込むときには左詰めで入力するのが基本です。 左詰めでファイルにデータを入れているので、「net.txt」は以下のようになります。 次は「net.txt」に書き込んだデータを取り出してみましょう。 ファイルからデータを読み込むにはfscanf関数を使用します。 このfscanf関数は書式指定文字に従ってデータを取り出します。
この例では以下の箇所です(スペースの都合でwhileの条件式を2行で書いていますが、1行で書いてもいいです)。 ここでEOFが出てきますが、の意味はファイルの終端までデータを読み込むと言う意味になります。
fscanf関数はファイルの終端になるとEOFを返します。
読み込む時にはfopen関数のオープンモードはrになります。
次の例はfputs関数でデータをファイルに書き込む方法について説明します。 fputs関数はファイルポインタで指定したファイルへ1行ずつ文字列を書き込みます。 fputs関数はファイルに1行分書き込む関数です。
結果は以下の通り、ファイルに書き込まれます。 注意点としては以下のように改行を入れないと1行でファイルに書き込まれるので気を付けてください。
もちろん、初めから1行で書き込む意図があるのならばは入れる必要はありません。 結果は以下の通りです。
次の例は「net.txt」に書き込んだテキストファイルから指定した文字サイズだけを読み込むプログラムです。 ファイルから指定した文字サイズを読み込むにはfgets関数が必要です。 fgetsはファイルポインタで指定したファイルから、指定した文字の数だけを読み込んで、配列に代入します。
そして、読み取るものが無くなるとNULLを返すので、NULLになったらwhile文を終了します。
読み取るときにはのように読み取りモードをrに指定してください。
次の例は「net.txt」から1文字ずつ読み込むプログラムです。 fgetc関数はファイルポインタで指定したファイルから1文字読み取ります。 ここでは読み込んだ1文字をchar型の変数に入れてputcharで1文字ずつ出力しています。
fgetcは読み込みに成功すると、その読み込んだ1文字を返し、ファイルの終わりまで読んだ場合は、EOFを返します。
ファイル操作について知ろう
この章ではプログラム上でのファイルの操作について説明します。
PHPでは簡単にプログラム上からテキストファイルなどに書いたり、またそのファイルのデータをプログラム上に読み込むことが出来ます。
以下のファイルはLesson38.htmlです。
ここから送信された名前、メールアドレス、コメント、性別をLesson39.phpに飛ばしてファイルに保存していきます。Lesson38.htmlは以下のような画面構成になります。 以下のファイルは「Lesson39.php」です。 ファイルの基本操作の流れは以下の通りになります。
〇ファイルを開く
〇その開いたファイルを読み込んだり、ファイルに書き込む
〇ファイルを閉じる
では1の「ファイルを開く」から説明していきます。fopen関数はファイルを開く関数です。 fopen関数でファイルを開きます。
ファイルのオープンに成功したらファイルハンドルを返します。
例の場合には$openにファイルハンドルが返されます。
ファイルハンドルとは現在どのファイルに対して操作を行っているかを区別するための名前です。
ファイルハンドル名を付けてからはそのファイルハンドルで実行するための指示を出します。
ファイルハンドルはファイルを操作するためのIDみたいなものです。
モード一覧の中にあるファイルポインタとは、ファイルに書き込んだり、ファイルを読み込んだりする位置のことです。
ではプログラム内の説明をしていきます。 ファイル名はを指定しています。
モードにを指定していますので、ファイルポインタは常にファイルの末尾なので、これまでのデータに追加して書くことが出来ます。
ファイルを開くことに成功しているのならば$openにはファイルハンドルが入っています。 もし、ファイルを開くのが失敗しているのならばが出力されます。
ファイルを開くのが失敗しているということは$openにはfalseが入っていることになります。
exit関数はメッセージを出力し、現在のプログラムを終了する関数です。
flock関数はファイルをロックする関数です。
戻り値は成功した時にTRUE, 失敗した時にFALSEが返されます
ファイルに何かを書くときに、複数の人が同時に同じファイルに書き込みを行うとファイルが壊れる可能性があるので、ファイルに書き込みを行う前にファイルをロックして、書き込んでいる間は他の人がファイルに書き込みを行えないようにするのがflock関数です。
つまり誰かが書き込んでいる間は書き込みを待ってもらうことが必要になります。
[ロックの種類] fputs関数はファイルポインタの位置に文字列を1行分書き込む関数です。
「長さ」は、指定した長さまで書き込んだら、書き込みが終了になりますが、この「長さ」は省略できます。
戻り値は成功したら書き込んだバイト数, 失敗したらFALSEが返されます。
この例では以下の箇所がファイルに書き込んでいる箇所です。 フォームのコメント欄からPOSTで送られてきたデータは以下のように$contentsに入れています。
$contentsには文字列連結演算子で名前、メールアドレス、コメント、性別、日付をつないだデータがカンマ区切りで入っています。
date関数の末尾にがありますが、これは改行を意味しています。
これは名前、メールアドレス、コメント、性別、日付を1行ごとに書きたいためです。
次は以下の箇所の説明をします。 =>ここではロックをここで解除しています。
解除するには第2引数にを付けてください。
次にファイルを閉じる方法について説明します。 戻り値は成功した時にTRUE, 失敗した時にFALSEが返されます。
この例では以下の箇所でファイルを閉じています。 最後にファイルを閉じるのですが、fclose関数がファイルを閉じる関数です。
ファイルを閉じるのに成功したのならばTRUE,失敗したのならばFALSEを返します。
AH.txtファイルには以下のように改行されて書き込まれます。
次は書き込んだファイルからデータを取り出す方法について説明します。
では、「”AH.txt”」に書き込まれたデータを取り出す方法について説明します。 今度はファイルからデータを読み込むので、モードはで指定しています。
初めにファイルが存在しているかどうかを調べ、その後に
ファイルの内容を読み込みます。 ファイルやディレクトリが存在するのかどうかを調べるにはfile_exists関数を使います。
戻り値はファイルが存在すればtrue,存在しなければfalseを返します。
この例の場合にはは存在しますのでTRUEになります。
次にファイルの内容を読み込みます。 この例では以下の箇所です。 fgets関数はファイルから文字列を1行分取得する関数です。
戻り値は成功したら取り出した文字列が返り, ファイルの終端もしくは行の末端の改行に達したらFALSEが返されます。
「1行分」とは行の中の改行までの部分です。
この関数を実行すると1行分しかデータを取得できませんが、whileと組み合わせることにより、すべてのデータを読み込むことが可能になります。
次にそのファイルの中身を区切り文字で区切って
表示させます。 =>explode関数は説明済みですが、もう一度復習してみましょう。 文字列を指定した文字で区切ります。
AH.txtファイルの内容を区切り文字「”,”」で区切リ取ると例えば という配列を作成されます。
あとは添え字を指定してそれぞれのデータを取り出します。 結果は以下のように表示されます。