new で Class を生成する

new で Class を生成(インスタンス化)する方法と、直接 Class を定義する方法の考察です。

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

new で Class を生成

  1. 構造体や Object Class のポインタを定義しておいて、new で生成して delete で開放する方法は システムの制御方法も明快で、プログラマに取っても解りやすい方法です。
  2. 今回の説明に使う GCM Object Class です。
    説明の都合上 Constructor でパラメータを渡しています。
    /*★ GCM Class を定義    前田 稔 ★*/
    #include <stdio.h>
    
    class  GCM
    {
      private:
        int     wk,val;
    
      public:
        GCM(int v1, int v2)
        {
            wk= v1;
            val= v2;
            while(wk!=val)
            {   if (wk>val) wk-= val;
                else        val-= wk;
            }
        }
    
        int GetGcm()
        {
            return val;
        }
    };
    
  3. GCM Object Class のポインタを定義して、new で Object Class を生成して GCM を計算してみましょう
    GCM *Gcmcls; で定義すると GCM Class のポインタが確保されるだけです。
    実際に Object Class が生成(インスタンス化)されるのは new GCM(24,32); を実行したときです。
    ヒープ領域に生成(作成)された GCM Class は delete Gcmcls; で開放されます。
    GCM     *Gcmcls;
    
    int main()
    {
        Gcmcls = new  GCM(24,32);
        printf("GCM(24,32) は %d です\n", Gcmcls->GetGcm());
        delete Gcmcls;
        return 0;
    }
    
  4. ポインタに new で生成した値を直接格納することも出来ますが、その場合でも delete で開放しなければなりません。
    GCM     *Gcmcls = new  GCM(24,32);
    
  5. 最近では Object Class を new で生成(インスタンス化)する方法が一般的になっています。
    JAVA や C# では、言語仕様からポインタが廃止(使用が制限)されています。
    次のソースコードはC#ですが new で Object を生成しています。
    glcm にポインタを示す「*」は使われていませんが、実質的にはC言語のポインタと同じです。
    JAVA や C# では、ガーベッジコレクターが開放してくれるので delete は不用です。
        gcmlcm  glcm = new gcmlcm(24,32);
        Console.WriteLine("GCM={0}  LCM={1}",glcm.gcm(),glcm.lcm());
        

直接 Class を定義

  1. Object Class を直接定義する方法です。
    GCM Object Class は new で Class を生成する場合と同じです。
    「GCM Gcmcls(24,32);」で定義するとポインタの時とは違い GCM Class が直接生成されます。
    Constructor にパラメータが無いときは「GCM Gcmcls;」と書きます。
    new も delete も使う必要が無くて、ポインタに比べてすっきりしたプログラムに見えます。
    GCM     Gcmcls(24,32);
    
    int main()
    {
        printf("GCM(24,32) は %d です\n", Gcmcls.GetGcm());
        return 0;
    }
    
  2. 「GCM Gcmcls(24,32);」と書くだけで Object Class が生成される方法は便利なようでも、複雑な問題を含みます。
    構造体の場合は「最初から領域を割り当てるか」「new で動的に割り当てるか」だけの違いですが、 Constructor と Destructor が絡むと事情は複雑です。
    この方法を使用するのは、今回のような単純なケースに留めておいて下さい。
  3. 「GCM Gcmcls」と書くだけで Class が生成されるのですが、このような使い方をする可能性がある場所はどこでしょう。
    定義する場所により Constructor と Destructor を呼び出す仕組みが必要になります。
    また全てのケースで同じように Constructor を実行すると問題が発生するケースが出てきます。
    どのような問題が発生するかは、のちほど改めて説明することにしましょう。
  4. Class は new で生成して delete で開放するのが簡明な方法です。
    また Class をパラメータとして使用するときはポインタを使うようにして下さい。

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