C++ 重载构造函数

 

  在接下来的时间里面,我们准备学习,“重载构造函数”。

 

  首先,我们会提出一个问题,为什么要学习和使用重载构造函数呢

 

  那么,我们可以举一个例子,例如在一个游戏中,我们定义一个“角色类”,而类中包含有以下的属性,分别是生命值,攻击力(近战),防御力,远程攻击力(即魔法攻击力),这4个属性。

 

  而通过这个“角色类”,我们可以定义出3种不同类型的兵种,分别是步兵,弓箭手,魔法师,而这3种不同类型的兵种它们的攻击方式与防御力都是不一样的,所以,我们具体来分析一下,这样,大家自然就可以了解到为什么要学习和使用重载构造函数了。

 

  (1)魔法师——它是使用魔法的远程攻击,远程攻击力较强,但是,不能适用于近距离作战,所以,它的防御力为0,同时,近战的攻击力也为0,因为,它只能使用魔法,所以,近战与防御这两个属性就不用设置了。所以,在使用“角色类”定义魔法师对象时,类中的构造函数只需要接收2个参数,一个用于定义生命值,一个用于定义远程攻击力,所以,这个构造函数只需要2个参数

 

  (2)步兵——它只能近距离作战,不能远程攻击,所以,远程攻击力是不能使用,也就不用设置了,所以,在使用“角色类”定义步兵对象时,类中的构造函数只需要接收3个参数,一个用于定义生命值,一个用于定义攻击力,一个用于定义防御力,所以,这个构造函数需要3个参数。

 

  (3)弓箭手——它即可以远程攻击,也可以近距离作战,所以,在使用“角色类”定义步兵对象时,类中的构造函数需要接收4个参数,一个用于定义生命值,一个用于定义攻击力,一个用于定义远程攻击力,一个用于定义防御力,所以,这个构造函数需要4个参数。

 

 

  所以,通过上面的分析,我们就可以知道,在使用同一个类去定义不同类型的对象时,就可以通过不同参数数量的构造函数(即重载构造函数)去设置类中不同的属性值,而这个就是重载构函数的作用。

 

 

 

  接下来,我们就要看看“重载构造函数”的定义形式,其实,它就是我们前面学习的带参构造函数,而有所不同的只是,重载时,在同一个类中,有多个同名,但参数数量不同,或参数的类型不同的构造函数。

 

 

  接下来,我们将上面分析的例子通过代码实现出来,这样,大家就可以更加清晰地看到重载构造函数的定义形式。

 

例子:

class Role       //定义了角色类Role

{

 public:

 int  Life;//生命值

 int  Attack;//攻击力

 int  Defend;//防御力

 int  Magic; //魔法攻击力(远程攻击)

 

 Role() //默认构造函数

 {

 }

 

//整个类中,只这个重载构造函数中有2个参数

 Role(int L,int Mag)  //重载构造函数(针对魔法师对象定义时使用)

 {

  //下面2行代码是需要进行赋初化的属性,而2个属性值分别来自于参数L和Mag

  Life = L;     //设置生命值

  Magic = Mag; //设置魔法攻击力

 }

 

//整个类中,只这个重载构造函数中有3个参数

 Role(int L,int Ack,int Def)  //重载构造函数(针对步兵对象定义时使用)

 {

  //下面3行代码是需要进行赋初化的属性,而3个属性值分别来自于参数L,Ack以及Def

  Life = L;     //设置生命值

  Attack = Ack;  //设置攻击力

  Defend = Def;  //设置防御力

 }

 

//整个类中,只这个重载构造函数中有4个参数

 Role(int L,int Mag,int Ack,int Def)  //重载构造函数(针对弓箭手对象定义时使用)

 {

  //下面3行代码是需要进行赋初化的属性,而3个属性值分别来自于参数L,Mag,Ack以及Def

  Life = L;     //设置生命值

  Magic = Mag;  //设置远程攻力

  Attack = Ack;  //设置攻击力

  Defend = Def;  //设置防御力

 }

 

};

 

  通过上面的例子我们可以看到,除了默认构造函数以外,其它3个同名的构造函数就是重载构造函数,而它们的特点就是带有不同数量的参数,而如果出现参数的数量相同时,就必须把参数的类型定义为不相同,否则,就会出错。

 

  例如在上面的Role角色类中再定义一个带有两个参数的重载构造函数Role(int L,int Mag) ,这样编译程序时就会出错,所以,我们要将其中一个或全部参数的类型改为不是“整形”,即不是“int”就可以了,例如将第二个参数的类型改为float浮点型,即Role(int L,float Mag)这样,编译就不会出错了。

 

 

  接下来,我们就通过代码来看看,在定义不同类型的对象时如何使用重载构造函数,代码如下:

 

Role  Mg(10,150); 

//上面这行代码通过Role类来定义了Mg对象,代表魔法师,定义时传递了两个整型参数,10和150,所以,程序就会到Role类中找到有两个整形参数的构造函数来接收这两个参数,这样,魔法师对象的生命值就设定为10,而魔法攻击力就设定为150。

 

Role  BuBing(10,50,20); 

//上面这行代码通过Role类来定义了BuBing对象,代表步兵,定义时传递了三个整型参数,10,50和20,所以,程序就会到Role类中找到有三个整形参数的构造函数来接收这三个参数,这样,步兵对象的生命值就设定为10,而攻击力就设定为50,而防御力就设定为20。

  

 

  通过上面的学习,相信大家对重载构造函数的定义与使用有了一个初步了解,但是,如何灵活地运用这个知识点呢?那么,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对该知识点的理解和运用,以及“尽快进入到编程的状态”

 

  要达到灵活运用,是需要通过不停地反复训练才可以做到,所以,不要停留在理论规则上面,快动起来吧!


 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练