案例1:Main.cpp
class Complex
{
void func()
{
Complex c1; // Creating same class object allowed inside a function. Code builds fine. Why?
}
};
int main()
{
return 0;
}
案例2:Main.cpp
class Complex
{
Complex c1; // Creating same class object not allowed as data member. Build fails because class incomplete
};
int main()
{
return 0;
}
我知道为什么案例 2 无法构建。但为什么案例1会通过呢?我读到编译器从上到下逐行编译代码。案例 1 是否也应该因同样的原因而失败?
2
2 个回答
2
(2) 失败,因为此时该类尚未完成(成员变量的完整列表或多或少还不知道)。而且也是因为常识,因为它会导致对象的无限嵌套(如果添加任何其他成员变量,则会导致无限的内存)。
(1) 传递,因为编译器对一个类执行两次传递来解析它。方法体在第二遍期间被处理,此时类已经完成。另外,(1) 不需要无限内存,调用.func()
只是再创建一个对象。
1
-
好的。这个解释有道理。谢谢
–
|
第二种情况会失败,因为对象在内存中的大小必须是有限的。类的成员函数没有理由不能拥有相同类型的本地对象。如果对象的大小是有限的(并非荒谬),那么当调用成员函数时,没有理由不能在堆栈上创建它。
Complex::func
该对象仅在被调用时创建。
|
–
–
|