类与结构


12

在C ++和其他受影响的语言中,有一个称为Structure(struct)的构造,另一个称为class。两者都能够容纳函数和变量。一些区别是:

  1. 类在堆中struct被分配了内存,在堆栈中被分配了内存(注意:这对于C ++是错误的,但是在OP所谓的“受影响的语言”中可能是正确的)
  2. 默认情况下,类变量是私有的,而struct它们是公共的

我的问题是:是否以struct某种方式放弃了上课?如果是这样,为什么?除了上述差异之外,a struct可以完成类所具有的所有相同功能。那么为什么要放弃呢?


放弃,我的意思是为什么一个要比另一个要用。
prometheuspk,

我想您的问题本身就可以回答。
Umair A.

3
类和结构之间的区别取决于语言。从C ++中学到的一些知识实际上不适用于C#。
工作

6
嗯 在C ++中,您可以在堆栈或堆上分配对象。哪里都行。
jojo 2011年

8
错,错,错。堆栈与堆无关
亚伦诺特,2011年

Answers:


11

它根本没有被遗弃。实际上,即使像C#这样的现代语言也大量使用它,class仍然可以为您提供服务struct。至于何时选择一个有用的选择,请参考本文:

在类和结构之间进行选择

引用自MSDN文章:

如果类型的实例较小且通常为短寿命或通常嵌入在其他对象中,请考虑定义结构而不是类。

除非类型具有以下所有特征,否则请不要定义结构:

  • 它在逻辑上表示一个值,类似于基本类型(整数,双精度型,等等)。
  • 它的实例大小小于16个字节。
  • 这是一成不变的。
  • 不必经常装箱。

4
这个答案确实被误导了,因为.Net / C#struct / class的含义不同于C ++:它们使用相同的名称,但根据语言而具有不同的语义!在C ++中,struct和class之间几乎没有区别,并且问题在第一点上是完全错误的,这在c#和D中是正确的,但在c ++中不是。因此,有关.Net的本文链接确实是错误的。不是C ++!
克莱姆

@Klaim从技术上讲也不适合C#(结构可以在堆上)C#的重要区别是值语义和引用语义之间的区别,C ++不需要区别,因为C ++可以具有值或任何引用的引用
jk。

17

您对C ++感到误解:类和struct之间唯一的显着差异是默认的访问说明符差异。对于所有意图和目的,结构和类都是同义词,我相信保留结构是为了向后兼容C。


7
不仅仅。当您只想在一个对象中转储一堆数据并且不向其添加任何行为时,Struct是一个不错的选择。
quant_dev

2
@quant:这是使用结构的可怕原因。我真的希望评论能说得通。
亚伦诺特,2011年

1
@Aaronaught为什么?我对结构的使用的观点是相当标准,看到这个答案,例如:stackoverflow.com/questions/54585/...
quant_dev

1
@Aaronaught然后如何返回多个值?假设,一个推销模型会返回原始价格,脏价和应计付款的总和。
quant_dev

1
@quant_dev-您可以出于自己的目的(对于前C程序员确实有很多道理)决定将某种元含义附加到结构上,但这并没有改变以下事实:该结构与C ++中的class关键字是默认访问权限。
Joris Timmermans

2

语言D在类和结构之间产生了更大的区别

d中的一个结构不过是一个堆栈分配的数据记录,它带有一些可以调用的函数(除非使用enum + union设置,即自己实现多态性,否则没有继承选项),该函数按值传递

一个类就像我们习惯于:虚拟函数,堆分配,(单个)继承,由ref传递

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.