[C++] 构造函数

构造函数

每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数。

构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。

构造函数的名字和类名相同。和其他函数不一样的是,构造函数没有返回类型;除此之外类似于其他的函数,构造函数也有一个(可能为空)参数列表和一个(可能为空的)函数体。

类可以包含多个构造函数,和其他重载函数差不多,不同的构造函数之间必须在参数数量或参数类型上有所区别。

构造函数不能被声明成const的。当我们创建类的一个const对象时,直到构造函数完成初始化过程,对象才能真正取得其“常量”属性。因此,构造函数在const对象的构造过程中可以向其写值。

合成的默认构造函数

类通过一个特殊的构造函数来控制默认初始化过程,这个函数叫做默认构造函数。默认构造函数无须任何实参。

如果我们的类没有显式地定义构造函数,那么编译器就会为我们隐式地定义一个默认构造函数,这个构造函数又被称为合成的默认构造函数。

这个合成的默认构造函数的初始化数据成员规则是:

1、如果存在类内的初始值,用它来初始化成员。

2、否则,默认初始化该成员

某些类不能依赖于合成的默认构造函数

对于一个普通的类来说,必须定义它自己的默认构造函数,原因有三:

1、编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个默认的构造函数。一旦我们定义了一些其他的构造函数,那么除非我们再定义一个默认的构造函数,否则类将没有默认构造函数。(只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数)

2、对于某些类来说,合成的默认构造函数可能执行错误的操作。如定义在块中的内置类型或复合类型的对象被默认初始化,则它们的值是未定义的。(如果类包含有内置类型或者复合类型的成员,则只有当这些成员全部被赋予了类内初始值时,这个类才适合于使用合成的默认构造函数)

3、有的时候编译器不能为某些类合成默认的构造函数。如类中包含了其他类类型的成员且这个成员的类型没有默认构造函数,那么编译器将无法初始化该成员。

=default的含义

定义这个是因为我们既需要其他形式的构造函数,又需要默认的构造函数。

在类内的函数定义默认是内联的。在类外的函数定义默认是非内联的。

构造函数的初始值列表如果是空的,则类的数据成员由相应类内初始值初始化,或者执行默认初始化。

默认构造函数的作用

当对象被默认初始化或值初始化时自动执行默认构造函数。

默认初始化在以下情况下发生:

1、当我们在块作用域内不使用任何初始值定义一个非静态变量或数组时。

2、当一个类本身含有类类型的成员且使用合成的默认构造函数时。

3、当类类型的成员没有在构造函数初始值列表中显式地初始化时。

值初始化在以下情况下发生:

1、在数组初始化的过程中如果我们提供的初始值数量少于数组的大小时。

2、当我们不使用初始值定义一个局部静态变量时。

3、当我们通过书写形如T()的表达式显式地要求值初始化时,其中T是类型名。

posted @ 2018-01-27 14:50  immjc  阅读(168)  评论(0编辑  收藏  举报