C#--構造函數的理解


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

 

 

在這里引用一下別人的總結,我覺得挺好的:

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

    構造函數具有一些特質:

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

            (2).構造函數沒有返回類型,它可以帶參數,也可以不帶參數;

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

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

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

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

      {

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

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

      無法直接調用靜態構造函數。在程序中,用戶無法控制何時執行靜態構造函數。

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

      靜態構造函數在為非托管代碼創建包裝類時也很有用,此時該構造函數可以調用 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM