C++ 关于C++;具有自引用的类
我有点困惑 为什么在C++中允许这样做:C++ 关于C++;具有自引用的类,c++,class,exception,C++,Class,Exception,我有点困惑 为什么在C++中允许这样做: static int t = 0; class A { public: A() : m(t++) { cout << "C:" << m << endl; if(t >= 5) { A a; // <<<&
static int t = 0;
class A
{
public:
A() : m(t++)
{
cout << "C:" << m << endl;
if(t >= 5)
{
A a; // <<<< ----- THIS line
throw( a);
}
}
int m;
};
static int t=0;
甲级
{
公众:
A():m(t++)
{
cout当您声明任何变量时,编译器应该知道该变量的大小。在第二个示例中,您在A
内部创建A
对象,因此编译器将无法计算A
的大小以分配内存
也可以指向一些C++的标准条目来解释这种情况?
是的,说明类在结束时才完全定义,这在第9.2节第2段:
在类说明符的结尾}处,类被视为完全定义的对象类型(3.9)(或完全类型)。[……]
并且类的所有非静态数据成员必须完整,从第9段:
非静态(9.4)数据成员的类型不得不完整。特别是,C类不应包含C类的非静态成员,但它可以包含指向C类对象的指针或引用
但在第2段中,在建造商内部也被认为是完整的:
[…]在类成员规范中,类在函数体、默认参数[…]中被视为是完整的
尽管静态成员可能不完整,但第9.4.2节静态数据成员第2段:
静态数据成员在其类定义中的声明不是定义,可能是除cv限定void之外的不完整类型。[…]
不允许类包含自身也是有意义的,因为这需要无限的空间,因为自引用永远不会结束,a
包含a
,其中包含a
除了类型不完整之外,A
的大小将是无限的,如果允许该成员,构造将永远不会返回。是的!关于课程的“完整性”,这正是我想要的:)谢谢!
static int t = 0;
class A
{
public:
A() : m(t++)
{
cout << "C:" << m << endl;
}
A a; // <<<< ----- THIS line
int m;
};