我很希望能够做到这一点:
class myInt : public int
{
};
我为什么不能
我为什么要更强的打字。例如,我可以定义两个类
intA
和intB
,这两个类让我可以执行intA + intA
或intB + intB
,但不能执行intA + intB
。“整数不是类(Class)。”所以呢?
“整数没有任何成员数据。”是的,他们有,它们有32位或其他。
“Int没有任何成员函数。”好吧,他们有一堆运算符,例如
+
和-
。 最佳答案
尼尔的评论很准确。 Bjarne提到考虑并拒绝这种确切的可能性1:
就评论而言,性能证明不将int设为类,这是(至少大部分情况下)是错误的。在Smalltalk中,所有类型都是类-但是,几乎所有Smalltalk的实现都有优化,因此该实现与使非类类型工作的方式基本上相同。例如,smallInteger类表示一个15位整数,并且'+'消息被硬编码到虚拟机中,因此,即使您可以从smallInteger派生,它的性能仍然类似于内置类型( (尽管Smalltalk与C++的差异足以使直接性能比较变得困难,而且意义不大)。
在smallInteger的Smalltalk实现中“浪费”了一位(原因是它只代表15位而不是16位)在C或C++中可能不需要。 Smalltalk有点像Java,当您“定义对象”时,您实际上只是在定义指向对象的指针,并且必须动态分配一个对象以使其指向。您操纵,作为参数传递给函数等的内容始终只是指针,而不是对象本身。
但是,这不是实现smallInteger的方式-在这种情况下,他们将整数值直接放入通常是指针的位置。为了区分smallInteger和指针,它们强制将所有对象分配在偶数字节边界处,因此LSB始终清晰可见。 smallInteger始终具有LSB设置。
但是,大多数情况都是必需的,因为Smalltalk是动态类型的-它必须能够通过查看值本身来推断类型,而smallInteger基本上是使用该LSB作为类型标记。鉴于C++是静态类型的,因此不需要从值中推断类型,因此您可能不需要“浪费”类型标签上的该位。
1.在C++的设计和演进中,第15.1.3。节。