1 C++规定,对象的成员变量的初始化动作发生在进入构造函数函数体之前(即花括号之前)。构造函数内的都不是初始化而是被赋值。进入函数体之前编译器会自动调用这些成员变量的默认构造函数(即无参构造函数)来初始化,但是不保证内置对象初始化。
因此函数体中赋值这种做法导致默认构造函数初始化白费了,效率低。所以采用成员初始化列表效率高。同时初值列中各个成员变量的实参被拿去作为各成员变量的构造函数的实参。
第一种先调用默认构造函数在调用拷贝赋值操作。
第二种只调用拷贝构造函数。
2 对于内置类型初始化和赋值效率差不多,放在成员初始化列表或者函数体内都可以,一般为了保持一致也放在成员初始化列表中。
3 什么情况下成员变量必须放在初始化列表中。
a 类的成员是常量成员;常量定义时就要被初始化
b 类的成员是对象成员初始化,而该对象没有无参构造函数。
c 类的成员为引用时。引用定义时就要被初始化
成员变量的初始化次序完全不受它们在初始化表中次序的影响,只有成员对象在类中声明的次序来决定的。
BTW:引用:
l 引用的规则:
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。不能是int &k = 3;
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象),这里指不能再绑定其他的对象,只要不是const,就可以改变值,即可以通过引用改变绑定对象的值,因为它们其实是相同的。
引用的主要功能是传递函数的参数和返回值。