我试图了解类型安全的好处。但我对某事感到困惑。
根据我对类型安全性的理解,类型安全性可防止您混合不兼容的数据类型。例如,您无法将char*
分配给int*
:
char c = 'a';
int *p = &c; // this is not allowed (compiler error)
现在我猜测不允许这样分配的好处是因为如果我试图取消引用p
,我将访问3个额外的字节,我不允许访问。
但是在C ++中,我可以做以下事情:
int *p; // I don't have to initialize p, and so it will have some junk/random value
*p = 12345; // this will probably lead to segmentation fault!
所以基本上在最后一个例子中,我被允许做第一个例子中类型安全试图阻止的行为!我在这里错过了什么吗?!
答案 0 :(得分:2)
我认为您在问C ++是否可以保护我免受某些错误的影响,为什么不是所有错误?它可以保护您免受明显的错误,但它不能保护您免受每个错误的影响。但是,除了错误之外,它还会发出很多警告。在您的示例中,我收到了警告:
warning C4700: uninitialized local variable 'p' used
在进行分配之前,编译器可以看到您尚未初始化p
。
我工作的大多数地方坚持要求在发布任何事情之前修复所有警告,这是一个很好的政策 - 将所有警告视为错误!
答案 1 :(得分:0)
这是允许的,因为C ++没有跟踪变量是否被初始化;你的例子 nothing 与类型安全有关(那里没有类型的不兼容)
答案 2 :(得分:0)
C ++是一种复杂的语言,由许多人在多年的时间内设计,因此无法找到干净清晰的设计方向。
然而,最初的想法之一就是不要让C ++和汇编程序之间有任何提高速度的空间,因此大多数部分的语言都会牺牲安全性,因为这会暗示性能成本。
使用“错误类型”是在编译时完成的,并且在运行时没有成本。检查是否使用未初始化的变量(或大多数其他语言中存在的禁止未初始化的变量)将需要运行时成本惩罚,因此它被排除在外。