类型安全在C ++中是一件大事。不支持隐式转换的不同类型的变量不能设置为相等。 如何进行安全检查? 除了变量本身,还有一些关于为该变量存储的类型的信息吗?
答案 0 :(得分:4)
变量本身并不包含有关其包含内容的任何信息。相反,C ++使用其编译步骤执行各种验证步骤,以确保在运行时一切正常。
如果我有以下功能,请简单地说:
double convert(int32_t num)
{
return static_cast<double>(num);
}
它编译成一个过程,该过程采用其唯一参数并执行32位整数到64位浮点转换。如果你给它一个32位的浮点数,它就会做错误的事情。
但是类型系统确保调用convert
的任何人提供32位整数(注意编译器可能会在某些情况下代表您插入转换,但该函数只能看到32位整数)因此,不需要运行时检查您提供的内容实际上是32位整数。
类型系统当然在编译时存在,并且会非常仔细地跟踪。请看以下示例:
int32_t x = 12;
double y = convert(x);
编译器视图包括x
为int32_t
,convert
为int32_t
并返回double
,y
为一个double
。由于这些都是排队的,因此无需转换即可成功编译。相反:
char* x = "12";
double y = convert(x);
无法编译,因为char *
与int32_t
不同(且不可转换)。
答案 1 :(得分:1)
C ++被设计为编译的语言。这意味着编译器在编译时执行语言规范所需的任何检查。这种检查所需的一切都由编译器存储在编译器的内部数据结构中。这些数据结构仅在编译期间存在。
将C ++代码成功编译为可执行代码后,即可完成所有检查。什么都不存储了。什么都没有被检查。
换句话说,C ++语言中的类型安全检查是静态。
此原则的唯一例外是dynamic_cast
的功能,它可以执行某些运行时(动态)类型检查。为此,存储一些运行时类型信息(RTTI)确实是必要的。通过typeid
将相同的数据用于运行时类型识别。但这是一个单独的主题,它并没有真正覆盖C ++中的常规类型检查本质上是 static 的事实。