您好我比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个定义中组合多个构造函数。怎么做
谢谢
答案 0 :(得分:1)
是
输入
为什么不使用Test(int _a, int _b = 1, int _c = 0);
和使用
定义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)
{}
我还在第一个构造函数中使用了初始化语法。最好这样做,因为否则将使用默认构造函数初始化成员对象,然后为其分配新值。