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。。。