第27講 クラスの学習その2☆☆
第1話 特別な関数(メソッド)であるコンストラクタ
class K{
public:
  //フィールド
  char a[3][40];
  char as[3][40];

  char kok[40],sya[40],suu[40],rik[40],eig[40];
  int d[3][5];

  //メソッド
  void f1(char* na,char* nb,char* nc); //名前の取得
  void f2(char* sa,char* sb,char* sc); //性別の取得
  void f3(int nm,int d1,int d2,int d3,int d4,int d5); //得点の取得

};

void K::f1(char* na,char* nb,char* nc ){
  strcpy(a[0],na); //出席番号0の名前取得
  strcpy(a[1],nb); //出席番号1の名前取得
  strcpy(a[2],nc); //出席番号2の名前取得
}

void K::f2(char* sa,char* sb,char* sc ){
  strcpy(as[0],sa); //出席番号0の性別取得
  strcpy(as[1],sb); //出席番号1の性別取得
  strcpy(as[2],sc); //出席番号2の性別取得
}

void K::f3(int nm,int d1,int d2,int d3,int d4,int d5){
  d[nm][0]=d1; //出席番号nmの国語点数取得
  d[nm][1]=d2; //出席番号nmの社会点数取得
  d[nm][2]=d3; //出席番号nmの数学点数取得
  d[nm][3]=d4; //出席番号nmの理科点数取得
  d[nm][4]=d5; //出席番号nmの英語点数取得
}


class K{
public:
  //フィールド
  char a[3][40];
  char as[3][40];
  char kok[40],sya[40],suu[40],rik[40],eig[40];
  int d[3][5];

  //メソッド
  
void f1(char* na,char* nb,char* nc){
    strcpy(a[0],na);
    strcpy(a[1],nb);
    strcpy(a[2],nc);
  }  //名前の取得

 
 void f2(char* sa,char* sb,char* sc){
    strcpy(as[0],sa);
    strcpy(as[1],sb);
    strcpy(as[2],sc);
  }  //性別の取得

  
void f3(int nm,int d1,int d2,int d3,int d4,int d5){
    d[nm][0]=d1;
    d[nm][1]=d2;
    d[nm][2]=d3;
    d[nm][3]=d4;
    d[nm][4]=d5;
  }  //得点の取得

};
のようにすることも出来ます。
つまり、関数の定義(内容)は、クラス内でもすることが出来るわけです。

今回は、特別な関数(メソッド)であるコンストラクタとデストラクタを紹介しましょう。
まず、コンストラクタとは何でしょうか。
ここでもウィキペディアから引用してみましょう。
コンストラクタ(構築子、Constructor)は、オブジェクト指向プログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化などを行なう関数、メソッドの事。JavaC++PHPなどに見られる。」
オブジェクトを生成する際に初期化を行うという説明です。
オブジェクトを生成するとは、インスタンスを生成すると言い換えても同じです。
要するに抽象から具体を生成するときに行う初期化だというのです。
いつもの例なら抽象『猫』から『ミケ』を生成する際に『ミケ』を初期化しておくわけです。
何を初期化するのでしょうか。
実は、内容はプログラマに任されています。
例えば、『ミケ』の体重の変数が、宣言されたときデフォルトは0にしておくなどです。
このときは、変数に一度も代入されなかったときは、『ミケ』の体重の変数は0なのです。
もちろん、抽象『猫』でコンストラクタは定義されていますから、
すべての具体『ミケ』『もペ』『タマ』・・・は、体重の初期値は0ということになります。

特別な関数コンストラクタには、関数名はクラス名と同じである、返り値をもたないという特徴があります。
ですからコンストラクタの場合は、関数の型を指定する必要がありません。

コンストラクタの任務は、条件の初期化です。

もし、もし変数aの初期値を1としたければ、
class K{
  int a;
  K(){a=1;}
};
とすればよいのです。


次のプログラムで確認できます。
#include<iostream>
using namespace std;

class K{
public:
  int a;
  K(){a=1;}
};

void main(){
  K A;
  cout<<A.a<<endl;
  A.a=5;
  cout<<A.a<<endl;
}
実行画面

ここで注目すべき点は、
void main(){
  K A;
  cout<<A.a<<endl;
  A.a=5;
  cout<<A.a<<endl;
}
に関数Kがmainにないにも関わらず実行されていることです。
つまり、インスタンスが生成された段階でコンストラクタは自動実行されるのです。
ここが普通の関数と違う点です。普通の関数は、
void main(){
  int i,j;
  K A;
  A.f1("太郎","次郎","花子");
  A.f2("男","男","女");
    ・
    ・
  A.f3(0,85,65,78,59,82);
  A.f3(1,27,52,28,45,60);
  A.f3(2,95,97,88,99,93);

    ・
    ・
    ・
}
をご覧になればお分かりにように
呼び出されたときだけ仕事を行うのに対して、
コンストラクタは呼び出されなくても自動的実行されるのです。


また、すべてのインスタンスにおいて、1に初期化されていることは次のように変更すればわかります。
#include<iostream>
using namespace std;

class K{
  public:
  int a;
  K(){a=1;}
};

void main(){
  K A;
  cout<<A.a<<endl;
  A.a=5;
  cout<<A.a<<endl;

  cout<<endl;

  K B;
  cout<<B.a<<endl;
  B.a=7;
  cout<<B.a<<endl;
}
実行画面


つまり、コンストラクタの特徴は
① インスタンスの初期化を行う関数である。
② コンストラクタ名は、クラス名と同一である。
③ 返り値をもたない。
④ コンストラクタはインスタンスが生成された段階で自動実行される。
とまとめることが出来ます。

第26講第8話へ 第2話へ

戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

L>