C++定义类时,为什么不能在类中声明自身类型的成员变量?

本文探讨了在C++中类声明与定义的区别,并详细解释了如何实例化一个类的对象。文章通过具体示例说明了在类定义中使用未完成类型的指针或引用作为成员变量的正确性和错误用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类声明:
class dog; //类的声明

类定义:
class dog{ //类的定义

};

当用实例化一个类的对象时,编译器会根据类的定义来分配相应的存储空间
。也就是说,在创建对象前,一定要有完整的类定义,这样编译器才能正确的计算所需空间。
那么我们来看如下代码:

class dog{
dog tt; //error, ‘tt’ uses undefined class ‘dog’

};

上述代码中,由于dog还没有定义结束,在内部定义一个dog类型的对象时,编译器无法知道应该为tt分配多少内存空间,因此会报注释中的错误。

我们再看下面一段代码:

class dog{
dog *Zhlu; //ok
dog& SKII; //ok
};

在类定义时,定义指向自身类型的指针或引用作为内部成员没有问题,由于指针和引用所占存储空间大小与类型无关,所以编译器可以计算分配空间,所以正确。

### 关于C/C++声明结构体类型的同定义结构体变量 在C/C++编程语言中,确实可以在声明结构体类型的同定义其对应的结构体变量。这种语法设计是为了简化代码书写并提高开发效率。 #### 1. **可行性** 在C语言中,可以通过如下方式实现结构体类型声明以及对应实例的初始化: ```c struct Node { int data; struct Node* next; // 使用指向自身的指针而非直接嵌套自身 } nodeInstance; ``` 上述代码展示了如何在同一语句中完成`Node`结构体的定义及其具体实例化操作[^1]。需要注意的是,在此场景下如果尝试将整个结构体作为自己的成员,则会引发编译错误,因为这会造成无限递归大小的问题;而采用指针形式则会存在这样的困扰。 对于匿名结构体的情况, ```c struct { int a; } instance; // 或者多个实例一起定义 struct { int b; } inst1, inst2; ``` 这里虽然没有显式的命名空间标签(tag),但是仍然能够正常工作,并且每次都会创建一个新的独立类型[^2]。这意味着即使两个匿名结构看起来完全一样(即拥有相同的字段布局),它们依然被视作同的类型,无法互相赋值或比较除非通过特定转换手段处理。 #### 2. **安全性考量** 尽管技术上支持跨类型之间的强制转型,比如把某个结构体转成另一个完全同甚至可能匹配的目标类型地址表示法,然而实际应用过程中应当极力避免此做法,因为它往往带来难以预料的结果——也就是所谓的“未定义行为”(Undefined Behavior)[^3]。 #### 3. **理论基础** 从更广义的角度来看待这个问题的话,我们可以认识到结构体本质上是一种复合型数据单元,允许程序员组合多种基本或其他复杂的数据种来构建更加贴近现实世界需求的概念模型[^4]。因此当我们在编码期间希望既描述清楚某事物又立即制造若干该别下的实体样本,“一边声明一边实例”的机制就显得格外便利实用了。 ### 总结 综上所述,在C/C++里边是可以做到一边做结构体类型说明同也进行相应个体生产的动作的,这是由这两种语言的设计哲学所决定下来的特性之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值