1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C#面向对象编程:构造函数

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

时间:2024-01-23 08:57:09

相关推荐

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

构造函数的定义:

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

构造函数的格式:

构造函数也是函数,不过它是一种特殊格式的函数;构造函数的名称和类名相同,没有返回类型(注意和返回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();}}}

静态构造函数

类的静态成员:

为什么叫类的静态成员?因为从名字上看,我们就知道静态成员它是属于类的,和对象无关;类的静态成员既然属于类,那么他们的初始化应该在类创建时就同时创建在内存中;类的静态成员函数只能调用类的静态成员变量;

类比对象更早一步初始化,因为在对象的创建时,他是用类来进行实例化的,换句话说,类的模型在内存中还没有创建完毕,如何来初始化对象?所以类存在的时间应该比对象要早,而类的静态成员是和类是在同一时间创建的,所以类的静态成员存在的时间要比对象要早,所以类的静态方法不可以调用类的非静态成员,类的非静态成员是需要对象在实例化时,调用构造函数才创建出来的,如果通过类的静态方法来调用类的非静态成员,那意思就是在调用一个可能根本就还不存在的东西;类的静态数据成员和非静态数据成员的区别: 类的静态数据成员,它属于类,它是唯一的,每个类仅有一份;非表态数据成员,它属于类的实例化对象,它是对象的一部分,每个对象都独立拥有,所以他仅对于自己所在的对象是唯一的;

静态构造函数它用来初始化类的静态成员变量;(简单的理解,类的静态成员仅属于类,和是否创建对象无关,它在对象创建前已经存在)静态构造函数它只执行一次;(因为它属于类,类是唯一的,所以类的静态成员也仅有唯一的一份,所以他们只需要做一次初始化;)类的静态构造函数是无参的;(C#语法规定,类的静态构造函数必须无参)类的静态构造函数不可以重载;(同上)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。