为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
紫衣仙女 2019-06-28 17:25:56
在这种特殊情况下,使用成员初始化程序列表与在构造函数中分配值之间是否有区别?在内部和生成的代码之间,是否存在真正的区别:MyClass::MyClass(): _capacity(15), _data(NULL), _len(0){}和MyClass::MyClass(){   _capacity=15;   _data=NULL;   _len=0}谢谢.。
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-06-28
?
holdtom

TA贡献1805条经验 获得超10个赞

您需要使用初始化列表来初始化常量成员、引用和基类。

当您需要初始化常量成员、引用和将参数传递给基类构造函数(如注释中提到的)时,您需要使用初始化列表。

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) {}};


查看完整回答
反对 回复 2019-06-28
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

是。在第一种情况下,可以声明_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实例在初始化程序列表中进行初始化。底层类型必须提供公共的无参数构造函数(原语类型所做的)。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 388 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信