在C++程序中,对象的初始化是一个不可缺少的重要问题。不应该让程序员在这个问题上花过多的精力,C++在类的设计中提供了较好的处理方法。
为了解决这个问题,C++提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。构造函数是在声明类的时候由类的设计者定义的,程序用户只须在定义对象的同时指定数据成员的初值即可。
构造函数的名字必须与类名同名,而不能任意命名,以便编译系统能识别它并把它作为构造函数处理。它不具有任何类型,不返回任何值。
编写程序:
运行结果:
程序分析:
在类中定义了构造函数Time,它和所在的类同名。在建立对象时会自动执行构造函数,根据构造函数Time的定义,其作用是对该对象中的全部数据成员赋予初值0。请不要误认为是在声明类时直接对程序数据成员赋初值(那是不允许的),赋值语句是写在构造函数的函数体中的,只有在调用构造函数时才执行这些赋值语句,对当前对象中的数据成员赋值。
程序运行时首先建立对象t1,在执行构造函数过程中对t1中的数据成员赋予初值0。然后再执行主函数中的t1.set_time函数,从键盘输入新值赋给对象t1的数据成员,再输出t1的数据成员的值。接着建立对象t2,同时对t2中的数据成员赋予初值0,但对t2的数据成员不再赋予新值,直接输出数据成员的初值。
上面是在类内定义构造函数的,也可以只在类内对构造函数进行声明而在类外定义构造函数。将程序中的第5~9行改为下面一行:
Time(); //对构造函数进行声明
在类外定义构造函数:
Time::Time() //在类外定义构造成员函数,要加上类名Time和域限定符"::"
{hour=0;
minute=0;
sec=0;
}
说明:有关构造函数的使用,有以下几点要注意:
(1)什么时候调用构造函数呢?在建立类对象时会自动调用构造函数。在建立对象时系统为该对象分配存储单元,此时执行构造函数,就把指定的初值送到有关数据成员的存储单元中。每建立一个对象,就调用一次构造函数。在上面的程序中,在主函数中定义了一个对象t1,在此时,就会自动调用t1对象中的构造函数Time,使各数据成员的值为0。
(2)构造函数没有返回值,因此也没有类型,它的作用只是对对象进行初始化。因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同之点。不能写成
int Time()
{...}
或
void Time()
{...}
(3)构造函数不需用户调用,也不能被用户调用。下面用法是错误的:
t1.Time(); //试图用调用一般成员函数的方法来调用构造函数
构造函数是在定义对象时由系统自动执行的,而且只能执行一次。构造函数一般声
明为public。
(4)可以用一个类对象初始化另一个类对象,如
Time t1; //建立对象t1,同时调用构造函数t1.Time()
Time t2=t1; //建立对象t2,并用一个t1初始化t2
此时,把对象t1的各数据成员的值复制到t2相应各成员,而不调用构造函数t2.Time()。
(5)在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句,例如cout语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
(6)如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
(7)以上介绍的构造函数是最基本的形式。构造函数有不同的形式,以便用于不同情况的数据初始化。