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”个参数的构造函数”,说明系统没有为我们生成默认的无参构造函数,去掉注释后,加上无参构造函数,程序正常无误;
构造函数的相互调用
- 我们思考一下,是否可以用下面的构造函数来代替以上的4个构造函数呢?为什么?
- 构造函数的相互调用又称为 构造函数初始化器,这是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#语法规定,类的静态构造函数必须无参)
- 类的静态构造函数不可以重载;(同上)
0 0
- C#面向对象编程:构造函数
- C#面向对象之构造函数
- JavaScript面向对象编程[一] 构造函数
- javascript面向对象编程构造函数继承
- C++ 面向对象编程 构造函数
- C++面向对象编程<二>:构造函数
- 【第四课】面向对象编程---构造函数
- Perl的面向对象编程-构造函数
- C#温故而知新学习系列之面向对象编程—7-构造函数
- 面向对象构造函数
- 面向对象-构造函数
- 面向对象--构造函数
- 【黑马程序员】4.C#面向对象之类和构造函数
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(二):构造函数的继承
- 新建NSIndexPath
- iOS开发-------地图定位显示周围微博(CLLocationManager 定位管理)
- Android系统之Phone模块-接电话Unsolicited消息的接收和处理过程
- OGRE中MESH文件格式分析
- 二分查找算法
- C#面向对象编程:构造函数
- git和Github常用操作
- python encode和decode函数说明
- Android关于Log不能打印的问题
- 【POI2012】【BZOJ2796】Fibonacci Representation
- JAVA项目出现红色叹号
- 配置urlrewrite不生效
- Android打电话过程
- Android生成模糊化背景的图片