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