1、构造函数
构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
- 构造函数名与类名相同
- 没有返回类型
- 可以重载
- 不能声明成const
(1)合成的默认构造函数
如果我们没有为类显式的定义构造函数,编译器会为我们隐式的定义一个默认构造函数(没有任何参数)又叫做合成的默认构造函数)这个构造函数按照下面规则初始化类的数据成员:
- 如果有类内初始值,用它来初始化成员(比如上面的units_sold=0,revenue=0.0)。类内初始值必须以=或{}表示。
- 否则,默认初始化(如bookNo被初始化为空字符串)。
(2)自定义默认构造函数
一般情况下,类都需要定义一个默认构造函数,主要有以下三个原因:
- 一旦定义了其他构造函数,除非我们自己再定义一个默认构造函数,否则这个类将没有默认构造函数。
- 若类中含有内置类型或复合类型(比如数组和指针)的数据,如果没有提供类内初始值(有的编译器可能不支持类内初始值),使用合成的默认构造函数的值将是未定义的。
- 如果类中包含其他类的对象,而这个对象没有默认构造函数,那么编译器不能为类合成默认构造函数,我们必须自己定义一个默认构造函数。
Sales_data()=default;
函数名与类名相同,没有参数列表,参数列表后面加上=default要求编译器生成默认构造函数。
(3)构造函数初始值列表
Sales_data(const string & s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n){}
冒号和花括号中间的部分就是构造函数的初始值列表。如果某个数据成员没有被初始值列表包括,这个值将以与合成默认构造函数相同的方式隐式初始化,对于没有初始值列表的构造函数,也是以同样的方式初始化。
2、构造函数初始值列表
(1)必须使用构造函数初始值列表的类型