1.构造函数定义:构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,并且在对象的生命周期内只调用一次,以保证每个数据成员都有一个合适的初值。
2.构造函数的特性:
(1)函数名与类名相同
(2)没有返回值,没有类型
(3)在创建对象时编译系统会调用构造函数,每创建一个对象就会调用一次构造函数,在对象的生命周期内只调用一次。
(4)构造函数有初始化列表(可以不使用),其他成员函数没有。
(5)没有显式定义构造函数时,编译系统会提供默认的构造函数,这个函数函数体是空的,也没有参数,不执行初始化操作。
(6)构造函数可以重载,实参决定调用那个构造函数。
(7)一个类只能有一个默认构造函数,即可以不用参数调用的构造函数,一个类只能有一个,因为无参构造函数和带有缺省值的构造函数都认为是缺省构造函数。
(8)构造函数不能用const来修饰。
3.构造函数初始化数据成员:
3.1:上面是在类内定义构造函数,也可以只在类内声明,在类外定义
CDate();
CDate::CDate()
{
_year = 0;
_month = 0;
_day = 0;
}
3.2:构造函数是在定义对象时由系统自动调用,不能被用户调用。
d.CDate(); //一般调用函数的方法是错误的。
带参构造函数
构造函数名(类型1 形参1,类型2 形参2...)
定义对象形式 类名对象名(实参1,实参2,...)
CDate(const int year,const int month,const int day)//带参构造函数定义
{
_year = year;
_month = month;
_day = day;
}
使用参数初始化列表初始化数据成员
一般形式:类名::构造函数名(参数表):数据成员初始列表(以逗号分隔)
{}
注意事项:
(1)每个成员在初始化列表中只能出现一次。
(2)初始化列表仅用于初始化成员,并不指定这些数据成员的初始化顺序,数据在类中定义的顺序就是在参数列表的初始化顺序。
:_year(year)
,_day(day)
,_month(month)
实际上仍是按照类中定义的顺序先初始化month,在初始化day.
(3)尽量避免使用成员初始化成员,成员的初始化顺序最好和成员的定义顺序保持一致。
系统是按照定义的顺序初始化各个成员,并没有按照初始化列表的顺序所以_month是随机值。
(4)类中包含以下成员必须放在初始化列表中初始化:
引用数据成员//因为引用必须初始化
const 数据成员
类类型成员(该类没有缺省的构造函数)
构造函数的重载