我可以从 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”关键字,但都失败了。

原文由 Stormenet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 428
2 个回答

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)
     // ...
   };

  1. 使用 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 条目 以供参考。

原文由 JohnIdol 发布,翻译遵循 CC BY-SA 3.0 许可协议

简单地说,你不能在 C++11 之前。

C++11 引入了 委托构造函数

委托构造函数

如果类本身的名称在成员初始值设定项列表中显示为类或标识符,则该列表必须仅包含一个成员初始值设定项;这样的构造函数称为委托构造函数,由初始化列表的唯一成员选择的构造函数是目标构造函数

在这种情况下,通过重载决议选择目标构造函数并首先执行,然后控制返回到委托构造函数并执行其主体。

委托构造函数不能是递归的。

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

请注意,委托构造函数是一个全有或全无的提议;如果一个构造函数委托给另一个构造函数,则调用构造函数的初始化列表中不允许有任何其他成员。如果您考虑一次且仅初始化一次 const/reference 成员,这是有道理的。

原文由 user8683714 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题