今天,我们来细说一个大家可能都想到过但是往往没有深究的问题:结构体和类的区别,这个问题在咱们面试的时候是可能被提问的(划重点),让我们从头来开始说起:
首先我们要明确概念,什么是数据结构?什么是数据类型?
定义如下:
数据结构:计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据类型:在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。
这样说比较准确但不直观,让我们来举个栗子:
各个数据是各式书本,比如说整数1、2是语文必修1和语文必修2,浮点数1.1、1.2是高数上册和下册。那我们每个学期呢,都要学习,各个科目,那第一学期我们的书包里会需要放置语文1和高数上,这两者差异明显,但是我们这学期都要学,我们就把他们放到一起,到下学期两本一起替换,他们被学期的需要联系在一起,这就是数据结构,我们把他们放到一起便于日常使用,计算机把数据放在一起提高效率。而接下来,我们知道语文必修1和语文必修2都是语文,他们在形式和目的上都相似但内容不同,这不正像是两个整形数1和2?这就叫做数据类型。
他们的常见表现:
数据结构:数组、栈、队列、链表、树、图、堆、散列表等。
数据类型:基本数据类型(byte、short、int、long、double、float、boolean、char),引用数据类型。
好了说到这里大家对着两个概念应该都弄清楚了,那么可能有人就会打我了,说你这个和你的标题有关系吗?答案是肯定的!
因为我们从名字上就能知道,结构体是数据结构的一种,类是数据类型的(最高级的)一种!也就是说,以上定义直接套到结构体和类上即可发现两者的不同。
实际在c语言中两者确实差别如此:
- 默认可访问性:结构体的成员默认private,类的成员默认public
- 结构体是值类型,类是引用类型,因此它们具有所有值类型和引用类型之间的差异
- 结构体成员不能在声明时赋值初始值,类可以
- 不能为结构体提供无参构造函数
- 结构体在自定义构造函数中必须为成员赋值(否则报错error C2016: C 要求一个结构或联合至少有一个成员)
- 结构不允许声明析构函数(Destructor),类则无此限制
- 结构体之间的比较,可以使用Equals而不能使用==操作符。且当结构体有成员是引用类型时,成员的比较是用 Object.ReferenceEquals 实现,即该引用类型的成员是否指向相同的引用
- 结构不能包含成员函数
- 结构不能继承
- 结构不能实现多态
实际上,上述的第三到五点实际上是由于访问权限所致,也就是说他们是第一种差异的具体表现(你可以通过使用public关键词等改变权限,会发现类将也无法使用无参构造函数),不过这几点看起来很明显,单独列出。
可以看出来,两者差异十分巨大,可以说类此时功能远多于结构。然而,这种情况在C++上面出现了极大的改变。C++最初的想法是对C进行扩充——“abetterc”,但事实上,这样的“扩充”已经不能再称之为扩充了,我认为C++的很多思想已经完全是一种新的语言。受到OO思想的冲击,C++中的struct对C中的struct进行了十足的扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能:这时候的struct几乎能完成类的绝大部分功能:它可以包含成员函数、可以继承、可以实现多态,它几乎和类没有区别,你会发现绝大多数时间两者都可以相互对换。
然而两者间的部分本质区别任仍然得到了保留:
- 默认可访问性:结构体的成员默认private,类的成员默认public
- 结构体是值类型,类是引用类型,因此它们具有所有值类型和引用类型之间的差异
最后,说一下如何选用两者:
(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct,这一点相比参加过ACM和CSP的人都有所体会。
(2) 在表示数据量大、逻辑复杂的大对象时,首选class,面向对象的思想在处理复杂问题时往往十分好用。
(3) 在表现抽象和多级别的对象层次时,class是最佳选择 ,还是那句话,代码量上去了要处理大量对象了就用类。
来源:CSDN
作者:白鸽子咕咕咕
链接:https://blog.csdn.net/weixin_44001813/article/details/104560701