类定义中包含自己的对象的问题

class 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的结构

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值