对象构造:默认参数vs委托

时间:2015-07-01 13:28:53

标签: c++ c++11 constructor c++14

考虑以下代码,我试图为<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <script src="../Content/js/vendor/jquery-1.11.1.min.js"></script> <script src="../Content/js/helpers/highcharts.js"></script> <script src="../Content/js/helpers/exporting.js"></script> <script type="text/javascript"> window.onload = function () { $('#chart1').highcharts({ chart: { type: 'bar' }, title: { text: 'data Utilization' }, xAxis: { categories: ['Data'] }, yAxis: { min: 0, max: 24, tickInterval: 2, title: { text: 'Working hours' } }, legend: { reversed: true }, plotOptions: { series: { stacking: 'normal' } }, series: [{ name: 's', data: [5] }, { name: 'x', data: [2] }, { name: 'v', data: [3] }] }); } </script> <script src="../Content/js/helpers/highcharts.js"></script> <script src="../Content/js/helpers/exporting.js"></script> <div id="chart1" style="padding: 10px; height: 300px; overflow: auto;" ></div> </asp:Content> 引入默认构造函数和参数化构造函数。这种方式是在最近的c ++改进中引入的。

class A

vs在参数化构造函数上设置默认参数并完全忽略默认构造函数的旧方法。

class A  {
    private:
        unsigned int count;

    public:
        A(int new_c) : count(new_c) {}
        A() : A(10) {}
};

除了遵循现代惯例之外,使用第一种方法是否优于第二种方法?

4 个答案:

答案 0 :(得分:6)

功能上没有区别。知道甚至有另一个选项可用于非静态成员初始化(从C ++ 11开始):

count

答案 1 :(得分:5)

在你的例子中没有任何优势(在这样的例子中,我甚至选择第二个选项更清晰)

在默认值不足的情况下委派构造函数,以便于工作。

例如

struct Point3d
{
   Point3d(int x, int y, int z);
   Point3d(Point2d p) : Point3d(p.x, p.y, 0) {}
}

答案 2 :(得分:4)

如果较大的类可以是一些构造函数,那么优势将更加明显。以新的方式,您将能够编写一个构造函数,然后将其设置为其他构造函数。这不容易出错。

class A  {
    private:
        unsigned int count;
        int other;
        float otherfloat;


    public:
        A( unsigned int count, int other, float otherfloat ) : count( count), other( other ), otherfloat( otherfloat ) {}
        A(int new_c) : A(new_c, 0, 0.0 ) {}
        A() : A(10) {}
};

答案 3 :(得分:4)

虽然从技术上讲没有区别,但是创建转发构造函数背后的想法是不同的。 想象一下下面的课程:

class sample {
    complexType member;
    bool createdWithInt;
public:
    sample() : member(5), createdWithInt(false) {
       /* code ... */
    }
    sample(int param) : sample() {
       createdWithInt = true;
       /* other code */
    }
};

因此使用默认参数很难实现此类: 它的行为不依赖于参数的值,而是取决于存在。

有人可能尝试使用辅助函数void creator()来实现它,该函数在没有参数的情况下从构造函数执行code ...位。然而,这意味着重复初始化列表(或者如果从creator()内初始化,则丢弃RAII原则。)

注意:createdWithInt可以从初始化列表初始化,如果添加了另一个构造函数,则需要bool并且当前构造函数都转发到该构造函数。为了这个例子,这个被省略了。