Class を生成(インスタンス化)する

Class を生成(インスタンス化)する方法の考察です。

前田稔の超初心者のプログラム入門

new で Class を生成

  1. new で Class を生成(作成)する では new で生成して delete で開放する方法をお勧めしましたが、 もう少し掘り下げて考察してみましょう。
    今回の説明に使う GCM Object Class です。
    Constructor のパラメータが省略されても対応出来るように、規定値を設定しています。
    /*★ GCM Class を定義    前田 稔 ★*/
    #include <stdio.h>
    
    class  GCM
    {
      private:
        int     wk,val;
    
      public:
        GCM(int v1=1, int v2=1)
        {   printf("GCM Constructor の実行\n");
            wk= v1;
            val= v2;
            while(wk!=val)
            {   if (wk>val) wk-= val;
                else        val-= wk;
            }
        }
        ~GCM()
        {   printf("GCM Destructor の実行\n");
        }
    
        int GetGcm()
        {
            return val;
        }
    };
    
  2. 幾つかの方法で GCM Object Class を定義してみました。
    1. 単に GCM を定義した場合。
    2. 直接値を指定して定義した場合。
    3. GCM Class のポインタだけを定義して、実行時に new で生成した場合。
    4. GCM Class のポインタに初期値で new を設定した場合。
    GCM     Gcm1;
    GCM     Gcm2(24,32);
    GCM     *Gcm3;
    GCM     *Gcm4 = new  GCM(24,32);
    
    int main()
    {   printf("\nProgram の開始\n");
    
        Gcm3 = new GCM(24,32);
        printf("Gcm1; は %d です\n", Gcm1.GetGcm());
        printf("Gcm2(24,32); は %d です\n", Gcm2.GetGcm());
        printf("Gcm3= new GCM(24,32); は %d です\n", Gcm3->GetGcm());
        printf("*Gcm4= new GCM(24,32); は %d です\n", Gcm4->GetGcm());
        delete Gcm3;
        delete Gcm4;
        printf("Program の終了\n\n");
        return 0;
    }
    
  3. GCM Gcm1; の場合はパラメータが省略されているので「1」が表示されます。
    GCM Gcm2; GCM *Gcm3; GCM *Gcm4; では 24 と 32 の最大公約数が計算されて表示されます。
    GCM *Gcm3; と書くだけでは GCM Class のポインタ(値は NULL)が定義されただけで、実体がありません。
    Gcm3 = new GCM(24,32); を実行した時点で、実体がメモリ上に確保されます。
    このことを Java などではインスタンス化などと呼んでいます。
    new で Class を生成したときは delete で開放しなければなりません。
    NULL が格納されているポインタを delete 演算子に指定すると、何も起こらないことが保証されているようです。
    Constructor と Destructor が実行されるタイミングを確認して下さい。
    GCM Constructor の実行
    GCM Constructor の実行
    GCM Constructor の実行
    
    Program の開始
    GCM Constructor の実行
    Gcm1; は 1 です
    Gcm2(24,32); は 8 です
    Gcm3= new GCM(24,32); は 8 です
    *Gcm4= new GCM(24,32); は 8 です
    GCM Destructor の実行
    GCM Destructor の実行
    Program の終了
    
    GCM Destructor の実行
    GCM Destructor の実行
    

int Class

  1. 次のプログラムを見て下さい。
    int 型の領域に幾つかの方法で値を設定して表示してみました。
    1. 領域だけを定義して、後で値を格納した場合。
    2. =で初期値を設定した場合。
    3. 括弧の中で初期値を設定した場合。
    4. ポインタ領域を確保して、実行時に間接参照で値を格納した場合。
    5. ポインタ領域を確保して、new で値を設定した場合。
    new で確保した領域は delete で開放して下さい。
    /*★ int Class Test Program    前田 稔 ★*/
    #include <iostream>
    
    int main()
    {   int n1;
        int n2 = 20;
        int n3(30);
        int *p,*q;
    
        n1 = 10;
        p = new int();  // int型の領域を動的確保
        *p = 123;
        q = new int(456);
        std::cout << "n1=" << n1 << "  n2=" << n2 << "  n3=" << n3
            << "  *p=" << *p << "  *q=" << *q << std::endl;
        delete p;       // 動的に確保した領域を解放
        delete q;       // 動的に確保した領域を解放
        return 0;
    }
    
  2. このプログラムを見て何か感じませんか。
    int も Object Class と同じような書き方でしょう。
    実は C++ では、int型のような基本データ型にもコンストラクタとデストラクタがあり、Object Class? になっています。
    また C# では int型 には ToString() などのメソッドも用意されています。
    ToString() の例は「超初心者のプログラム入門(C#)/int 型を MessageBox に表示する」を参照して下さい。

超初心者のプログラム入門(C/C++)