C ++中的某些功能是类型安全的,而其他一些功能则不是。
C ++类型安全示例:
char c = 'a';
int *p = &c; // this is not allowed (compiler error)
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!
我在几篇文章中读到C ++不是一种类型安全的语言。我可以认为它是一种非类型安全的语言,还是说它是一种部分类型安全的语言更准确?
答案 0 :(得分:2)
C ++起初是1970年代中后期C的延伸,它被设计为一种高级可移植汇编语言,使Unix更易于移植和维护。 C ++为其新功能添加了类型安全性,但目标是主要与C兼容(特别是使用所有现有的C库,包括它们的头文件),C的原始核心必须保持不变。
特别是,C ++将数组衰减到来自C的指针。在C ++中,它不是类型安全的,因为它允许从Derived
数组到指针Base
的隐式转换,然后可以使用未定义的行为进行索引。
答案 1 :(得分:2)
您提供的示例完全没有违反“类型安全”。这里:
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!
在该示例中,*p
是int
,您为其分配的数字为12345
,也为int
。
编译器不允许您违反类型系统,因为您要将一个int
分配给另一个int
。
您要解除引用以获取int
之一的指针未初始化的事实导致潜在的崩溃,但它与类型安全无关。
这不会崩溃:
int* p = new int;
*p = 12345;
在这里,您要向另一个int
(12345
)写int
(*p
),但这次是您要写的int
({{ 1}})实际存在。
不类型安全性,编译器无法检查它是指针的完整性。