构造函数
- 构造函数的任务是初始化类对象的数据成员
- 被调用的时机,无论何时只要类的对象被创建,就会调用构造函数
- 构造函数的特殊性 1. 构造函数与类名称相同 2. 构造函数没有返回值 3. 构造函数不能被声明为 const ,因为当我们创建一个 const 对象时,直到构造函数完成初始化过程,对象才能真正取得其 常量 属性。因此构造函数在const对象的构造过程中可以向其写值
默认构造函数
- 只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。编译器合成地默认构造函数按照如下规则初始化类的数据成员 如果存在类内初始值,用它来初始化成员。否则,默认初始化该成员 注意 给类的数据成员一个默认值是必要的。否则会引发很多不确定的情况。如下
#include "Person.h"
int main()
{
Person libai;
libai.print();
return 0;
}
打印出 如下
-858993460
注意 并不是所有情况编译器都能为一个类生成默认的构造函数,如在一个类中的数据成员有其它类类型的,并且这个类类型的数据成员没有默认的构造函数那么此时编译器将无法为这个类生成默认的构造函数。
=default
在C++11 新标准中,如果我们需要默认的行为,那么可以通过在参数列表后面写上 =default 来要求编译器生成构造函数如
Sales_data() = default;
//因为这个构造函数没有 参数,所以会生成默认的无参构造函数
思考 为什么会有 =default
出现是因为,在C++11 中可以使用类内初始值。构造函数在调用前都会使用类内初始值进行初始化。此时无参构造函数就没什么意义了,并且在提供了其它构造函数的情况下,编译器不会默认生成构造函数,但是如果你又想使用构造函数,那么你就需要自己写。为了避免写麻烦 所以就直接使用 =default
,更加方便且还有一个提示作用。告诉程序员此构造函数使用编译器默认生成的构造函数
构造函数初始值列表
名字很重要 写三遍 构造函数初始值列表 构造函数初始值列表 构造函数初始值列表 。 类内初始化 类内初始化 类内初始化 类内初始化 构造函数初始值列表是形如如下的结构
Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(n * p) {}
构造函数初始值列表是真的初始化,在构造函数执行前就初始化了。必须要使用构造函数初始化列表的情况有以下三种。
- 初始化类的const成员数据或者引用数据
- 在派生类中初始化基类的私有成员
- 如果基类没有默认构造函数,那么只有通过构造函数初始化列表去确定基类如何被构造 注意 初始化列表的初始化顺序与 列表的顺序无关,只与数据成员在类中定义出现的顺序有关。