为什么在我的程序中调用两个构造函数?

时间:2014-07-14 11:59:44

标签: c++

我想创建一个类MyClass的对象,并将其传递给类Foo的构造函数。 奇怪的是,来自类MyClass的两个构造函数都被调用。 我在这里错过了什么?我没有创建MyCalss的第二个对象,是吗?

这是我的代码片段:

int main(int argc, char* argv[])
{
    MyClass oMyClass("string");

    Foo oFoo(oMyClass);
}   



/*MyClass.h*/
MyClass::MyClass()
{
  printf("constructor() called\n");
}

MyClass::MyClass(std::string myString)
{
  printf("constructor(std::string) called\n");
}


/*Foo.h*/

class Foo
{
public:
    Foo( MyClass& oMyClass);
    Foo();
    ~Foo();
private:
    MyClass m_oMyClass;
};

/*Foo.cpp*/
Foo::Foo( MyClass& oMyClass)
{
  m_oMyClass = oMyClass;
}

Foo::Foo()
{
}

3 个答案:

答案 0 :(得分:6)

您需要在成员初始化列表中初始化MyClass Foo成员,否则将首先默认初始化(在您的分配之前):

Foo::Foo(MyClass& oMyClass)
  : m_oMyClass(omyClass)
{ }

答案 1 :(得分:1)

在主要

中的这个陈述中
MyClass oMyClass("string");

显然叫做构造函数

MyClass::MyClass(std::string myString)
{
  printf("constructor(std::string) called\n");
}

在主要

中的这个陈述中
Foo oFoo(oMyClass);

有一个叫做构造函数的

Foo::Foo( MyClass& oMyClass)
{
  m_oMyClass = oMyClass;
}

由于类Foo被定义为具有MyClass类型的数据成员m_oMyClass

MyClass m_oMyClass;

然后类Foo的构造函数首先调用类MyClass

的默认构造函数
MyClass::MyClass()
{
  printf("constructor() called\n");
}

在将控件传递给其主体之前创建数据成员m_oMyClass。 在类Foo的构造函数体内,使用了复制赋值运算符来重新分配对象m_oMyClass。

  m_oMyClass = oMyClass;

你可以用以下方式定义类Foo的构造函数

Foo::Foo( MyClass& oMyClass) :  m_oMyClass( oMyClass )
{
}

在这种情况下,代替默认构造函数和类MyClass的复制赋值运算符,只会调用类MyClass的复制构造函数。

答案 2 :(得分:0)

私人" MyClass"您的Foo类中的对象是默认构造的,因为您没有通过成员初始化列表正确初始化它。

这里有几个解决方案,具体取决于您想要实现的目标。您可以使用初始化列表中的复制构造函数对其进行初始化,也可以将其声明为对MyClass对象的引用。

如需更详细的解释,请查看http://en.cppreference.com/w/cpp/language/initializer_list