c结构体、c++结构体、c++类的区别

本文介绍了C和C++中结构体的不同,如C结构体不能为空、只能定义成员变量等。还阐述了C++中结构体与类的异同,包括访问权限、类型、效率等方面。分析了C++中空类大小为1的原因,以及值类型和引用类型的区别,最后给出struct和class的使用时机建议。

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

C和C++中结构体的不同:

a) C语言中的结构体不能为空,否则会报错

1>d:\myproject\visual studio 2013\projects\myc++\main.c(71): error C2016: C 要求一个结构或联合至少有一个成员

b) C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。

c) 在C语言中结构体变量定义的时候,若为struct 结构体名 变量名定义的时候,struct不能省略。但是在C++之中则可以省略struct。

C++中的结构体与类的区别:

先来说说C++中两者的相同之处: 结构体中也可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。总的一句话:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到。

区别:

a) 对于成员访问权限以及继承方式,class中默认的是private,而struct中则是publicclass还可以用于表示模板类型,struct则不行

b) 类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。

c) 效率:由于堆栈的执行效率要比堆的执行效率高,但是堆栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。

d) 关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。

e) C语言中,空结构体的大小为0,而C++中空结构体(属于空类)的大小为1。

C++中空类的大小为1的原因:
空类也可以实例化,类实例化出的每个对象都需要有不同的内存地址,为使每个对象在内存中的地址不同,所以在类中会加入一个隐含的字节。

值类型和引用类型的区别:
值类型变量的赋值操作,仅仅是2个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变。

结构体引出的问题:上面说到值类型的内存不由垃圾回收控制,作用域结束时,值类型会自行释放,减少了托管堆的压力,因此具有性能上的优势。例如,通常 struct比class更高效;而引用类型的内存回收,有垃圾回收机制控制。这就引出了关于.NET内存中的堆和栈的讨论 。

最后做一个小小的总结:

关于 Class性能好还是Struct性能好(换言堆性能好?还是栈性能好?) 那么什么时机该用呢 ,比较struct和 class的不同,我使用一下网上的一个牛人总结的比较好的一段话:

(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct。
(2) 在表示数据量大、逻辑复杂的大对象时,首选class。

(3) 在表现抽象和多级别的对象层次时,class是最佳选择 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值