【发布时间】:2012-06-13 12:00:51
【问题描述】:
什么时候应该将类型定义为结构或类?
我知道结构是值类型,而类是引用类型。所以我想知道,例如,我应该将堆栈定义为结构还是类?
【问题讨论】:
标签: d
什么时候应该将类型定义为结构或类?
我知道结构是值类型,而类是引用类型。所以我想知道,例如,我应该将堆栈定义为结构还是类?
【问题讨论】:
标签: d
原因 #1 选择结构体与类:类具有继承性,结构体没有。如果你需要多态,你必须使用类。
原因 #2: 结构通常是值类型(尽管如果您使用它,您可以将它们设为引用类型)。类始终是引用类型。所以,如果你想要一个值类型,选择一个结构。如果你想要一个引用类型,使用类是最简单的。
原因#3:如果您有一个包含大量数据成员的类型,那么您可能会想要一个引用类型(以避免昂贵的复制),在这种情况下,您'我可能会选择一个类。
原因#4:如果您想要确定性销毁您的类型,那么它需要是堆栈上的结构。 GC 堆上的任何内容都没有确定性破坏,并且 GC 堆上的东西的析构函数/终结器可能永远不会运行。如果它们被 GC 收集,那么它们的终结器将被运行,否则它们不会。因此,如果您希望您的类型在离开作用域时自动销毁,您需要使用结构并将其放入堆栈。
至于您的特定情况,容器通常应该是引用类型(每次传递一个时复制它们的所有元素会非常昂贵),而 Stack 是一个容器,所以你会想要使用一个类,除非你想把它变成一个引用计数的结构,这显然是更多的工作。它的优点是保证它的析构函数在不再使用时会运行。
附带说明,如果您创建一个作为类的容器,您可能希望将其设置为 final,以便可以内联其各种功能(如果该类没有,则不会是虚拟的派生自 Object 以外的任何东西,它们不是 Object 拥有的函数),这对于像容器这样的性能绝对重要的东西来说可能很重要。
【讨论】:
阅读"D"iving Into the D Programming Language
在 D 中你得到结构然后你得到类。它们共享许多便利,但有不同的章程:结构是值类型,而类则用于动态多态性,并且只能通过引用访问。这样会造成混乱、切片相关的错误和 cmets à la // 不!不要继承!不存在。当你设计一个类型时,你会预先决定它是一个单态值还是一个多态引用。众所周知,C++ 允许定义模棱两可的性别类型,但它们的使用很少、容易出错且令人反感,足以保证通过设计来避免它们。
对于您的 Stack 类型,您最好先定义一个 interface,然后再定义其实现(使用 class),这样您就不会将您的 Stack 类型的特定实现绑定到它的界面。
【讨论】:
interfaces 也有一定的优势。