zoukankan      html  css  js  c++  java
  • C#类型成员:构造函数

    一、构造函数

      构造函数是类的特殊方法,它永远不会返回值(即使是void),并且方法名和类名相同,同样支持重载。在使用new关键字创建对象时构造函数被间接调用,为对象初始化字段和属性的值。

      无参构造函数即默认构造函数,在我们没有创建任何构造函数时,编译器会为我们创建一个默认构造函数,反之当我们创建了任何构造函数,编译器不会为我们创建默认构造函数。

      下面我们设计一个无构造函数的空调类,一个无默认构造函数的空调类和一个有多个构造函数的空调类,并实例化它们。

      1 /// <summary>
      2 /// 空调Air
      3 /// </summary>
      4 public class Air
      5 {
      6     #region 构造函数
      7     //默认构造函数的结构
      8     //public Air() { }
      9     #endregion
     10 
     11     #region 字段
     12     /// <summary>
     13     /// 空调温度
     14     /// </summary>
     15     public int temperature;
     16 
     17     /// <summary>
     18     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
     19     /// </summary>
     20     public int verticalDirection;
     21 
     22     /// <summary>
     23     /// 空调开关(用int量化开关,0代表关,1代表开)
     24     /// </summary>
     25     public int switch_C;
     26     #endregion
     27 }
     28 /// <summary>
     29 /// 空调AirOther
     30 /// </summary>
     31 public class AirOther
     32 {
     33     #region 构造函数
     34     /// <summary>
     35     /// 一个参数构造函数
     36     /// </summary>
     37     /// <param name="num"></param>
     38     public AirOther(int num)
     39     {
     40         //verticalDirection和switch_C会被设置为默认值0。
     41         temperature = num;
     42     }
     43 
     44     /// <summary>
     45     /// 多参构造函数
     46     /// </summary>
     47     /// <param name="openOrClose">0代表关,1代表开</param>
     48     /// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
     49     /// <param name="num">空调温度</param>
     50     public AirOther(int openOrClose, int upOrdown, int num)
     51     {
     52         temperature = num;
     53         verticalDirection = upOrdown;
     54         switch_C = openOrClose;
     55     }
     56     #endregion
     57 
     58     #region 字段
     59     /// <summary>
     60     /// 空调温度
     61     /// </summary>
     62     public int temperature;
     63 
     64     /// <summary>
     65     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
     66     /// </summary>
     67     public int verticalDirection;
     68 
     69     /// <summary>
     70     /// 空调开关(用int量化开关,0代表关,1代表开)
     71     /// </summary>
     72     public int switch_C;
     73     #endregion
     74 }
     75 /// <summary>
     76 /// 空调AirConditioner
     77 /// </summary>
     78 public class AirConditioner
     79 {
     80     #region 构造函数
     81     /// <summary>
     82     /// 无参构造函数
     83     /// </summary>
     84     public AirConditioner()
     85     {
     86         temperature = 28;
     87         verticalDirection = 3;
     88         switch_C = 0;
     89     }
     90 
     91     /// <summary>
     92     /// 一个参数构造函数
     93     /// </summary>
     94     /// <param name="num"></param>
     95     public AirConditioner(int num)
     96     {
     97         //verticalDirection和switch_C会被设置为默认值0。
     98         temperature = num;
     99     }
    100 
    101     /// <summary>
    102     /// 多参构造函数
    103     /// </summary>
    104     /// <param name="openOrClose">0代表关,1代表开</param>
    105     /// <param name="upOrdown">0代表下,1代表中下,2代表中,3代表中上,4代表上</param>
    106     /// <param name="num">空调温度</param>
    107     public AirConditioner(int openOrClose, int upOrdown, int num)
    108     {
    109         temperature = num;
    110         verticalDirection = upOrdown;
    111         switch_C = openOrClose;
    112     }
    113     #endregion
    114 
    115     #region 字段
    116     /// <summary>
    117     /// 空调温度
    118     /// </summary>
    119     public int temperature;
    120 
    121     /// <summary>
    122     /// 空调上下方向(用int量化方向,0代表下,1代表中下,2代表中,3代表中上,4代表上)
    123     /// </summary>
    124     public int verticalDirection;
    125 
    126     /// <summary>
    127     /// 空调开关(用int量化开关,0代表关,1代表开)
    128     /// </summary>
    129     public int switch_C;
    130     #endregion
    131 }
    132 /// <summary>
    133 /// 实现对象
    134 /// </summary>
    135 public class RealizeObject
    136 {
    137     public void Realize()
    138     {
    139         //Air类无构造函数,创建airNotConstructor对象时会调用默认构造函数为它的所有int型字段赋默认值0。
    140         Air airNotConstructor = new Air();
    141 
    142         //AirOther类不能使用new AirOther()创建对象,因为当我们创建了任何构造函数后,编译器不会为我们创建默认构造函数,此时如果想使用默认构造函数应显示创建。
    143         //AirOther airNotDefaultConstructor = new AirOther();
    144 
    145         //在创建对象air过程中,调用的是AirConditioner类的无参构造函数,它为air的字段赋如下代码的值:
    146         //air.temperature = 28;
    147         //air.verticalDirection = 3;
    148         //air.switch_C = 0;
    149         AirConditioner air = new AirConditioner();
    150 
    151         //在创建对象airOne过程中,调用的是AirConditioner类的一个参数构造函数,它为对象的temperature赋值21,其他两个int型字段被赋默认值0。
    152         AirConditioner airOne = new AirConditioner(21);
    153 
    154         //在创建对象airOpen18过程中,调用的是AirConditioner类的多参构造函数,并赋对应字段传入的值。
    155         AirConditioner airOpen18 = new AirConditioner(1, 1, 18);
    156     }
    157 }

      默认构造函数为数据类型赋默认值如下:

      bool类型设置为false,

      数值类型设置为0或者0.0,

      char类型设置为单个空字符,

      DataTime类型设置为1/1/0001 12:00:00 AM,

      对象引用(包括string)设置为null。

     二、this关键字

      this关键字的作用之一是代表当前类,在方法的参数名与类的字段或属性名相同时,通过this.XXX代表类的字段或属性名,与方法的参数名区分开来。this关键字的作用之二是简化多构造函数中冗余的逻辑代码。

     1 /// <summary>
     2 /// 洗衣机的类
     3 /// </summary>
     4 public class WashingMachine
     5 {
     6     /// <summary>
     7     /// 时长(单位:分钟)
     8     /// </summary>
     9     public int duration;
    10 
    11     /// <summary>
    12     /// 衣物的总数量
    13     /// </summary>
    14     public int clothesNum;
    15 
    16     public WashingMachine() { }
    17 
    18     public WashingMachine(int duration)
    19     {
    20         if (duration > 60)
    21         {
    22             duration = 60;
    23         }
    24         //通过this关键字区分类的字段名与构造函数的参数名
    25         this.duration = duration;
    26     }
    27 
    28     public WashingMachine(int duration, int clothesNum)
    29     {
    30         if (duration > 60)
    31         {
    32             duration = 60;
    33         }
    34         //通过this关键字区分类的字段名与构造函数的参数名
    35         this.duration = duration;
    36         this.clothesNum = clothesNum;
    37     }
    38 }

    使用构造函数给洗衣机时长赋初始值时,超过60分钟的时长统一等于60分钟,此时多构造函数逻辑代码冗余。通过构造函数链的方式,以最多参数的构造函数为主函数,让其他构造函数通过最多参数的构造函数来初始化数据。

     1 /// <summary>
     2 /// 洗衣机的类
     3 /// </summary>
     4 public class WashingMachine
     5 {
     6     /// <summary>
     7     /// 时长(单位:分钟)
     8     /// </summary>
     9     public int duration;
    10 
    11     /// <summary>
    12     /// 衣物的总数量
    13     /// </summary>
    14     public int clothesNum;
    15 
    16     public WashingMachine() { }
    17 
    18     public WashingMachine(int duration) : this(duration, 0) { }
    19 
    20     public WashingMachine(int clothesNum) : this(0, clothesNum) { }
    21 
    22     public WashingMachine(int duration, int clothesNum)
    23     {
    24         if (duration > 60)
    25         {
    26             duration = 60;
    27         }
    28         //通过this关键字区分类的字段名与构造函数的参数名
    29         this.duration = duration;
    30         this.clothesNum = clothesNum;
    31     }
    32 }

    注意:当调用构造函数WashingMachine(int duration)时,会先进入主构造函数,主构造函数执行完成后,会返回到WashingMachine(int duration)构造函数执行其代码。

  • 相关阅读:
    学习日记(2.19 BP神经网络完整代码解读)
    学习日记(2.18)
    学习日记2.17
    学习日记(2.15---2.16)
    最后的作业
    C++第五次作业
    第四次作业:结对编程
    C++第四次作业
    第三次作业:原型设计
    conda基本操作
  • 原文地址:https://www.cnblogs.com/yaojieyuan/p/11263629.html
Copyright © 2011-2022 走看看