什么是构造函数?
构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。写一个类,如果没有写任何的构造函数,那么这个类有一个默认的无参数的构造函数。如果写了构造函数,那么在这个类中就有两个构造函数,一个默认的,一个是自己写的,不过,自己写了构造函数,之前默认的那个构造函数就不能用了,如果还想用之前的那个默认的构造函数,就必须再重新写一个无参数的构造函数。
1.构造函数的命名必须和类名完全相同。
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略此默认构造函数是不带参数的。而一般的方法不存在这一特点;
5.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
6.构造函数有回滚的效果,构造函数抛出异常时,构造的是一个不完整对象,会回滚。
默认的构造函数和自己写的构造函数都是实例化对象,初始化数据的,默认构造是说所有的类都从祖先object那继承了空参的构造方法,你不写与写空参构造都存在,而有参数的构造一般是自己写的,写就有不写就没有,它的作用和空参的一样,只是它里面可以有参数。构造函数可以给字段赋值,当不能赋值的时候,构造函数解决了赋值麻烦的问题。说了这么多,是不是晕乎乎的,让我们来看一个简单的例子,看完这个例子就彻底明白什么是构造函数了。我们创建一个student类,在类中写字段和方法。使用一个简单的构造函数定义了名为 student的类,然后使用 new运算符来实例化该类。在为新对象分配内存之后,new运算符立即调用 student 构造函数。
显示一个人的姓名,性别和年龄。
private string _name;//字段
//属性
public string Name
{
get { return _name; }//读值
set { _name = value; }//写值
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
//say方法
public void Say()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生" ,this .Name ,this.Age ,this.Gender );
}
下面是在主函数中调用类中的方法
static void Main(string[] args)
{
student zsStu = new student();//实例化一个类
zsStu.Name = "张三";//赋值
zsStu.Age = 18;
zsStu .Gender ='女';
zsStu.Say();
zsStu.Score();
Console.WriteLine(" ");
Console.WriteLine("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
Console.WriteLine(" ");
student xlStu = new student();
xlStu.Name = "小兰";
xlStu.Age = 16;
xlStu .Gender ='女';
xlStu.Say();
xlStu.Score();
Console.ReadKey();
是不是总感觉在主函数中调用的代码有点多啊,好像存在冗余现象。
这时就出现了构造函数,它的出现解决了赋值麻烦的问题
public class person
{
//是类的构造方法
public person(string name,char gender,int age)
{
this._name = name;//指示代词
this._gender = gender;
this._age = age;
}
//重新写的无参构造函数
public person()
{
}
private string _name;
public string Name
{
get { return _name; }
//set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
//set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
//set { _age = value; }
}
public void Say()
{
Console.WriteLine("我叫{0},今年{1}岁了,是{2}生", this.Name, this.Age, this.Gender);
}
}
然后我们在主函数中进行调用
static void Main(string[] args)
{
person per = new person("张三",'男',18);//利用构造函数给里面的字段赋值
per.Say();
Console.ReadKey();
static void Main(string[] args)
{
person per = new person("张三",'男',18);//利用构造函数给里面的字段赋值
per.Say();
Console.ReadKey();
轻轻松松就把很繁琐的代码进行了巧妙的转化,利用构造函数给里面的字段赋值。上面的代码中就出现了构造函数的重载,我们先简单的了解一下,
学习永无止境,因为C#视频太多了,看到一半就再也不想看了,现在想想,一个小小的构造函数都能做到如此强大,使我们的程序更加的便捷,所以我们更要不断的去认识,去接触我们不知道的事物,并且很好的掌握它,这才是我们现阶段应该做的。
网友评论