我可以从 C++ 中的另一个构造函数(做构造函数链接)调用构造函数吗?

2022-01-30 00:00:00 constructor c++

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

As a C# developer I'm used to running through constructors:

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

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

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

有没有办法在 C++ 中做到这一点?

Is there a way to do this in C++?

我尝试调用类名并使用this"关键字,但都失败了.

I tried calling the Class name and using the 'this' keyword, but both fail.

推荐答案

C++11:是的!

C++11 及更高版本具有相同的功能(称为 委托构造函数).

C++11 and onwards has this same feature (called delegating constructors).

语法与C#略有不同:

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

C++03:否

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

Unfortunately, there's no way to do this in C++03, but there are two ways of simulating this:

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

  1. You can combine two (or more) constructors via default parameters:

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

  • 使用init方法共享通用代码:

  • Use an init method to share common code:

    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 条目以供参考.

    相关文章