1、什么是类型安全
类型安全(Type Safety)是指语言在编译和运行时提供的保护机制,来避免出现非法的类型转换和操作。
类型安全的语言在编译期就可以发现大部分的类型错误,使得程序运行时不太可能出现非法的类型转换或者访问错误。这样可以提高代码质量,减少潜在的bug。
2、C的类型安全
C语言不是类型安全的语言,原因如下:
1)很多情况下,会存在类型隐式转换,比如bool自动转成int类型;
2)malloc函数返回的是void *的空类型指针,通常需要这样的显示类型转换char *pStr=(char*)malloc(100*sizeof(char)),类型匹配没有问题。但如果出现int * pInt=(int*)malloc(100*sizeof(char))这样的转换,可能会带来一些问题,但C并不会提示。
当然,在有些情况下表现还是类型安全的,当从一个结构体指针转换成另一个结构体指针时,编译器会报错,除非显式转换。
3、C++的类型安全
C++也不是类型安全的语言,但远比C更具类型安全。相比于C,提供了一些安全保障机制:
- 操作符new返回的指针类型严格与对象匹配,而不是void*;
- C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;
- 引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;
- 一些宏定义可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全;
- C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及更多具体的类型检查。
4、C++ 的潜在类型问题
- 静态类型系统的局限
C++采用静态类型检查,只能在编译期检查部分类型错误,一些运行时错误无法避免。 - 隐式类型转换风险
如整数和浮点数之间的隐式转换就可能导致意外问题。 - 引用和指针的不当使用
开发者的不当使用可能导致未定义行为。 - 旧式C语法
C++为了兼容C,保留了一些非类型安全的特性,如直接指针操作等。