在Beyond Java(第2.2.9节)中,Brute Tate声称“打字模型”是C ++的问题之一。这是什么意思?
答案 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教授在Dog
和Cat
之间进行跨物种突变!这里的要点是,由于ralph
只是一个比特序列,你可以声称该比特序列实际上是Cat
并且没有任何问题会出错...除了“{{1 “的颜色会是一些随机的大整数,你最好不要试着读它的原产国。基本问题是,虽然变量(如名称,而不是它所代表的对象)具有类型,但基础对象却没有。
将此与JAVA进行比较,不仅类型,而且对象具有内在类型。这可能部分是因为没有指针因此无法访问内存,但事实上,如果你将Cat
转换为Dog
,则无法将其转换回来下至Object
,因为对象知道内心深处,实际上是Cat
,而不是Dog
。
C ++中存在的弱类型是相当有害的,因为如果您想要真正地滥用应用程序的证据,它会使编译器静态类型检查几乎无用,并且还使得安全且强大的软件难以编写。例如,每当访问“指针”时都需要非常小心,因为它实际上可能是任何随机位模式。
编辑1:评论非常好,我想在这里添加。
kts指出,如果你看得太深,Sun的JAVA确实有指针。谢谢!我不知道,这很酷。但是,基本点是JAVA对象是类型而C类型不是。是的,您可以规避这一点,但这与选择加入和退出垃圾邮件之间的区别相同:是的,您可以滥用JAVA指针,但默认情况下不会滥用。你必须选择加入。
martin-york指出我所展示的例子纯属C现象。这是事实,但
Cat
专门用于允许这样的黑客攻击。无论如何,劝阻某些事情并不会使事情发生。我不鼓励编码错误,但我没有看到它让我在任何地方......
至于有用的功能,它肯定是(只是在谷歌或维基百科上查找“快速反平方根”)但是,在Stroustroup的格言中丑陋的操作应该是丑陋的,危险阈值应该是危险的。显着提高。
答案 1 :(得分:0)
很难输入C ++代码。 :-P
但是说真的,他们可能指的是C ++有一个弱静态类型系统,可以很容易地绕过它。一些例子:typedef不是真正的类型,枚举类型只是int,booleans和整数在很多情况下都是等价的,依此类推。