C#--構造函數的理解

說白了構造函數就是用來初始化類的數據成員{由於C#語言具備類型安全的特質-->不能使用沒有初始化的變量)}html

 

 

在這裏引用一下別人的總結,我以爲挺好的:安全

    構造函數是一種特殊的成員函數,它主要用於爲對象分配存儲空間,對數據成員進行初始化.app

    構造函數具備一些特質:dom

            (1).構造函數必須與類同名;函數

            (2).構造函數沒有返回類型,它能夠帶參數,也能夠不帶參數;字體

            (3).一個類中能夠有一個或多個構造函數,也就是說構造函數能夠重載,從而提供初始化類對象的不一樣方法;ui

            (4).聲明類對象時,系統自動調用構造函數,構造函數不能被顯式調用;this

    (5).若在聲明時未定義構造函數,系統會自動生成默認的構造函數,此時構造函數的函數體爲空.spa

           (6).靜態構造函數,用static修飾,用於初始化靜態變量,一個類只容許有一個靜態構造函數,在類實例化時加載,這時修飾符public、private失去做用.3d

      {

                 靜態構造函數既沒有訪問修飾符,也沒有參數。

      在建立第一個實例或引用任何靜態成員以前,將自動調用靜態構造函數來初始化類。

      沒法直接調用靜態構造函數。在程序中,用戶沒法控制什麼時候執行靜態構造函數。

        靜態構造函數的典型用途是:當類使用日誌文件時,將使用這種構造函數向日志文件中寫入項。

      靜態構造函數在爲非託管代碼建立包裝類時也頗有用,此時該構造函數能夠調用 LoadLibrary 方法。

      若是靜態構造函數引起異常,運行時將不會再次調用該構造函數,而且在程序運行所在的應用程序域的生存期內,類型將保持未初始化}

          (7)可使用public、protected、private修飾符;

          (8)引用父類構造時用():base()方法,引用自身重載的構造使用():this(int para);

 

 

這裏代碼舉例就只列舉  base和this的用法,也是別人的列子,拿來用的,我以爲說得挺通俗易懂的

public class ConstructorProgram
    {
       private string name;
       private int age;
  
       public ConstructorProgram():this("bell")
       {
           //Console.WriteLine("No Info Left.");
       }
       public ConstructorProgram(string name)
           :this("Simple Programmer",20)
        {
            this.name = name;
            Console.WriteLine("name=" + this.name);
        }
        public ConstructorProgram(string name, int age)
        {
            this.name = name;
            this.age = age;
            Console.WriteLine("name=" + this.name);
            Console.WriteLine("age=" + this.age);
        }

在上面的代碼當中,能夠看出來這裏紅色字體的this用來調用ConstructorProgram類的自身的構造函數。明白這句話的涵義,應該會明白執行結果了。
       public static void Main()
       {
           ConstructorProgram cp1= new ConstructorProgram("goal");
           ConstructorProgram cp2 = new ConstructorProgram();
          
          

       }
    }
   

運行結果:

name=Simple Programmer

age=20

name=goal

name=Simple Programmer

age=20

name=bell

 

在上面的代碼當中,能夠看出來這裏紅色字體的this用來調用ConstructorProgram類的自身的構造函數。明白這句話的涵義,應該會明白執行結果了。

接着下面的代碼以下:

 public  class ConstructorProgram1
    {
      private string name;
      private int age;
      public ConstructorProgram1()
      {
          Console.WriteLine("No Info Left");
      }
      public ConstructorProgram1(string name)
      {
          this.name = name;
          Console.WriteLine("name=" + this.name);
      }
      public ConstructorProgram1(string name, int age)
      {
          this.name = name;
          this.age = age;
          Console.WriteLine("name=" + this.name);
          Console.WriteLine("age=" + this.age);
      }
       

    }

  public  class ConstructorProgram : ConstructorProgram1
    {

      public ConstructorProgram()
      {
          //Console.WriteLine("sdfsdf");
      }
      public ConstructorProgram(string name)
          : base("goalbell",20)
      {
          Console.WriteLine("name=" + name);
      }

      public static void Main() 
      {
          ConstructorProgram cp = new ConstructorProgram("Programmer");
      }
      
    }

運行結果以下:

name=goalbell

age=20

name=Programmer

 

能夠看出上面的代碼,派生類中的base調用了父類(基類)的構造函數了,可是若是不提供初始化(即把 : base("goalbell",20)
不要)指向基類的構造函數的話,它會執行基類中沒有參數的構造函數。

會獲得以下結果:

name=goalbell

age=20

name=Programmer

No Info Left

也就是說BASE是對父類的引用,而THIS是對類自己本身的引用。

在看下下面的代碼,(基類和派生類中的構造函數關係)

using System;
namespace Zjw.Csharp
{
 public  class ConstructorProgram1
    {
      private string name;

      public ConstructorProgram1()
      {
          Console.WriteLine("No Info Left");
      }
      public ConstructorProgram1(string name)
      {
          this.name = name;
          Console.WriteLine("name=" + this.name);
      }

    }
public class ConstructorProgram:ConstructorProgram1
    {
       private string name;
       private int age;
  
       public ConstructorProgram():this("bell")
       {
           //Console.WriteLine("No Info Left.");
       }
       public ConstructorProgram(string name)
           :this("Simple Programmer",20)
        {
            this.name = name;
            Console.WriteLine("name=" + this.name);
        }
        public ConstructorProgram(string name, int age)
        {
            this.name = name;
            this.age = age;
            Console.WriteLine("name=" + this.name);
            Console.WriteLine("age=" + this.age);
        }


       public static void Main()
       {
           ConstructorProgram cp1= new ConstructorProgram("goal");
           ConstructorProgram cp2 = new ConstructorProgram();
          
           Console.ReadLine();

       }
    }


}

執行結果是

No Info Left

name=Simple Programmer

age=20

name=goal

No Info Left

name=Simple Programmer

age=20

name=bell

能夠獲得的結論是 派生類先調用父類的構造函數進行初始化,再調用繼承類的構造函數,若是沒有在繼承類中指明父類的構造函數,則默認調用父類中沒有參數的構造函數,而後調用繼承類的構造函數。

轉自 ;https://www.cnblogs.com/siyecao/archive/2012/05/17/2506375.html

相關文章
相關標籤/搜索