我们知道任何类型的数据在计算机的底层都是0和1所表示,而不同的读取方式,给相同的字节带来了不同的解释方式,或解释为int型的数字,又或者解释为string的字符串。就比如C/C++语言中的union联合体数据结构,就是通过对同一段内存的数据按照不同的方式来解释从而获得不同类型的数据。而类型安全就是限制了对于同一段内存的解释方式。
C++是不具有类型安全的,因为在C++中,没有限制对于内存的解释方式,如int型的数据1,同时也可以解读为bool型的数据true。这里要和正常的类型转换做出区分,如java就是门类型安全的语言,但它同时也支持类型转换。
//C++ 可以正常输出 int a = 1; if(a) cout<<"类型安全"; //java 报错 int a = 1; if(a) System.out.println("类型安全");
又比如:
//C++ 正常运行 void fun(int a) { cout<<"非类型安全"<<endl; } int main() { double a = 100; fun(a); return 0; } //java 提示错误 void fun(int a) { System.out.println("类型安全"); } int main() { double a = 100; fun(a); return 0; } //java 正确输出 void fun(double a) { System.out.println("类型安全"); } int main() { int a = 100; fun(a); return 0; }
由上可见,类型转化和类型安全并不冲突,java的隐式类型转化只支持扩大转换,而不支持收缩转换,所以类型转换后仍旧是安全的。而C++只会给出警告。
再贴一些网上关于类型安全的说法:
1.swift中关于类型安全的解释
Swift is a type-safe language, which means the language helps you to be clear about the types of values your code can work with.
2.类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。
3.在编写 C++ 程序时,请务必确保它是类型安全的。 这意味着每个变量、函数自变量和函数返回值将存储一个可接受的类型的数据,并意味着涉及不同类型的值的操作“有意义”且不会导致数据丢失、位模式解释不正确或内存损坏。 从不显式或隐式地将值从一种类型转换为另一种类型的程序在定义上是类型安全的。 但是,有时需要进行类型转换,甚至需要进行不安全的类型转换。 例如,你可能必须将浮点运算的结果存储在类型的变量中 int
,或者可能需要将中的值传递 unsigned int
给采用的函数 signed int
。 这两个示例列举了不安全的转换,因为它们可能会导致数据丢失或值的重新解释。(类型转换和类型安全 | Microsoft Docs类型转换和类型安全 | Microsoft Docs)
新人学习过程难免有错,希望大家指正,谢谢~