スポンサーリンク

| キーワード:

C/C++の「クラス」とは何なのか

学校の授業では構文は教えてくれるがその機能が何のためにあるかを教えてくれない。なぜだ。なぜなのだ。

そんなわけで、ここでは「クラスとは何で、使うと何がいいのか」について私なりの解釈を載せようと思う。

 

まず、かなり極端な例だが、以下のようなプログラムを考える。

 

//身長を入力する関数
double scanHeight(){
  double h;
  printf("身長を入力してください:");
  scanf("%lf",&h);
  return h;
}
//体重を入力する関数
double scanWeight(){
  double w;
  printf("体重を入力してください:");
  scanf("%lf",&w);
  return w;
}
//BMIを計算する
int main(){
   double HeightA = scanHeight();
   double WeightA = scanWeight();
   double HeightB = scanHeight();
   double WeightB = scanWeight();
   double BMI_A = WeightA*HeightA*HeightA;
   double BMI_B = WeightB*HeightB*HeightB;
}

 

このプログラムは正常に動作する(多分)。だが、コーディングという観点からみるとバグを生みやすい書き方をしているといえる。

以下のようなバグを作る可能性がある。

 

int main(){
   double HeightA = scanHeight();
   double WeightA = scanHeight();//コピペミスかなにか。コンパイルは通る
   double HeightB = scanHeight();
   double WeightB = scanWeight();
   double BMI_A = WeightA*HeightA*HeightA;
   double BMI_B = WeightB*HeightB*HeightB;
}

 

このようなバグを作った場合、実行時には三回連続で身長を聞かれてしまう。

 

ここで問題である。なぜこのソースコードがコンパイルを通るのか?

WeightAという変数を体重用の変数と考えているのも、scanHeightという関数を身長用の関数だととらえているのも、いずれも人間が勝手にそうだと言い張っているだけなのだ。コンピュータ(コンパイラ及びCPU)には、このプログラムは以下のように見える。

 

int main(){

   double型の変数1 = doubleを返す関数1();

   double型の変数2 = doubleを返す関数1();

   double型の変数3 = doubleを返す関数1

   double型の変数4 = doubleを返す関数2;

   double型の変数5 = 変数2*変数1*変数1;

   double型の変数6 = 変数4*変数3*変数3

}

 

変数名WeightAや関数名scanHeightはあくまで人間がわかりやすいように人間が勝手につけたものだ。コンピュータにとってはWeightAもHeightAも、double型の二つの変数、程度の違いしかない。

 

ここでもし、以下のように書けたら、きっとエラーが出るに違いない。

//身長を入力する関数
heightValue_t scanHeight(){...}
//体重を入力する関数
weightValue_t scanWeight(){...}
int main(){
   heightValue_t HeightA = scanHeight();
   weightValue_t WeightA = scanHeight();//エラー WeightAは体重型だがscanHeightが返すのは身長の値
   heightValue_t HeightB = scanHeight();
   weightValue_t WeightB = scanWeight();
   bmiValue_t BMI_A = WeightA*HeightA*HeightA;
   bmiValue_t BMI_B = WeightB*HeightB*HeightB;
}

 

C++が扱えるデータの種類は文字コード(char)や小さな整数(short)や大きな整数(int)や小数(double)といった、「数値」だけである。

それだけでもプログラムを組むことはできるのだが、「体重」や「身長」や「人間」や「車」といった、現実に存在する様々な種類のデータを扱いたい。

データの種類を追加することで、現実世界に存在するモノに対する処理を、ソースコード上に、C++言語の文法で記述できるようにするための機能。

それがクラスなのである。

 

例えば、

class Apple{
   unsigned char Color[4];
   double weight;
};

というプログラムを書いたら、それは

このプログラムには「リンゴ」という種類(データ型)が定義されており、リンゴというモノ(インスタンス)には、色と重さがある

という日本語を、C++語に翻訳したことになるのだ。

 

続く…

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: