C#中的构造函数,与继承中的构造函数详解

本文详细介绍了构造函数的概念,包括无参和有参构造,以及在类的继承中的调用顺序。重点讲解了如何重载构造函数、使用`this`和`base`关键字,以及在继承时父类无参构造函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造函数以及继承中的构造函数

何为构造函数?

构造函数是实例化对象时(即创建类的新对象时)所调用的函数,主要用来初始化成员变量,每个类都会有默认的一个无参构造函数,构造函数不需要写返回值

class Student{
}
Student stu=new Student();

这段代码是不是很熟悉?这其实就是对Student类默认无参构造函数的调用,即使Student类中并没有写出这个方法,但是他是默认自带的,他为新的stu对象分配了内存空间
当然,虽然自带无参构造函数,我们同样可以吧他写出来,如下
语法

访问修饰符类名(){
}

注意:构造函数的名称与类的名称必须完全相同,它没有任何返回类型。

class Person{
	string name;
	int age;
	string phone;
	public Person(){
		name = "红笺";
		age = 17;
	}
}

当我们现在再调用构造函数时,会执行函数里面的代码,为name,age赋值
注意:中是允许自己申明无参构造函数的,而结构体中不允许

构造函数可以被重载,也就是说可以写有参构造函数

public Person(int age){
	this.age = age;               //this.age表示当前调用该函数的对象自己的age,而age表示调用有参构造函数是传进来的参数age
}
public Person(string name,int age){
	this.age = age;
	this.name = name;
}

有参构造函数怎么使用呢?

实例化对象时,对比有参构造函数写出相应的语句即可,如我想实例化一个有年龄的对象,可以

Person p1=new Person(17);
//     public Person(int age)

如我想实例化一个有年龄有姓名的对象,可以

Person p2=new Person("大学生",18);
//     public Person(string name,int age)

注意!重写了有参构造函数,并且没有重写无参构造函数时,无参构造函数会默认被顶掉(会失去默认的无参构造函数),也就是说写

Person p=new Person();

时,会报错
!!!!!!一定要注意

如果想使用有参构造函数的同时使用无参构造函数,则需要重写无参构造函数,即写出

public Person(){
}

这个无参构造函数即可

重载对我们的好处很多,可以在实例化对象的的时候对对象进行成员变量的初始化等等,很方便
理论上重载可以写无数个,根据需求而定

构造函数的特殊写法:

可以通过this重用构造函数代码

访问修饰符 构造函数名(参数列表) : this(参数1,参数2,参数3.....){
}

重点咯,我会通过许多例子来帮助你理解this的作用
理论知识是,当你如上写代码的时候,会默认优先调用this(该函数对象自己)的方法,再调用现在写的方法
比如

public Person(string name) : this("xiahua",19)
{
	this.name=name;
}

如上例子
我在使用

Person p3=new Person("xiaoming");

时,会先调用this后面这个构造函数,括号内是一个字符串,一个int值类型符合==Person(string name,int age){}==这个构造函数,所以会先执行这个构造函数,再执行Person(String name)这个函数
再举个例子

public Person(string name,string phone) : this(19)
{
	this.name = name;
	this.phone = phone;
}

我在使用

Person p3 = new Person("xiaoming","11915768459");

函数时,会先调用this后面这个构造函数,括号内是一个int值类型符合==Person(intage){}==这个构造函数,所以会先执行这个构造函数,为age赋值,再执行Person(Stringname,stringphone)这个函数,为name,phone赋值

也就是说,只要构造函数后面带了**=:this()这个标识,调用==:之前的构造函数==时会先调用**:后面的函数,再调用前面的函数
this()可以是无参的,this()括号中的参数,可以是从前面传进来的,也可以是自己写的默认值,只要类型一样,传什么都行
}

继承中的构造函数

特点
当申明一个子类对象时,先执行父类()的构造函数,在执行子类的构造函数
注意:父类的无参构造很重要,子类可以通过base关键字代表父类,使用父类的构造函数

继承中构造函数的执行顺序
父类的父类的构造->父类构造->子类构造,继承多少个调用多少个

class GrandFather{
public GrandFather(){
	Console.WriteLine("爷爷");
	}
}
classFather : GrandFather{
	publicFather(){
		Console.WriteLine("爸爸");
	}
}
classSon : Father{
	publicSon()
	{
		Console.WriteLine("儿子");
	}

输出结果会是爷爷,爸爸,儿子
在这里插入图片描述

父类的无参构造很重要

class Big{
	public Big(int a){
		Console.WriteLine("父类的有参构造");
}
public Big(){
}
//重写出无参构造函数就不会报错了
}
classSmall : Big{
}

重写了父类的有参构造函数,默认无参构造函数已经没有了,此时子类便会报错,当你实例化一个子类的时候,会自动先调用父类的构造函数,而父类的默认无参构造函数没有了自然会报错,所以如果重写了父类的构造函数,记得吧无参构造函数一并重写了

通过base调用指定父类构造

与前文this相似
如果你实在不想写父类的无参构造,或者就是想在实例化子类的时候调用父类的有参构造,可以使用base指定父类的有参构造函数

class FFather{
	publicFFather(inta){
		Console.WriteLine("父类的有参构造");
	}
}
class SSon : FFather{
	public SSon(int i) : base(i){
	}
}

逻辑是这样的只要你子类实例化的时候,必定会调用父类的构造函数,如果你实例化没有传参就要调用父类的无参构造,如果你的无参构造被顶掉了,肯定会报错,
如果你实例化传参了,就要调用父类的有参构造,传入的参数类型跟父类的有参构造的参数要一样

C#中的构造函数是用于创建和初始化类的实例的特殊方法。构造函数的名称类名相同,并且没有返回类型。在创建类的对象时,构造函数会自动调用。 继承是面向对象编程中的一个重要概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。在C#中,使用冒号(:)来指定一个类继承自另一个类。 当子类继承父类时,子类会自动继承父类的构造函数。子类可以通过调用父类的构造函数来初始化从父类继承的成员变量和属性。在子类的构造函数中使用关键字base来调用父类的构造函数。 下面是一个示例代码,演示了C#构造函数继承的用法: ```csharp // 父类 class Animal { public string Name { get; set; } // 父类的构造函数 public Animal(string name) { Name = name; } } // 子类 class Dog : Animal { public string Breed { get; set; } // 子类的构造函数 public Dog(string name, string breed) : base(name) { Breed = breed; } } // 使用 Dog myDog = new Dog("旺财", "哈士奇"); Console.WriteLine($"Name: {myDog.Name}, Breed: {myDog.Breed}"); ``` 在上面的示例中,Animal类有一个构造函数,接受一个name参数来初始化Name属性。Dog类继承自Animal类,并且有一个额外的属性Breed。Dog类的构造函数使用base关键字调用父类的构造函数来初始化从父类继承的Name属性,然后再初始化自己的Breed属性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值