C ++委托构造函数

时间:2015-12-08 15:16:12

标签: c++ constructor

您好我比Java更熟悉Java

test.h:

class Test
{
private:
int a,b,c;
public Test(int a, int b, int c);
}

test.c的

Test::Test(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
}
Test::Test(int a, int b)
{
this(a, b, 0);
}
Test::Test(int a)
{
this(a, 1)
}
Test::Test()
{
this(2)
}

1 - 我是否必须在test.h中键入每个构造函数签名?

2 - 如何编写构造函数的多个定义?

3 - 我读过你可以使用默认值在1个定义中组合多个构造函数。怎么做

谢谢

4 个答案:

答案 0 :(得分:1)

  1. 输入

  2. 为什么不使用Test(int _a, int _b = 1, int _c = 0);

  3. 使用

    定义
    Test::Test(int _a, int _b, int _c) : a(_a), b(_b), c(_c)
    {
    }
    

    即。提供默认值并使用基本成员初始化?

    这在C ++ 11之前也可用

答案 1 :(得分:1)

从c ++ 11开始,一个构造函数可能会推迟到另一个构造函数。因此,如果您想避免在界面中发布默认值,可以这样做:

// declaration
struct X
{
    X(int a, int b, int c);
    X(int a, int b);
    X(int a);
    X();

private:
    int a,b,c;
};

// definition    
X::X(int a, int b, int c)
: a(a), b(b), c(c)
{}


X::X(int a, int b)
: X(a, b, 2)
{
}


X::X(int a)
: X(a, 1, 2)
{
}

X::X()
: X(0,1,2)
{
}

答案 2 :(得分:0)

您的构造函数委派语法错误。您需要使用成员初始化列表委托给不同的构造函数:

Test::Test(int a, int b)
    : Test(a, b, 0)
{
}
Test::Test(int a)
    : Test(a, 1)
{
}
Test::Test()
    : Test(2)
{
}

答案 3 :(得分:0)

委托构造函数仅在C ++ 11中可用。语法如下所示:

Test::Test(int a1, int b1, int c1) :
    a{a1}, b{b1}, c{c1}
{}

Test::Test(int a, int b) :
    Test(a, b, 0)
{}

Test::Test(int a) :
    Test(a, 1)
{}

Test::Test() :
    Test(2)
{}

我还在第一个构造函数中使用了初始化语法。最好这样做,因为否则将使用默认构造函数初始化成员对象,然后为其分配新值。