参数构造函数调用

时间:2012-10-24 21:59:39

标签: c++ constructor

我对此感到有点困惑。当默认堆栈分配的对象构造被允许作为其他结构的成员变量时,为什么不参数化构造? Most Vexing Parse与此有关吗?我在ideone上尝试了C ++ 0X并获得了相同的结果。

struct foo{
    foo() {}
    foo(int i) {}
};

struct bar{
  foo obj;      // Allowed
  foo obj2(10); // Not Allowed
};
  

错误:在数字常量

之前预期','或'...'

IdeOne Demo

3 个答案:

答案 0 :(得分:5)

您指向Most Vexing Parse的链接讨论了非成员变量的实例化(不是类/结构成员的变量)。您展示的示例是在结构中声明的成员变量;您通常会在构造函数中初始化它们

struct bar
{
    foo obj;
    foo obj2;
    bar() : obj2(10) {}
};

最令人烦恼的解析问题出现在以下情况中:

struct baz
{
    baz(int n) {}
};

void foo()
{
    baz meow(int());
}

标识符meow似乎是baz (int)类型的函数声明,因为您的链接中描述了“最令人烦恼的解析”问题。 ( int()乍一看似乎是默认初始化实际上只是数据类型int

答案 1 :(得分:1)

struct bar {
  foo obj;
  foo obj2;
  foo(): obj2(10) {}
}

这样,在实例化bar时,obj2构造将使用10。

答案 2 :(得分:1)

在C ++ 11之前,您无法初始化声明中的成员,除非它们是static const和整数。

在C ++ 11中,您可以使用统一初始化和类内成员初始化:

foo obj2{10};

由于构造函数不明确,您也可以这样做:

foo obj2 = 10;

不在C ++ 11中,您必须在构造函数列表中使用成员初始值设定项。