对象的初始化
不能在声明类时对数据成员进行初始化,因为类不是一个实体,而是一种抽象类型,并不占存储空间,所以无处容纳数据。如果一个类中的所有成员都是公用的,则可以在定义对象时对数据成员进行初始化
例:
class Time
{
public:
hour:
minute:
sec:
};
Time t1={14,56,30};
c++提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其它成员函数不同,不需要用户来调用它。而是在建立对象时自动执行。
- 构造函数没有返回值,因此也没有类型,其作用只是对对象进行初始化
- 构造函数不需要用户声明也不能被用户调用
- 可以用一个类对象去初始化另一个类对象
Time t1;//建立对象t1,同时调用构造函数t1.Time()
Time t2=t1;//建立对象t2.并且用一个t1初始化t2
此时把对象t1的各数据成员的值复制到t2相应各成员,而不调用构造函数t2.Tima()
- 当希望对不同的对象赋予不同的初值的时候可以使用带参数的构造函数
构造函数名(类型 1 形参 1,形参 2,形参 3…)
实参是在定义对象的时候给出的,定义对象的一般形式:
类名 对象名(实参 1,实参 2…)
-用参数初始化表对数据成员初始化
一般形式:
类名::构造函数名([参数表])[:成员初始化表]
{
[构造函数体]
}
- 在一个类中可以定义多个构造函数,以便为对象提供不同的初始化方法,供用户选择。这些构造函数具有相同的名字,而参数的个数或参数的类型不相同,称为构造函数的重载。
**1.**在建立对象时不必给出实参的构造函数,称为默认构造函数,一个类只能有一个默认构造函数,如果用户未定义默认构造函数,则系统会自动提供一个默认构造函数,但其函数体为空,不起初始化作用
**2.**如果在建立对象时选用无参的构造函数,应注意书写定义对象的语句。
Box box1;//建立对象的正确形式
Box box1();//建立对象时不应该有括号
上述语句只是声明一个普通函数box1,而不是定义Box类的对象box1,此函数的返回值为Box类型,注:构造函数是不能被用户显式调用的
- 构造函数中参数的值既可以通过实参传递也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值
1. 应在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值
2. 可以不用参数而调用的构造函数,一个类只能有一个
3. 在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数