在这种特殊情况下,使用成员初始化程序列表与在构造函数中分配值之间是否有区别?

在这种特殊情况下,使用成员初始化程序列表与在构造函数中分配值之间是否有区别?

在内部和生成的代码之间,是否存在真正的区别:

MyClass::MyClass(): _capacity(15), _data(NULL), _len(0){}

MyClass::MyClass(){
  _capacity=15;
  _data=NULL;
  _len=0}

谢谢.。


紫衣仙女
浏览 389回答 3
3回答

四季花海

假设这些值是原始类型,那么没有区别。仅当对象作为成员时,初始化列表才会产生影响,因为初始化列表允许您将对象初始化到其最终值,而不是使用默认初始化和赋值。这实际上可以明显地加快速度。

holdtom

您需要使用初始化列表来初始化常量成员、引用和基类。当您需要初始化常量成员、引用和将参数传递给基类构造函数(如注释中提到的)时,您需要使用初始化列表。struct aa{     int i;     const int ci;       // constant member     aa() : i(0) {} // will fail, constant member not initialized};struct aa{     int i;     const int ci;     aa() : i(0) { ci = 3;} // will fail, ci is constant};struct aa{     int i;     const int ci;     aa() : i(0), ci(3) {} // works};示例(非详尽的)类/结构包含引用:struct bb {};struct aa{     bb& rb;     aa(bb& b ) : rb(b) {}};// usage:bb b;aa a(b);以及初始化需要参数的基类的示例(例如,没有默认构造函数):struct bb {};struct dd{     char c;     dd(char x) : c(x) {}};struct aa : dd{     bb& rb;     aa(bb& b ) : dd('a'), rb(b) {}};

蝴蝶不菲

是。在第一种情况下,可以声明_capacity, _data和_len作为常量:class MyClass{private:     const int _capacity;     const void *_data;     const int _len;// ...};如果你想确保const-在运行时计算这些实例变量的有效性,例如:MyClass::MyClass() :     _capacity(someMethod()),     _data(someOtherMethod()),     _len(yetAnotherMethod()){}const实例必在初始化程序列表中进行初始化。或底层类型必须提供公共的无参数构造函数(原语类型所做的)。
打开App,查看更多内容
随时随地看视频慕课网APP