详解C结构体、C++结构体 和 C++类:本质、相同之处和区别

今天,我们来细说一个大家可能都想到过但是往往没有深究的问题:结构体和类的区别,这个问题在咱们面试的时候是可能被提问的(划重点),让我们从头来开始说起:
在这里插入图片描述
首先我们要明确概念,什么是数据结构?什么是数据类型?

定义如下:
数据结构:计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

数据类型:在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。

这样说比较准确但不直观,让我们来举个栗子:
各个数据是各式书本,比如说整数1、2是语文必修1和语文必修2,浮点数1.1、1.2是高数上册和下册。那我们每个学期呢,都要学习,各个科目,那第一学期我们的书包里会需要放置语文1和高数上,这两者差异明显,但是我们这学期都要学,我们就把他们放到一起,到下学期两本一起替换,他们被学期的需要联系在一起,这就是数据结构,我们把他们放到一起便于日常使用,计算机把数据放在一起提高效率。而接下来,我们知道语文必修1和语文必修2都是语文,他们在形式和目的上都相似但内容不同,这不正像是两个整形数1和2?这就叫做数据类型。

他们的常见表现:
数据结构:数组、栈、队列、链表、树、图、堆、散列表等。

数据类型:基本数据类型(byte、short、int、long、double、float、boolean、char),引用数据类型。

好了说到这里大家对着两个概念应该都弄清楚了,那么可能有人就会打我了,说你这个和你的标题有关系吗?答案是肯定的!
在这里插入图片描述
因为我们从名字上就能知道,结构体是数据结构的一种,类是数据类型的(最高级的)一种!也就是说,以上定义直接套到结构体和类上即可发现两者的不同。

我们比较c中的struct和c++中的类确实如此:(c++中struct和类的实现代码完全一样,只是默认权限不同)

  • 默认可访问性:结构体的成员默认public,类的成员默认private
  • 结构体是值类型,类是引用类型,因此它们具有所有值类型和引用类型之间的差异(所有 struct 类型都派生自 System.ValueType,是值类型,包括 int、long、double 等等。所有 class 类型都派生自 System.Object,是引用类型,包括 string 等等。)
  • 结构体成员不能在声明时赋值初始值,类可以
  • 不能为结构体提供无参构造函数
  • 结构体在自定义构造函数中必须为成员赋值(否则报错error C2016: C 要求一个结构或联合至少有一个成员)
  • 结构不允许声明析构函数(Destructor),类则无此限制
  • 结构体之间的比较,可以使用Equals而不能使用==操作符。且当结构体有成员是引用类型时,成员的比较是用 Object.ReferenceEquals 实现,即该引用类型的成员是否指向相同的引用
  • 结构不能包含成员函数
  • 结构不能继承
  • 结构不能实现多态

实际上,上述的第三到五点实际上是由于访问权限所致,也就是说他们是第一种差异的具体表现(你可以通过使用public关键词等改变权限,会发现类将也无法使用无参构造函数),不过这几点看起来很明显,单独列出。

可以看出来,两者差异十分巨大,可以说类此时功能远多于结构。然而,这种情况在C++上面出现了极大的改变。C++最初的想法是对C进行扩充——“abetterc”,但事实上,这样的“扩充”已经不能再称之为扩充了,我认为C++的很多思想已经完全是一种新的语言。受到OO思想的冲击,C++中的struct对C中的struct进行了十足的扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能:这时候的struct几乎能完成类的绝大部分功能:它可以包含成员函数、可以继承、可以实现多态,它几乎和类没有区别,你会发现绝大多数时间两者都可以相互对换。
然而两者间的部分本质区别任仍然得到了保留:

  • 默认可访问性:结构体的成员默认public,类的成员默认private
  • 结构体是值类型,类是引用类型,因此它们具有所有值类型和引用类型之间的差异

在这里插入图片描述
最后,说一下如何选用两者:
(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct,这一点相比参加过ACM和CSP的人都有所体会。
(2) 在表示数据量大、逻辑复杂的大对象时,首选class,面向对象的思想在处理复杂问题时往往十分好用。
(3) 在表现抽象和多级别的对象层次时,class是最佳选择 ,还是那句话,代码量上去了要处理大量对象了就用类。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值