如果存在默认成员初始化,为什么要使用成员init列表

时间:2018-01-04 14:31:11

标签: c++ constructor member-initialization

在C ++ 11中,引入了default member initialization。 所以,我只是想问为什么仍然必须使用成员初始化列表来支持这些?

E.g。

如果允许的话

textUpdate.transition()
    .duration(Globalvar.durations)
    .attr("y", function(d) { 
        return y(d["Category" + catInt]) + 15; 
    })
    .attr("x", function(d) { 
        return x(d.month) + x.bandwidth()/2; 
    }).on('end', function(d) { 
       if(d3.select(this).attr("y") < 10) { 
         d3.select(this).text("");
       } else { 
         d3.select(this).text(d["Category" + catInt]);
       } 
       console.log("Evaluated here: " + d3.select(this).attr("y"));
    });

为什么要使用

class apple
{
    int i = 10;
};

有什么特别的优势吗?

3 个答案:

答案 0 :(得分:2)

成员初始值设定项列表可以使用特定于构造函数的初始值设定项初始化成员。

例如,初始化程序可能依赖于构造函数的参数,例如

class apple
{
    int i;
    apple(int i_) : i(i_) {}
};

或改变不同的构造函数,例如

class apple
{
    int i;
    apple(foo_type) : i(0) {}
    apple(bar_type) : i(1) {}
};

这两种情况都不能由单个默认成员初始化程序处理。

答案 1 :(得分:2)

这里没有“必须”,可能会根据情况作出决定。

例如,如果初始值不是常量,或者在多个构造函数中每个值必须不同,则使用初始化列表是有意义的。

如果你必须支持pre-C ++ 11(这可能比你想象的大项目更常见),你必须始终使用初始化列表。相反,如果你的大多数代码维护者不熟悉C ++ 11的功能,可能更好地使用长期机制而不是内联初始化。

如果使用C ++ 11不是问题而且你在多个构造函数中初始化为单个常量值,那么初始化形式可能更有意义。

答案 2 :(得分:1)

如果您不想,则不必使用成员初始化列表。此外,您可以混合使用默认成员初始化和成员初始化列表。这不只是一个或另一个。默认成员初始值设定项将用于未出现在成员初始值设定项列表中的任何成员。

你选择哪一个取决于许多事情。

当成员应始终使用相同的值进行初始化时,默认成员初始化非常有用。这是一种方便的简写,可以提高清晰度,因为初始值显示在声明的地方。

另一方面,如果需要初始化具有在运行时确定的不同值的成员,则不能使用默认初始化程序执行此操作;你必须在构造函数中这样做。

与C ++相反,默认成员初始化是一个相对较新的概念,Java自成立以来就具有等价,并且程序员已经详细讨论了两种不同初始化机制的优点,例如:见Default constructor vs. inline field initialization