请考虑以下事项:
class Incomplete;
class Complete
{
Incomplete* Foo; // Will only compile if Foo is a pointer.
};
class Incomplete
{
Complete Bar; // Bar can be a pointer or an object.
};
指向不完整类型的指针是如何合法的?编译器如何知道Incomplete
类型的对象有多大?既然它可以显然找出大小,为什么不完整类型的常规对象非法?
答案 0 :(得分:4)
指针的大小不依赖于它指向的类型的大小。 int*
和Incomplete*
的大小相同。
但对于常规对象,大小未知。
答案 1 :(得分:4)
指向不完整类型的指针是合法的,正是因为编译器不需要知道它们的大小。
正如您所提到的,您无法声明不完整类型的对象的原因是因为编译器不知道对象有多大,因此无法为其分配空间。但是,当将指针声明为不完整类型时,大小是已知的,因为通常计算机上的所有指针都具有相同的大小。
此外,当声明指向不完整类型的对象的指针时,您不需要知道对象的大小。但是,如果您尝试使用不完整类型的对象,例如通过跟踪该指针或尝试实例化该类型的对象,则编译器将给您一个错误。
简而言之,指针是合法的,因为它可以在编译器不知道指向的大小的情况下创建。但是,如果您确实需要通过使用指针来了解该对象的大小或布局,则编译器需要有关于该类型的更多信息。
答案 2 :(得分:1)
编译器不需要知道Incomplete
的大实例是多少,因为指针总是大小相同。
答案 3 :(得分:0)
编译器如何知道Incomplete类型的对象有多大?
没有。它适用于指针,因为编译器知道为指针分配的大小。