对于任何语言来说,构造函数都是一个非常重要的东西。
1、构造函数初始值列表:
如果没有在构造函数的初始值列表中显示的初始化成员,则该成员在构造函数体之前执行默认初始化。
(1)构造函数的初始值有时必不可少:如定义一个类时,必须要对私有成员变量进行初始化,否则就会报错。
如果成员时const,引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始值列表为这些成员提供初值。
在很多类中,初始化和赋值的区别事关底层效率的问题:前者直接初始化数据成员,勾着则先初始化在赋值。
除了效率问题外更重要的的是,一些数据成员必须被初始化。建议我们养成使用构造函数初始值的习惯,这样能避免某些意想不到的编译错误,特别遇到有的类含有需要构造函数初始值的成员时。
(2)成员初始化的顺序:
成员的初始化顺序与他们在类定义中的出现顺序一制,按照先后顺序进行初始化。
但是一个成员是用另一个成员来初始化的,那么这两个成员的初始化顺序就很重要了。
1
2
3
4
5
6
7
8
9
|
class x { public : int i; int j; x(val):j(val),i(j); private : int val; } |
(3)默认实参和构造函数:
如果一个构造函数为所有参数都提供了默认实参,则他实际上也定义了默认构造函数。
2、委托构造函数:
一个委托构造函数使用他所属类的其他构造函数执行他自己的初始化过程,或者说把它自己的一些职责委托给了其他构造函数。
和其他构造函数一样,一个委托构造函数也有一个成员初始值的列表和一个函数体。在委托构造函数内,成员初始值列表只有一个唯一的入口,就是类名本身。和其他成员初始值一样,类名后面紧跟括号括起类的参数列表,参数列表必须与另一个构造函数匹配。
(3)默认构造函数的作用:
当对象被默认初始化时,自动执行默认构造函数。
(4)隐式的的类类型转化:
类定义转换规则,如果构造函数只接受一个实参,他实际上定义了转换为1此类类型的隐式转换机制,我们把这种构造函数称之为转换构造函数。
能通过一个实参的调用的构造函数定义了一条从构造函数的参数类型向类类型转换的规则。
只允许一步类类型转换