カテゴリー
C言語

構造体について知ろう

この章では構造体について説明します。
「構造体」はバラバラの異なる型のデータを持つ変数同士を1つの型として扱うことができます。
それに対して配列は単一のデータ型しかまとめて扱う事はできません。
例えば、学生の情報を扱いたい場合に
「成績はint型」
「身長はdouble型」
「名前はchar型」
など様々なデータ型なので配列では扱うことが出来ません。
このような時に構造体を使います。
では例をみてみましょう。111 構造体の作り方は最初に「構造体の宣言」を以下のように書きます。1 この例では以下の部分が「構造体の宣言」です。1 構造体型を宣言する時はstructを使います。構造体型の名前は自由に付けてください。
そしてstructのブロックの中にメンバ(変数や配列)の宣言をして、終わりに1を付けます。
メンバとは変数や配列の別名だと思ってください。
構造体の宣言は「関数の外」で宣言するとその場所から下のプログラムのすべてで使うことが出来ますが、関数の中で宣言すると関数の中でのみ使うことが出来ます。
構造体型を宣言した後は「構造体型に属する変数」を作ります。
構造体型の変数も普通の変数と同じように変数の宣言と値の代入をしなくてはいけません。
以下の基本構文が構造体型変数の宣言と初期化です。1 この例では以下の箇所が構造体型変数の宣言と初期化です。1 {1,18,”koike”,170.2}は以下の構造体のメンバに上から順に代入されます。1 つまり、以下のようにデータが代入されます。1 構造体型の配列でも以下の構文でメンバに代入することができます。1 構造体型の配列も通常の配列と同じで宣言と同時に初期化することが出来ます。
例では以下のように書いています。1 ではプログラムの説明に入ります。11 この時、気を付けなくてはいけないのは1の中の要素の書き順は構造体の宣言の中のメンバの順番と合わせてください。
例えば1のような書き方はいけません。111 1例えばint id;のデータを得たい時には1という形式で、1と記述します。
これで1が出力されます。
構造体の配列はfor文で出力しています。1 iには0から2がループするごとに代入されます。111 先ほどの例では構造体型の変数と配列の2つを使いましたが、以下のように構造体型の配列だけ使用しても結果は同じになります。111
次に構造体型の型名を短縮する書き方について説明します。111 今までは構造体を宣言するには1 のように長い型名を書かなくてはいけませんでした。
次の構文で書くと構造体型の型名を省略することが出来ます。
〇構造体型の宣言をする時に構造体型名の前にtypedefを付ける。
〇構造体型の変数や配列を宣言する時に1と書く代わりにどのような名前を使いたいかを決めてブロックの終わりに記述します。
この例では1になります。これはstudentではなくても何でもいいです。1 上のように宣言しましたので以下のようにstructを付けないで宣言と初期化をすることが出来ます。1 この書き方はintなどで宣言するのと同じ感覚で書くことができますので、使いやすいです。

次の例では構造体でのscanfの使い方について説明します。11 scanfの使い方が構造体では違うということではありませんが、scanfと構造体の組み合わせで書けることを覚えておいてください。1 この例では以下の箇所が該当します。1 補足ですが、今までは構造体の変数にデータを入れる場合には以下のように書いていました。1 この例の場合には以下のように構造体の宣言をしてから、scanfでデータを入れています。1
次の例では構造体を関数に渡す方法について説明します。11111 実引数が1のように構造体型変数なので、仮引数も1のように構造体変数で受け取ります。
メンバの値を出力するには1という形式で書きます。11 次のyo関数にはseito2という構造体配列を渡しているので、関数側でも引数には構造体型の配列である1を設置します。1 結果は以下の通りです。1
次の例では構造体型のポインタを使用する方法について説明します。1111 1ここでは構造体型の変数のアドレスを実引数にしてhu関数を呼び出しています。
ですので仮引数では以下の通り構造体型のポインタで受けています。1
ここに見慣れない1という記号がありますが、これはアロー演算子と呼ばれています。
アロー演算子は構造体型のポインタから構造体のメンバに1と、アクセスするために使います。
1 ここでは構造体型の配列のアドレスを引数にしてyo関数を呼び出しています。
1 実引数であるseito2配列をyo関数の中の構造体型のポインタ(仮引数)で受けています。
この構造体型の配列の要素にアクセスするには以下のようにポインタを進めながら書きます。この時にはアロー演算子を使います。1 つまり、iの値がループするごとに進むので、ポインタが示す位置も変わります。

