作为一个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:不

值得指出的是,你可以在你的构造函数中调用父类的构造函数,例如:

 class A { /* ... */ };
    
    class B : public A
    {
        B() : A()
        {
            // ...
        }
    };

但是,在c++ 03之前,你不能调用同一个类的另一个构造函数。

其他回答

c++ 11:是的!

c++ 11及以后的版本也有同样的特性(称为委托构造函数)。

语法与c#略有不同:

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

c++ 03:不

不幸的是,在c++ 03中没有办法做到这一点,但是有两种方法来模拟这个:

你可以通过默认参数组合两个(或更多)构造函数: 类Foo { 公众: Foo(char x, int y=0);//结合两个构造函数(char)和(char, int) / /…… }; 使用init方法共享公共代码: 类Foo { 公众: Foo (char x); Foo(char x, int y); / /…… 私人: 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条目以获得参考。

当调用构造函数时,它实际上是从堆栈或堆中分配内存。因此,在另一个构造函数中调用一个构造函数会创建一个本地副本。所以我们正在修改另一个对象,而不是我们所关注的对象。

这种方法可能适用于某些类型的类(当赋值操作符表现“良好”时):

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

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

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

是或否,取决于c++的版本。

在c++ 03中,不能从一个构造函数调用另一个构造函数(称为委托构造函数)。

这在c++ 11(又名c++ 0x)中改变了,它增加了对以下语法的支持: (例子摘自维基百科)

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

另一个还没有展示的选项是将你的类分成两个,在你的原始类周围包装一个轻量级的接口类,以达到你想要的效果:

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

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

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

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