我应该何时将类型定义为结构或类?
我知道struct是值类型,而类是引用类型。所以我想知道,例如,我应该将堆栈定义为结构还是类?
答案 0 :(得分:33)
原因#1 选择struct vs class:类具有继承,而struct不具有继承。如果需要多态性,则必须使用类。
原因#2:结构通常是值类型(但如果你使用它,你可以使它们成为引用类型)。类始终是引用类型。因此,如果您需要值类型,请选择结构。如果你想要一个引用类型,最容易上课。
原因#3:如果您的类型包含大量数据成员,那么您可能需要引用类型(以避免昂贵的复制),在这种情况下,您可以可能会选择一个班级。
原因#4:如果您想要确定性地破坏您的类型,那么它将需要成为堆栈上的结构。 GC堆上的任何内容都没有确定性破坏,并且GC堆上的东西的破坏者/终结器可能永远不会运行。如果他们被GC收集,那么他们的终结者将被运行,否则,他们将不会。因此,如果您希望在离开作用域时自动销毁类型,则需要使用结构并将其放在堆栈中。
至于你的特殊情况,容器通常应该是引用类型(每次传递它时复制它们的所有元素都会非常昂贵),而Stack
是一个容器,所以你要去想要使用一个类,除非你想要使它成为一个重新计算的结构,这显然是更多的工作。它的优点是可以保证析构函数在不再使用时运行。
另外,如果您创建一个类的容器,您可能希望将其设置为final,以便可以内联其各种函数(如果该类不是,则不会是虚函数)派生自Object
之外的任何东西,并且它们不是Object
所具有的功能,这对于像性能绝对重要的容器这样的东西很重要。
答案 1 :(得分:5)
阅读"D"iving Into the D Programming Language
在D中你得到结构然后你得到课程。它们共享许多设施,但有不同的章程:结构是值类型,而类是动态多态,只能通过引用访问。那种混乱,切片相关的错误,以及评论等等!不要继承!不存在。设计类型时,您需要预先确定它是单形值还是多态引用。 C ++着名地允许定义模糊性别类型,但它们的使用很少,容易出错,而且令人反感,足以保证简单地通过设计来避免它们。
对于Stack
类型,您可能最好首先定义interface
然后再实施(使用class
),这样就不会将特定的实现与您的Stack
类型到其界面。