次の例では構造体の配列について説明します。
以下の例ではscanfを使って、入力した値を構造体の配列に入れています。111 構造体の配列は以下のようにブロックの末尾に配列名と要素数を配置します。1 この例では以下のscanfで入力した値をメンバに代入します。
scanfの引数にあるメンバはカンマで区切れば複数書くことができます。
変換指定子もメンバの数だけ書いてください。1111 そして、入力した値をprintfで出力します。1 結果は以下の通りです。1

カテゴリー
PHP

クラスについて知ろう

この章ではクラスについて説明します。
今までのプログラムでは変数と関数を扱ってきましたが、クラスと言う機能を使うことで、多くの変数と関数を1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には1があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態やふるまい」をクラスと言う設計図に書いていきます。
「状態」を変数で書き、「ふるまい」を関数で書くことになります。
その「状態やふるまい」に指示を出すのはオブジェクトです。
例えば線を消すなど具体的な指示をオブジェクトと言う司令塔から出します。
「状態」は変数で書くと言いましたが、クラスの中の変数のことをプロパティと言います。
「ふるまい」は関数で書くと言いましたが、クラスの中の関数のことをメソッドと言います。
では初めにクラスの基本から説明します。
クラスの中に「状態」や「ふるまい」を書いていきます。1 クラス名の付け方は基本的には変数名の付け方と同じですが、変数との違いは大文字と小文字を区別しないことです。
例えば11は同じクラスを意味します。
その他にクラス名の付け方で気を付けることは最初の文字を大文字にして後は小文字というのが慣例になっていることです。1 オブジェクトを作成するためにはクラス名の前に1を付けます。
これをオブジェクト変数に代入すればオブジェクトの完成です。
このオブジェクトを作る過程を「インスタンス化」と言います。
クラスはただの設計図なので、オブジェクトから指示を出さないと何も動きません。
先ほども説明しましたが、「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
ではクラスとオブジェクトの関係をもう一度説明します。
例えば新築の家をつくるとします。
そこで、家にこんな機能を付けたい、あんな機能も付けたいと思い悩むことでしょう。
ある人はプールや床暖房を付けたり。
それを実現するには設計図にその「プールや床暖房」やプールや床暖房を操作する機能を付け加えないといけません
実際にはクラスの中にプール、床暖房という変数を設定し、プールや床暖房を実際に機能させるためにメソッドの中で水や床の温度を上げたり下げたりする機能を加える必要があります。
この設計図はそのままでは動きませんので、誰かの指揮のもとに動かさなくてはいけません。その指揮者の役割がオブジェクトです。
「オブジェクト」は例えば冬になったらプールの水の温度を40度にするなど細かな指示をします。1
ではクラスの例を見てみましょう。1111 このクラスにはBanksystemという名前が付いています。
以下の変数がプロパティです。
プロパティの前にpublicが付いていますが、これはプロパティに対してクラスの外からでも、どこからでもアクセスが出来ることを意味します。
publicは修飾子と呼ばれています。
修飾子はこの他にもprivate、protectedなどがありますが、後ほど説明します。1 1以下のようにメソッドの前にpublicが付いていますが、これはメソッドに対してクラスの外からでも、どこからでもアクセスが出来ることを意味します。1
次はクラスを実行する方法について説明します。
クラスは設計図なのでこのままでは何も機能しません。
クラスを機能させるためには以下のようにオブジェクトを作成しなくてはいけません。
それが$Bankです。作り方は説明した通り、クラス名の前にnewを付け、それを変数に代入すればオブジェクトの完成です。1
次にプロパティにデータを入れていきます
以下のようにデータを入れます。1 $オブジェクトとプロパティの間にある「->」はアロー演算子と言います。
クラスのプロパティやメソッドにアクセスするときに使います。1
次はメソッドにデータを入れます1 メソッドの場合には「=」を使わないで、メソッドの引数に渡したいデータを入れます1

