在使用()方法被认为是重复的代码更好的做法,它有几个缺点。首先,它是不可读的,因为它增加了一个新的功能和一些新的函数调用。第二,因为inita()不是一个构造函数,它可以正常程序流的过程中,称为成员变量,可能已经被设置和动态分配的内存可能已被分配。这意味着inita()需要以被另外的复杂要正确处理好新的初始化和重新初始化的情况下。
幸运的是,C + + 11添加到链建设者在一起的能力(称为委托构造函数)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Foo
{
public:
Foo()
{
InitA();
}
Foo(int nValue)
{
InitA();
// code to do B
}
void InitA()
{
// code to do A
}
};
正如你所看到的,这是非常干净。
有一点要注意:你应该总是使用初始化列表语法时委托构造函数,编译器不支持委托构造函数一般将标志这一个编译错误。如果你试图从另一个构造函数体调用一个构造函数,编译器不会抱怨你的程序也可能不会像预期的那样。
1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo
{
public:
Foo()
{
// code to do A
}
Foo(int nValue): Foo() // use Foo() default constructor to do A
{
// code to do B
}
};