读书人

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

发布时间: 2012-03-09 16:54:57 作者: rapoo

类定义中包含自己的对象的问题
class a{
a aa;
int i;
};
int main(){}
为什么这个类编译通不过但是换成这样
class a{
static a aa;
int i;
};
int main(){}
这样就可以通过,
我在网上看的是类定义中不能包含自己本身的对象,否则会引起像无限递归的问题,我想就是会让aa对象里又有一个aa对象,这样无限下去,所以不行,那下边第二个定义为什么就行呢?我觉得同样会引起像第一个那样的问题,我编译第一个出现的错误是类型声名不全,第二个没错误,不知道是为什么?

[解决办法]
静态成员属于类,而不属于对象
[解决办法]
静态成员的作用域属于类,但不占类的大小,不属于类的对象,内存在全局存储区。
[解决办法]
之所以静态对象可以而成员对象不可以不是说编译器知不知道a类的全部结构。
因为编译器已经可以知道a类的结构。

楼上几位已经答复了了为什么静态对象可以声明在类a内部。因为这个声明说明aa是属于a类作用于内的。但是你要使用a::aa必须在类a的外部进行一个显式的初始化:

C/C++ code
class a{        static a aa;       int i;       }; a a::aa;
[解决办法]
静态成员的初始化在类外,既然在类外,那编译器就已经看见了类的整个定义,因此可以初始化
[解决办法]
class a{
static a aa;
int i;
};

实际上对于class a 只有i这个成员占它的大小,也就是说a的结构只有一个成员int i。
对于aa 只是作用域在class a内。因此编译时,编译器知道claas a的结构

读书人网 >C++

热点推荐