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

C++ 为什么在我的程序中调用这两个构造函数?,c++,C++,我想创建一个类MyClass的对象,并将其传递给类Foo的构造函数。 奇怪的是,从类MyClass调用两个构造函数。 我错过了什么?我不是在创建MyCalss的第二个对象,是吗 这是我的代码片段: int main(int argc, char* argv[]) { MyClass oMyClass("string"); Foo oFoo(oMyClass); } /*MyClass.h*/ MyClass::MyClass() { printf("constr

我想创建一个类
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()
{
}

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

Foo类中的私有“MyClass”对象是默认构造的,因为您没有通过成员初始值设定项列表正确初始化它

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


如需更详细的解释,请在主菜单中查看此语句中的

MyClass oMyClass("string");
Foo oFoo(oMyClass);
显然,有一种称为构造函数的方法

MyClass::MyClass(std::string myString)
{
  printf("constructor(std::string) called\n");
}
Foo::Foo( MyClass& oMyClass)
{
  m_oMyClass = oMyClass;
}

在本声明中,主要

MyClass oMyClass("string");
Foo oFoo(oMyClass);
这就是所谓的构造函数

MyClass::MyClass(std::string myString)
{
  printf("constructor(std::string) called\n");
}
Foo::Foo( MyClass& oMyClass)
{
  m_oMyClass = oMyClass;
}
因为类Foo的定义方式是,它的数据成员m_MyClass类型为MyClass

MyClass m_oMyClass;
然后,类Foo的构造函数首先调用类MyClass的默认构造函数

MyClass::MyClass()
{
  printf("constructor() called\n");
}
在将控件传递给其主体之前创建数据成员m_omiclass。 在类Foo的构造函数的主体中,使用copy赋值操作符来重新赋值对象m_myClass

  m_oMyClass = oMyClass;
你可以;d用以下方法定义类Foo的构造函数

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

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

我打赌您的
Foo
类没有正确初始化其
MyClass
成员。向我们展示
Foo
。特别是,我要强调的是,它不会在初始值设定项列表中初始化其MyClass成员,而是依赖于ctor主体中的赋值。同意对代码的需求。谢谢,我添加了类foo“调用两个构造函数”是什么意思?我不想看到在这里任何地方调用
MyClass(std::string)
。@AdamBurry第三行?初始值设定项列表不是与
m_oMyClass=oMyClass
相同吗?@tzippy不,这是一个赋值。当构造器开始时,成员将被初始化,然后您分配给它。谢谢,这很有帮助!现在我需要实现copyconstructor,因为我有一个segfault。。。