C#面向对象编程:构造函数

来源:互联网 发布:windowsrt软件 编辑:程序博客网 时间:2024/06/16 11:25

构造函数的定义:

  • 构造函数,在实例化对象时,编译器会自动调用的用于初始化对象的数据成员的函数;
  • 主要作用:用于在创建对象时,对对象的数据成员(非静态,好像有点多余,静态的数据成员属于类,而非对象)进行初始化;

构造函数的格式:

  • 构造函数也是函数,不过它是一种特殊格式的函数;
  • 构造函数的名称和类名相同,没有返回类型(注意和返回void类型的区别),不需要返回值;

构造函数的重载:

  • 函数重载:重载的函数他们在相同的作用域内,有着相同的函数名称,参数的类型或参数的个数不同;返回值类型不同不能构成函数的重载;
  • 构造函数的重载:顾名思义,有多个以不同的初始化方式来初始化对象的函数;
  • 代码实例如下:
    using System;namespace MyCSharpPro{    class Person    {        private string Name { set; get; }        private int Age{set;get;}        public Person()                //无参构造函数        {            this.Name = "张珊";            this.Age = 18;        }        public Person(string name)  //仅带有一个name的形参的构造函数        {            this.Name = name;              this.Age = 18;        }        public Person(int age)      //仅带一个age形参的构造函数        {            this.Name = "张珊";            this.Age = age;        }        public Person(string name, int age) //带有name和age两个形参的构造函数        {            this.Name = name;            this.Age = age;        }        public void Display()        {            Console.WriteLine(this.Name, this.Age);        }    }    class PersonDemo    {        public static void Main()        {            Person p1 = new Person();           //调用无参构造函数            p1.Display();            Person p2 = new Person("Hely");     //调用带有一个name的形参的构造函数            p2.Display();            Person p3 = new Person(20);         //调用带一个age形参的构造函数            p3.Display();            Person p4 = new Person("Jack", 19); //调用带有name和age两个形参的构造函数            p4.Display();            Person p5 = new Person(age: 20, name: "Lily");  //调用带有name和age两个形参的构造函数            p5.Display();            Console.ReadKey();        }    }}

    • 我们思考一下,是否可以用下面的构造函数来代替以上的4个构造函数呢?为什么?
      public Person(string name = "张珊", int age = 18){    }

      </pre></li></ul></li></ul><h2>默认构造函数:</h2><ul><li>一个类,在我们没有写任何构造函数的时候,系统将自动给该类生成一个无参的默认构造函数;</li><li>注意:如果我们在类中写了任何一个构造函数,系统将不再为我们创建构造函数;有时候我们在写代码时,发现在没有写构造函数的时候,程序往往是正常的,相反我们加上某一构造函数,程序相反会编译错误,提示“不包括采用0个参数的构造函数”,这时候我们需要手动加上无参构造函数,这就是因为在我们写了任一构造函数后,系统将不再给类生成默认无参构造函数;</li><li>示例如下:<pre name="code" class="csharp">using System;namespace MyCSharpPro{    class Person    {        private string Name { set; get; }        private int Age{set;get;}        //public Person()                //无参构造函数        //{        //    this.Name = "张珊";        //    this.Age = 18;        //}        public Person(string name)  //仅带有一个name的形参的构造函数        {            this.Name = name;              this.Age = 18;        }        public Person(int age)      //仅带一个age形参的构造函数        {            this.Name = "张珊";            this.Age = age;        }        public Person(string name, int age) //带有name和age两个形参的构造函数        {            this.Name = name;            this.Age = age;        }        public void Display()        {            Console.WriteLine(this.Name, this.Age);        }    }    class PersonDemo    {        public static void Main()        {            Person p1 = new Person();           //调用无参构造函数            p1.Display();            Person p2 = new Person("Hely");     //调用带有一个name的形参的构造函数            p2.Display();            Person p3 = new Person(20);         //调用带一个age形参的构造函数            p3.Display();            Person p4 = new Person("Jack", 19); //调用带有name和age两个形参的构造函数            p4.Display();            Person p5 = new Person(age: 20, name: "Lily");  //调用带有name和age两个形参的构造函数            p5.Display();            Console.ReadKey();        }    }}

      我们故意注释掉无参构造函数,编译后,发现提示错误:“error CS1729: “MyCSharpPro.Person”不包含采用“0”个参数的构造函数”,说明系统没有为我们生成默认的无参构造函数,去掉注释后,加上无参构造函数,程序正常无误;

    构造函数的相互调用

  • 构造函数的相互调用又称为 构造函数初始化器,这是C#的一个特殊的语法;
  • 在有些时候,构造函数内包含一些共同的代码,为了达到代码的复用性,函数初始化器很好的解决了这一问题;
  • 示例代码如下:
    using System;namespace MyCSharpPro{    class Person    {        private string Name { set; get; }        private int Age{set;get;}        public Person() :this("张珊", 18)               //无参构造函数                    {        }        public Person(string name) :this(name, 18)  //仅带有一个name的形参的构造函数        {        }        public Person(int age) :this("张珊", age)      //仅带一个age形参的构造函数        {        }        public Person(string name, int age) //带有name和age两个形参的构造函数        {            this.Name = name;            this.Age = age;        }        public void Display()        {            Console.WriteLine(this.Name, this.Age);        }    }    class PersonDemo    {        public static void Main()        {            Person p1 = new Person();           //调用无参构造函数            p1.Display();            Person p2 = new Person("Hely");     //调用带有一个name的形参的构造函数            p2.Display();            Person p3 = new Person(20);         //调用带一个age形参的构造函数            p3.Display();            Person p4 = new Person("Jack", 19); //调用带有name和age两个形参的构造函数            p4.Display();            Person p5 = new Person(age: 20, name: "Lily");  //调用带有name和age两个形参的构造函数            p5.Display();            Console.ReadKey();        }    }}

    静态构造函数

    • 类的静态成员:

      • 为什么叫类的静态成员?因为从名字上看,我们就知道静态成员它是属于类的,和对象无关;
      • 类的静态成员既然属于类,那么他们的初始化应该在类创建时就同时创建在内存中;
      • 类的静态成员函数只能调用类的静态成员变量;
      • 类比对象更早一步初始化,因为在对象的创建时,他是用类来进行实例化的,换句话说,类的模型在内存中还没有创建完毕,如何来初始化对象?所以类存在的时间应该比对象要早,而类的静态成员是和类是在同一时间创建的,所以类的静态成员存在的时间要比对象要早,所以类的静态方法不可以调用类的非静态成员,类的非静态成员是需要对象在实例化时,调用构造函数才创建出来的,如果通过类的静态方法来调用类的非静态成员,那意思就是在调用一个可能根本就还不存在的东西;
      • 类的静态数据成员和非静态数据成员的区别:
        1. 类的静态数据成员,它属于类,它是唯一的,每个类仅有一份;
        2. 非表态数据成员,它属于类的实例化对象,它是对象的一部分,每个对象都独立拥有,所以他仅对于自己所在的对象是唯一的;
    • 静态构造函数它用来初始化类的静态成员变量;(简单的理解,类的静态成员仅属于类,和是否创建对象无关,它在对象创建前已经存在)
    • 静态构造函数它只执行一次;(因为它属于类,类是唯一的,所以类的静态成员也仅有唯一的一份,所以他们只需要做一次初始化;)
    • 类的静态构造函数是无参的;(C#语法规定,类的静态构造函数必须无参)
    • 类的静态构造函数不可以重载;(同上)
0 0