先週の構造体の基本の説明を受け、構造体の実際的な使い方の紹介を行う。 後半では、構造体をうまく使えば、データ隠蔽、手続き隠蔽ができて、 手続き・データ設計者と、それを利用する人に分かれて大きいプログラムが書ける… といった説明を行う。 また、この発展形としてのオブジェクト指向の導入部分を説明する。 ただし、オブジェクト指向のネタは、本来の授業範囲外でテストには出さない。
構造体のポインタ渡し
構造体を使っていると、そのデータを使った処理の記述が増えてくる。 この場合は、以下のように関数に構造体へのポインタを渡して操作を行う。
struct Person { char name[ 10 ] ; int age ; } ; // ポインタ渡しに慣れるまではアロー演算子は使わない。 void set( struct Person*p , char s[] , int a ) { // 質問:なぜ (*p).name = s ; ではいけないのか? strcpy( (*p).name , s ) ; (*p).age = a ; } // 慣れたら、アロー演算子。 void print( struct Person*p ) { printf( "%sさんは%dさいです\n" , p->name , p->age ) ; } void main() { struct Person saitoh ; set( &saitoh , "saitoh" , 45 ) ; print( &saitoh ) ; }
このようなスタイルに慣れると、呼び出し側(この例ではmain()の中)には、 データ構造の中身、手続きの中身を知らなくても、プログラムが書ける。 このようにデータ構造をブラックボックスでとらえられることをデータの隠蔽化、 処理の中身をブラックボックス化することを手続きの隠蔽化という。
そのまんまオブジェクト指向に…
この辺に慣れてくると、オブジェクト指向も理解しやすくなってくる。 オブジェクト指向では、データ構造⇒オブジェクト、データに対する手続き⇒メソッドと呼び、 この2つを合わせてクラスと呼ぶ。
class Person { char name[ 10 ] ; int age ; void set( char s[] , int a ) { strcpy( name , s ) ; age = a ; } void print() { printf( "%s%d" , name , age ) ; } } ; void main() { Person saitoh ; saitoh.set( "saitoh" , 45 ) ; saitoh.print() ; }
授業で眠そうにしている学生さんがいたので、ちょいとイヤミきつめで注意。 緊迫感がなさそうだし、3年だと「あと2年しかない」、「不景気で就職も進学も大変」 というネタでやる気をださないと苦労するのは自分…と雑談を交えた授業となった。