ぬの部屋(仮)
nu-no-he-ya
  •    1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
         12
    3456789
    10111213141516
    17181920212223
    242526272829 
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
        123
    45678910
    11121314151617
    18192021222324
    25262728   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    15161718192021
    293031    
           
         12
    3456789
    10111213141516
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728     
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
     123456
    78910111213
    14151617181920
    21222324252627
    282930    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
      12345
    6789101112
    13141516171819
    20212223242526
    27282930   
           
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
          1
    2345678
    9101112131415
    16171819202122
    232425262728 
           
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
           
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
           
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
           
      12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
           
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
           
        123
    45678910
    11121314151617
    18192021222324
    25262728293031
           
  • 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++語に翻訳したことになるのだ。

     

    続く…