5.3.2节的程序中,纳美人对象数量的增加是通过Navi.Count++手动关联的。如果希望程序每次产生一个纳美人对象,就自动将Count值加1,那么就要通过构造函数来实现。

构造函数
(1)构造函数的概念
对象在实例化时可以进行数据成员的设置,称为对象的初始化;另外,类有时也需要做一些初始化工作,这些工作都由构造函数完成。构造函数也称构造方法,它的基本特点如下:
 | 构造函数名与类名相同。 |
 | 构造函数没有返回值,且函数头部不用写void。 |
 | 除了在实例化对象时由系统调用以及派生类构造函数调用基类构造函数之外,其他任何函数都不能调 用它。 |
构造函数有多种修饰符,如public、protected、internal等,但一般情况下,构造函数都是公有的方法。
(2)构造函数的声明与调用
(3)构造函数的重载
构造函数可以重载,以方便程序员初始化对象。
(4)静态构造函数
静态构造函数有如下特点:
 | 仅有一个static修饰符。 |
 | 只对静态字段赋初值。 |
 | 由系统自动调用,一个类仅调用一次,与创建对象操作无关。 |
析构函数
(1)什么是析构函数
在对象使用结束时,可以进行一些相关的清理工作并释放所占用的内存空间,这个工作由析构函数完成。析构函数的特点如下:
 | 析构函数的名称与类名相同,在类名前加“~”。 |
 | 析构函数没有返回值,也不能声明为void。 |
 | 析构函数只有一个,不能重载。 |
 | 析构函数也是类的成员函数。 |
(2)析构函数的声明


定义纳美人类Navi,在Navi类中定义字段,属性和方法,定义表示数量的静态字段及相应的静态属性、静态方法,再向Navi类中添加实例构造函数、静态构造函数和析构函数,即在案例p5_2的基础上再添加构造函数和析构函数。在Program类中的Main()方法里声明两个Navi类对象,并使用不同的实例构造函数初始化对象。
 |
| 图5.8 程序运行结果 |
案例运行结果如图5.8所示。

(1)掌握实例构造函数的定义、重载及使用。
(2)了解静态构造函数、析构函数的定义与用途。
(3)在对象实例化和析构的过程中,学会正确处理数量字段的变化。

(1)新建项目。具体操作如下:
 | 在【文件】菜单中选择【新建】|【项目】命令,打开【新建项目】对话框。 |
 | 在该对话框中选择【控制台应用程序】选项。 |
 | 在【名称】文本框中输入Navi,作为该项目的名称,在【位置】文本框中输入项目的保存目录,或者单击【浏览】按钮选择项目的保存目录。 |
(2)编写代码。具体操作如下:
 | 双击【解决方案资源管理器】窗口中的Program.cs文件。 |
 | 开始在Program.cs文件中编写代码。 |
(3)保存程序。
(4)调试运行程序。

该项目文件路径为“\代码\第5章\Example5_4_2\Example5_4_2.sln”,代码如下:

本例定义了一个Navi类,并且在原来p5_2的基础上添加了实例构造函数、析构函数,还对实例构造函数进行了重载。根据对象产生和消亡过程,分别在构造函数中使用语句“count++;”表示一个对象产生了,数量增加了一个;在析构函数中使用语句“count--;”表示一个对象消亡了,数量减少一个。
对于有参构造函数,如果形参与成员变量名相同,则使用“this.变量名”来表示成员变量。例如,this.Sex = sex,等式左边this.Sex为成员变量,等式右边为形参。


这样,程序员在创建并初始化对象时是否增加了较大的自由度呢?答案是肯定的,系统会根据构造函数参数列表中参数的个数、参数类型或参数顺序来调用相应的构造函数,重载提供了对可用数据类型的选择,减少了程序中的标识符个数,使实例构造函数的使用更加方便。
在添加了上述这些构造函数后,再去调试一下程序,大家会发现编译时出现如图5.9所示的错误,错误行指向语句“Navi Tsutey=new Navi();”所在的行,为什么呢?
 |
| 图5.9 没有定义无参构造函数时出现的错误 |
错误原因:没有定义无参构造函数。
现在大家重新调试程序试一试,此时便不会出现图5.9所示的错误了。
注意:1.一旦定义了构造函数,则最好同时定义一个无参构造函数,以备后用。
2.构造函数的作用是实例化对象的同时初始化对象,在产生一个类的实例时由new运算符调用,只能一次性地影响数据成员的初值。

Navi类中有个表示纳美人类对象总数的静态字段count,一般在一个对象被删除时count值应该减1,把这个操作交给Navi类的析构函数比较合适,修改后的析构函数代码如下:
将这个析构函数添加到Navi类中,就得到了一个比较完整的Navi类,按Ctrl+F5快捷键执行程序,得到如图5.8所示的运行结果。