class a{
a aa;
int i;
};
int main(){}
为什么这个类编译通不过但是换成这样
class a{
static a aa;
int i;
};
int main(){}
而aa作为成员对象就不行了。楼主应该可以对它好好思考就可以得出结论了。我们使用假设法。
如果C++编译器允许你在a内部再定义一个a类的对象。那么我们可以想象:当你用a类创建一个对象oa时,由于
类a首先需要通过构造函数构造自己,也就是对自己的成员进行初始化。此时,当它去初始化aa时又会去调用a的
构造方法,为它初始化,如此无限迭代,形成一个无限的递归调用。这个问题在很多编译原理书中也提到过,也就是在编译期间进行防止无穷的递归迭代。
实际上对于class a 只有i这个成员占它的大小,也就是说a的结构只有一个成员int i。
对于aa 只是作用域在class a内。因此编译时,编译器知道claas a的结构
a aa;
int i;
};
int main(){}
为什么这个类编译通不过但是换成这样
class a{
static a aa;
int i;
};
int main(){}
这样就可以通过,
之所以静态对象可以而成员对象不可以不是说编译器知不知道a类的全部结构。
因为编译器已经可以知道a类的结构。
楼上几位已经答复了了为什么静态对象可以声明在类a内部。因为这个声明说明aa是属于a类作用于内的。但是你要使用a::aa必须在类a的外部进行一个显式的初始化:
-
C/C++ code
-
class a{ static a aa; int i; }; a a::aa;
而aa作为成员对象就不行了。楼主应该可以对它好好思考就可以得出结论了。我们使用假设法。
如果C++编译器允许你在a内部再定义一个a类的对象。那么我们可以想象:当你用a类创建一个对象oa时,由于
类a首先需要通过构造函数构造自己,也就是对自己的成员进行初始化。此时,当它去初始化aa时又会去调用a的
构造方法,为它初始化,如此无限迭代,形成一个无限的递归调用。这个问题在很多编译原理书中也提到过,也就是在编译期间进行防止无穷的递归迭代。
实际上对于class a 只有i这个成员占它的大小,也就是说a的结构只有一个成员int i。
对于aa 只是作用域在class a内。因此编译时,编译器知道claas a的结构