作为C#开发人员,我习惯于运行构造函数:
class Test {
public Test() {
DoSomething();
}
public Test(int count) : this() {
DoSomethingWithCount(count);
}
public Test(int count, string name) : this(count) {
DoSomethingWithName(name);
}
}
有没有办法在 C ++ 中执行此操作?
我尝试调用类名并使用'this' 关键字,但都失败了。
C ++ 11:是的!
C ++ 11 及更高版本具有相同的功能(称为委托构造函数 )。
语法与 C#略有不同:
class Foo {
public:
Foo(char x, int y) {}
Foo(int y) : Foo('a', y) {}
};
C ++ 03:没有
不幸的是,在 C ++ 03 中没有办法做到这一点,但有两种模拟方法:
您可以通过默认参数组合两个(或更多)构造函数:
class Foo {
public:
Foo(char x, int y=0); // combines two constructors (char) and (char, int)
// ...
};
使用 init 方法共享公共代码:
class Foo {
public:
Foo(char x);
Foo(char x, int y);
// ...
private:
void init(char x, int y);
};
Foo::Foo(char x)
{
init(x, int(x) + 7);
// ...
}
Foo::Foo(char x, int y)
{
init(x, y);
// ...
}
void Foo::init(char x, int y)
{
// ...
}
请参阅C ++ FAQ 条目以供参考。
不,你不能在 C ++ 03 中调用另一个构造函数(称为委托构造函数)。
这在 C ++ 11(又名 C ++ 0x)中发生了变化,它增加了对以下语法的支持:
(来自维基百科的例子)
class SomeType
{
int number;
public:
SomeType(int newNumber) : number(newNumber) {}
SomeType() : SomeType(42) {}
};
我相信你可以从构造函数中调用构造函数。它将编译并运行。我最近看到有人这样做,它在 Windows 和 Linux 上运行。
它只是没有做你想要的。内部构造函数将构造一个临时本地对象,一旦外部构造函数返回,该对象就会被删除。它们也必须是不同的构造函数,否则您将创建递归调用。