说C ++是部分类型安全的语言是否准确?

时间:2016-10-02 04:27:56

标签: c++

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 ++不是一种类型安全的语言。我可以认为它是一种非类型安全的语言,还是说它是一种部分类型安全的语言更准确?

2 个答案:

答案 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!

在该示例中,*pint,您为其分配的数字为12345int

编译器不允许您违反类型系统,因为您要将一个int分配给另一个int

您要解除引用以获取int之一的指针未初始化的事实导致潜在的崩溃,但它与类型安全无关。

这不会崩溃:

int* p = new int;
*p = 12345;

在这里,您要向另一个int12345)写int*p),但这次是您要写的int({{ 1}})实际存在。

类型安全性,编译器无法检查它是指针的完整性。