好的,首先,这是一个琐碎的问题,但这仍然困扰着我。免责声明:我不是编译器工程师。但是在我看来,在这种情况下,编译器需要一个确实没有必要的构造函数。下面的代码;为什么B构造函数不带任何参数,并且在将其类的一个已实例化的对象传递给另一个类的构造函数时却不执行任何操作?作为参考,我使用的是g ++(GCC)5.3.0,并且没有与其他任何编译器一起尝试过(是的,我知道GCC并非没有古怪之处):
#include <iostream>
namespace I_DO_NOT_GET_IT
{
class A;
class B;
}
class B
{
public:
B()
{
std::cout << "\nWhy am I here?\n\n";
}
B(const int aInt, const char * aChar)
{
mInt = aInt;
mChar = aChar;
}
void identify()
{
std::cout << "\nI am an object of class B, owned by class A\n"
<< "my integer data is "
<< mInt
<< " and my character data is \""
<< mChar
<< "\"\n\n";
}
int mInt;
const char * mChar;
};
class A
{
public:
A(B an_instantiated_object_of_class_B)
{
b = an_instantiated_object_of_class_B;
}
// class A owns an object of class B
B b;
};
int main()
{
// create an object of class B
B b(1, "text");
// pass the B object to A, which uses it to instantiate its B object
// in the A constructor.
A a = B(b);
// Have A's B object describe itself
a.b.identify();
return 0;
}
答案 0 :(得分:3)
A(B an_instantiated_object_of_class_B) { b = an_instantiated_object_of_class_B; }
在构造器主体运行之前创建B
并使用A::b
的情况下,将使用默认构造器b = ...
。
改为使用初始化列表:
A(B an_instantiated_object_of_class_B)
: b{ an_instantiated_object_of_class_B }
{
}
顺便说一句,您的命名空间I_DO_NOT_GET_IT
是毫无意义的。那里的声明与您的A
和B
类无关。