不能在类声明中对数据成员初始化
如果一个类中的所有成员都是公用的,那么可以在定义对象时对数据成员进行初始化;如:
class Time
{
public:
hour;
minute;
sec;
}
Time t1={
14,56,30};
如果类中有private或protected的数据成员,就不能用这种方法。
利用构造函数实现数据成员的初始化
构造函数与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行;
构造函数必须和类名同名,不能任意命名
不具有任何类型,不具有返回值
构造函数在建立类对象时会自动调用构造函数;在建立对象时系统为对象分配存储单元,此时执行构造函数,就把指定的初值送到有关数据成员的存储单元中,每建立一个对象,就会调用一次构造函数。
构造函数不需被用户调用,也不能被用户调用;
构造函数是定义对象时由系统自动执行的,而且只能执行一次,构造函数一般声明为public
可以用一个类对象初始化另一个类对象,如:
Time t1;
Time t2=t1;
此时,把对象t1的各个数据成员复制到t2相应各成员,而不调用t2的构造函数
如果用户没有自己定义构造函数,那么C++会自动生成一个构造函数,只是这个构造函数的函数体是空的,没有参数,不执行任何操作。
带参数的构造函数
用户是不能调用构造函数的,那么对于带参数的构造函数,无法用常规的方式给出实参
实参是在定义对象时给出的,定义对象的一般形式为:
类名 对象名(实参1,实参2···);
在建立对象时把实参的值传递给构造函数相应的形参,把他们作为数据成员的初值。
带参数的构造函数中的形参,其对应的实参是在建立对象时给出的。即在建立对象时同时指定数据成员的初值;
用参数初始化表对数据成员初始化
上面是在构造函数的函数体内通过赋值语句对数据成员实现初始化
下面介绍另一种方法
参数初始表来实现对数据成员的初始化
不在函数体内对数据成员初始化,而是在函数首部实现
在原来函数首部的末尾加一个冒号,然后列出参数的初始化表,后面的花括号是空的,即函数体是空的,没有任何执行语句
用参数的初始化表法可以减少函数体的长度,使结构函数显得精炼简单。这样就可以直接在类体中定义构造函数;
带有参数初始化表的构造函数的一般形式:
类名::构造函数名([参数表])[:成员初始化表]
{
[构造函数体]
}
例如:
Box::Box(int h,int w