我很希望能够做到这一点:

class myInt : public int
{

};

我为什么不能

我为什么要更强的打字。例如,我可以定义两个类intAintB,这两个类让我可以执行intA + intAintB + 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。节。

10-06 05:19