初始化列表与构造函数
时间:2010-09-18 来源:zyd_cu
类的成员可通过初始化列表的方式初始化,还可以在构造函数体内进一步进行赋值。除了const,引用类型的成员必须使用初始化列表的方式,对于简单的类,这两种方式基本上没有什么差别。但对于复杂的类(类中包含其它类的成员等),两种方式在效率上有很大的不同。
如果D类中包含B类的对象,D的构造函数调用之前,会先构造B类的对象(根据参数不同,调用B类相应的构造函数),如果构造函数体内还有对B类的赋值操作,则B类的赋值运算会被调用。但直接使用初始化列表的方式构造基类对象,则只会调用拷贝构造函数一次,如下例所示:
#include <iostream>
|
如果使用Code1,即在构造函数体内赋值,会输出:
Constructor /* 对应临时对象Base(1) */
Constructor /* 构造函数被调用 */
Assignment /* 赋值操作 */
如果使用Code2,即使用初始化方式,会输出:
Constructor /* 对应临时对象Base(1) */
Copy-Constructor /* 拷贝构造函数被调用 */
如果类中包含很多复杂的类,则两种方式的效率差别会非常的明显,所以尽量使用初始化方式,而不要在构造函数体内赋值。