55

我这样做对吗?我正在尝试委托一个 C++ 类构造函数,因为它基本上是相同的代码重复 3 次。我阅读了 C++x11 并读到 g++ 4.7.2 允许这样做,但我不确定我是否正在这样做对:

Bitmap::Bitmap(HBITMAP Bmp)
{
   //Construct some bitmap stuff..
}

Bitmap::Bitmap(WORD ResourceID)
{
   HBITMAP BMP = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED);

   Bitmap(BMP);   //Delegates to the above constructor? Or does this create a temporary?
}

或者我需要做什么:

Bitmap::Bitmap(HBITMAP Bmp)
{
   //Construct some bitmap stuff..
}

Bitmap::Bitmap(WORD ResourceID) : Bitmap((HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED))
{
}
4

4 回答 4

46

你需要做第二个。委托构造函数只在构造函数的初始化列表中起作用,否则你只会创建一个临时的或像你提到的那样做其他错误。

于 2012-12-19T20:59:05.540 回答
45

正确的语法是

struct Foo {
  Foo(char x, int y) : _x{x}, _y(y) {}
  Foo(int y) : Foo('a', y) {}

  char _x;
  int _y;
};

您的第一个示例创建了一个立即销毁的临时对象。

于 2012-12-19T20:59:24.310 回答
2

如果您想在一些命令式逻辑之后使用构造函数委托,您可以选择*this从临时移动分配:

Foo() {
  // calculate stuff…
  *this = Foo(stuff, calculated, above);
}
于 2020-08-18T20:18:56.090 回答
1

第二个使用初始化列表的例子是正确的。第一个示例将最终创建一个临时对象。

于 2013-10-28T08:01:37.743 回答