次にプロパティをクラスの中で使用する方法について説明します。
クラスの中でプロパティやメソッドを使用するためには「$this->」を使用しなくてはいけません。
ですので、メソッドの中でプロパティを使用するためには次のように「$this->」を使用します。1 結果は「山田銀行の近藤次郎様の残高は240000」となります。
オブジェクトは何個でも作成することが出来るので、次の例をみてみましょう。
先ほどの例は$Bankオブジェクトだけでしたが、オブジェクトはいくつでも作成することが出来ます。
以下の例では$Bank1を付け加えました。11

次にプロパティに対してクラスの外からのアクセスを禁止する場合の対処法について説明します。
先ほどの例との違いは以下のsum関数と$moneysumの箇所です。11111 プロパティに対してクラスの外からのアクセスを禁止する場合にはプロパティの前にprivateを付けます。
privateにする理由はクラスの外から自由にプロパティの値を書き替えられては困る場合などに使われます。
privateを付けますと、クラスの外部から直接プロパティに対して1のようなアクセスはすることが出来なくなります。
では、このprivate指定のプロパティにどのようにデータを入れるのかと言いますとメソッドを通してデータを入れます。
それが以下のsumメソッドです。
このsumメソッドは入力したデータが0より小さい場合には0を$moneysumに代入するというチェック機能を付けました。
deposiメソッドやwithdrawalメソッドにはチェック機能を付けませんでしたが、sumメソッドのようにマイナスの値が入らないようにif文でチェックしています。1
次は「コンストラクタ」といわれる機能について説明します。
例をみてみましょう。11111ではコンストラクタの機能について説明します。1 functionの次のアンダーバーは2つあることに注意してください。
コンストラクタの修飾子は必ずpublicです。
また、引数は省略できます。
この機能はコンストラクタと言いまして、オブジェクトを作成するときに自動的に呼び出されるメソッドです。
つまり、newによってオブジェクトが作られるときに自動的に呼び出されるメソッドです。
これは変数を初期化したい時に使用します。
コンストラクタを呼び出すには以下の通り、オブジェクトの引数に渡すデータを1などと記述します。
引数がない場合には省略できます。1 以下のようにオブジェクトを作成するときに自動的にコンストラクタが呼び出され、引数の値がそれぞれコンストラクタの引数に代入されます。1

次は静的メソッド静的プロパティについて説明します。111111
静的メソッドや静的プロパティはオブジェクトを作成しなくてもアクセスすることができるメソッドやプロパティで、オブジェクトからデータを入れたりすることはできません。
静的メソッドや静的プロパティの作成方法はメソッドやプロパティの前にstaticを付けるだけです。
ここでいくつかの注意点を説明します。
〇「$this->」 はstaticメソッドの内部で使用することはできません。

〇静的メソッドや静的プロパティには前の例の1 のように1を使ってアクセスすることはできません。

静的メソッドや静的プロパティはクラスに属しているメソッドやプロパティです。
今まではクラスのオブジェクトを作成して、そのオブジェクトからメソッドやプロパティにデータを入れてきました。
なぜなら、それらのメソッドやプロパティはオブジェクトに属しているからです。
例えば以下の$Bankオブジェクトと$Bank1オブジェクトで使われるプロパティとメソッドは同じものを使っていますが、各データはそれぞれのオブジェクトの持ち物ですので、共通して使えるデータはありません。1 それに対して静的メソッドや静的プロパティは各オブジェクトが共通して使えるデータです。
では先ほどの例を見てみましょう。
1の箇所が静的プロパティですが、そのプロパティには0が代入されています。
この$totalプロパティは「クラスに属しています」
次に静的プロパティにアクセスしてみましょう。
今までは1を使っていましたが、1は静的メソッドや静的プロパティでは使えないので、代わりに1という形式を使います。
以下の箇所ではコンストラクタが呼び出されるごとに$totalに1が足されていきます。1 ですので、1回目のコンストラクタの呼び出しで$totalに「1」が足されるので1では「1人目山田銀行の近藤次郎様の残高は240000」と出力されます。
2回目のコンストラクタの呼び出しで「1」である$totalにさらに「1」が足されるので1では「2人目山田銀行の近藤次郎様の残高は240000」と出力されます。
$Bankオブジェクトと$Bank1オブジェクトが1つの$totalを共通して使っていることが分かります。
これは説明した通り、$totalがクラスに属しているからです。