什么是“打字模特”?

时间:2009-10-25 00:26:34

标签: java c++ types type-theory

在Beyond Java(第2.2.9节)中,Brute Tate声称“打字模型”是C ++的问题之一。这是什么意思?

2 个答案:

答案 0 :(得分:3)

他的意思是C ++中的对象本质上没有类型。虽然你可以写

struct Dog {
    char* name;
    int breed;
};

Dog ralph("Ralph", POODLE);

实际上ralph没有类型;它只是一堆比特,而CPU并没有对你将这个比特集称为Dog这一事实表示不满。例如,以下内容有效:

struct Cat {
    int color;
    char* country_of_origin;
};

Cat ralph_is_that_you = * (Cat*) &ralph;

奇怪的是,C教授在DogCat之间进行跨物种突变!这里的要点是,由于ralph只是一个比特序列,你可以声称该比特序列实际上是Cat并且没有任何问题会出错...除了“{{1 “的颜色会是一些随机的大整数,你最好不要试着读它的原产国。基本问题是,虽然变量(如名称,而不是它所代表的对象)具有类型,但基础对象却没有。

将此与JAVA进行比较,不仅类型,而且对象具有内在类型。这可能部分是因为没有指针因此无法访问内存,但事实上,如果你将Cat转换为Dog,则无法将其转换回来下至Object,因为对象知道内心深处,实际上是Cat,而不是Dog

C ++中存在的弱类型是相当有害的,因为如果您想要真正地滥用应用程序的证据,它会使编译器静态类型检查几乎无用,并且还使得安全且强大的软件难以编写。例如,每当访问“指针”时都需要非常小心,因为它实际上可能是任何随机位模式。

编辑1:评论非常好,我想在这里添加。

kts指出,如果你看得太深,Sun的JAVA确实有指针。谢谢!我不知道,这很酷。但是,基本点是JAVA对象类型而C类型不是。是的,您可以规避这一点,但这与选择加入和退出垃圾邮件之间的区别相同:是的,您可以滥用JAVA指针,但默认情况下不会滥用。你必须选择加入。

martin-york指出我所展示的例子纯属C现象。这是事实,但

  1. C ++主要包含C作为子集(差异通常太小而无法列出)。
  2. C ++包含Cat专门用于允许这样的黑客攻击。
  3. 仅仅因为气馁并不意味着它不是普遍存在或危险的。基本上,即使JAVA有选择指针(我称之为),事实是使用它们的人可能已经想到了后果。 C的演员阵容非常简单,以至于他们有时不经思考就完成了(引用Stroustroup,“但新的语法是刻意丑陋的,因为演员仍然是一个丑陋且经常不安全的操作。”)。还有一个事实是,规避JAVA类型系统所需的工作远远超过了聪明的黑客攻击所需的工作,同时规避C类型系统(是的,C ++类型系统)很容易,我已经看到了它这只是为了提升性能。
  4. 无论如何,劝阻某些事情并不会使事情发生。我不鼓励编码错误,但我没有看到它让我在任何地方......

    至于有用的功能,它肯定是(只是在谷歌或维基百科上查找“快速反平方根”)但是,在Stroustroup的格言中丑陋的操作应该是丑陋的,危险阈值应该是危险的。显着提高。

答案 1 :(得分:0)

很难输入C ++代码。 :-P

但是说真的,他们可能指的是C ++有一个弱静态类型系统,可以很容易地绕过它。一些例子:typedef不是真正的类型,枚举类型只是int,booleans和整数在很多情况下都是等价的,依此类推。