案例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

  • 1
    大多数 C++ 都有一个规则,即某些东西必须先声明才能使用。类的内部是该规则的一个例外,在该范围内该类被认为是完全声明的。如果没有这种例外,在类中编写内联方法会困难得多。


    – 


  • 1
    如果对象包含自身,那么它的大小实际上是无限的。包含对象的函数并不重要。它不会影响对象。物体包含它自己,它包含它自己,它包含它自己,它包含它自己……永远


    – 



2 个回答
2

(2) 失败,因为此时该类尚未完成(成员变量的完整列表或多或少还不知道)。而且也是因为常识,因为它会导致对象的无限嵌套(如果添加任何其他成员变量,则会导致无限的内存)。

(1) 传递,因为编译器对一个类执行两次传递来解析它。方法体在第二遍期间被处理,此时类已经完成。另外,(1) 不需要无限内存,调用.func()只是再创建一个对象。

1

  • 好的。这个解释有道理。谢谢


    – 

第二种情况会失败,因为对象在内存中的大小必须是有限的。类的成员函数没有理由不能拥有相同类型的本地对象。如果对象的大小是有限的(并非荒谬),那么当调用成员函数时,没有理由不能在堆栈上创建它。

Complex::func该对象仅在被调用时创建。