zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/stroll/p/8117118.html
Copyright © 2011-2022 走看看