c++ - c++构造函数中调用构造函数

  显示原文与译文双语对照的内容

作为一个 C# 开发人员,我习惯于通过构造函数运行:


class Test {
 public Test() {
 DoSomething();
 }

 public Test(int count) : this() {
 DoSomethingWithCount(count);
 }

 public Test(int count, string name) : this(count) {
 DoSomethingWithName(name);
 }
}

是否有方法在 C++ 中进行这里操作?

我尝试调用类名,并使用'这个'关键字,但两者都失败了。

时间:

C++11和从此以后具有相同的特性( 调用委托构造函数 ) 。

语法与 C# 略有不同:


class Foo {
public: 
 Foo(char x, int y) {}
 Foo(int y) : Foo('a', y) {}
};

不幸的是,在C++03中没有这样做的方法,但是有两种方法可以模拟它:

1 ) 你可以通过默认参数组合两个( 或者更多) 构造函数:


class Foo {
 public:
 Foo(char x, int y=0);//combines two constructors (char) and (char, int)
. . .
 };

2 ) 使用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++03 ( 称为委托构造函数) 中的另一个构造函数调用一个构造函数。

在 C++11 ( 又名 C++0x ) 中更改,它增加了对以下语法的支持:
( 取自维基百科的维基百科)


class SomeType
{
 int number;

public:
 SomeType(int newNumber) : number(newNumber) {}
 SomeType() : SomeType(42) {}
};

在你的构造函数,有必要指出,你的父 class: 可以调用构造函数


class A{.. .. };

class B: public A
{
 B() : A()
{
.. . do more stuff...
}
};

但是,你不能调用同一个类的另一个构造函数。

在c++11中,构造函数可以调用另一个构造函数重载。


class Foo {
 int d; 
public:
 Foo (int i) : d(i) {}
 Foo () : Foo(42) {}//new to c++11
};

http://en.wikipedia.org/wiki/C%2B%2B11#Object_construction_improvement

此外,成员也可以像这样初始化。


class Foo {
 int d = 5; 
public:
 Foo (int i) : d(i) {}
};

这将消除创建初始化 helper 方法的需要。 仍然建议不要在构造函数或者析构函数中调用任何虚函数,以避免使用任何可能未初始化的成员。

如果你想成为邪恶,你可以使用 in-place"新建"操作符:


class Foo() {
 Foo() {/* default constructor deliciousness */}
 Foo(Bar myParam) {
 new (this) Foo();
/* bar your param all night long */
 } 
};

似乎能为我工作。

我一直认为这是允许的:


Foo::Foo()
{
//do what every Foo is needing
. . .
}

Foo::Foo(char x)
{
 *this = Foo();

//do the special things for a Foo with char
. . .
}

这里有什么问题?

在 Visual C++ 中,你也可以在构造函数中使用这里表示法: 这是> Classname::Classname(parameters of another constructor) 。请参阅下面的示例:


class Vertex
{
 private:
 int x, y;
 public:
 Vertex(int xCoo, int yCoo): x(xCoo), y(yCoo) {}
 Vertex()
 {
 this->Vertex::Vertex(-1, -1);
 }
};

我不知道它是否在其他地方工作,我只在 Visual C++ 2003和 2008中进行了测试。 在Java中,你也可以拨打电话几个构造函数这种方式,我想,恐怕需要的地方。

p 。s 。: 坦白地说,我感到惊讶的是这个就没有前面所提到的。

还没有显示的另一个选项是将你的类分成两个,在原始类周围包装一个轻量的接口类,以实现你正在寻找的效果:


class Test_Base {
 public Test_Base() {
 DoSomething();
 }
};

class Test : public Test_Base {
 public Test() : Test_Base() {
 }

 public Test(int count) : Test_Base() {
 DoSomethingWithCount(count);
 }
};

如果有许多构造函数必须调用它们的"下一级向上一级"对应,这可能会变得混乱,但是对于少数构造函数来说,它应该是可行的。

...