协慌网

登录 贡献 社区

我可以在 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 ++ 中执行此操作?

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

答案

C ++ 11:是的!

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

语法与 C#略有不同:

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

C ++ 03:没有

不幸的是,在 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 ++ FAQ 条目以供参考。

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

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

class SomeType
{
  int number;

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

我相信你可以从构造函数中调用构造函数。它将编译并运行。我最近看到有人这样做,它在 Windows 和 Linux 上运行。

它只是没有做你想要的。内部构造函数将构造一个临时本地对象,一旦外部构造函数返回,该对象就会被删除。它们也必须是不同的构造函数,否则您将创建递归调用。

参考: https//isocpp.org/wiki/faq/ctors#init-methods