31

什么时候应该将类型定义为结构或类?

我知道结构是值类型,而类是引用类型。所以我想知道,例如,我应该将堆栈定义为结构还是类?

4

2 回答 2

39

选择结构与类的原因#1:类具有继承性,结构没有。如果你需要多态,你必须使用类。

原因 #2:结构通常是值类型(尽管如果你使用它,你可以将它们设为引用类型)。类始终是引用类型。所以,如果你想要一个值类型,选择一个结构。如果你想要一个引用类型,最简单的方法是使用一个类。

原因#3:如果你有一个包含很多数据成员的类型,那么你可能会想要一个引用类型(以避免昂贵的复制),在这种情况下,你可能会选择一个类。

原因 #4:如果您想要确定性销毁您的类型,那么它将需要是堆栈上的结构。GC 堆上没有任何东西具有确定性破坏,并且 GC 堆上的东西的析构函数/终结器可能永远不会运行。如果它们被 GC 收集,那么它们的终结器将被运行,否则它们不会。因此,如果您希望您的类型在离开范围时自动销毁,您需要使用结构并将其放入堆栈。

至于您的特定情况,容器通常应该是引用类型(每次传递一个时复制它们的所有元素都会非常昂贵),并且 aStack是一个容器,所以除非您使用,否则您将要使用一个类想要麻烦地将其设置为引用计数的结构,这无疑是更多的工作。它只是具有保证其析构函数在不再使用时会运行的优势。

附带说明一下,如果您创建一个作为类的容器,您可能希望将其设为 final,以便可以内联其各种功能(如果该类不是从任何东西派生的,则不会是虚拟的除了Object并且它们不是Object具有的功能),这对于诸如性能绝对重要的容器之类的东西可能很重要。

于 2012-06-10T01:06:11.573 回答
6

将“D”读入 D 编程语言

在 D 中,你得到结构,然后你得到类。它们共享许多便利,但有不同的章程:结构是值类型,而类则用于动态多态性,只能通过引用访问。这样会造成混乱、与切片相关的错误和评论 à la // 不!不要继承!不存在。当你设计一个类型时,你会预先决定它是一个单态值还是一个多态引用。众所周知,C++ 允许定义模棱两可的性别类型,但它们的使用很少、容易出错且令人反感,足以保证通过设计简单地避免使用它们。

对于您的Stack类型,您最好interface先定义其实现,然后再定义其实现(使用class),这样您就不会将您的Stack类型的特定实现绑定到其接口。

于 2012-06-10T00:49:56.660 回答