static_cast<>和C风格的铸造?

是否有任何理由更喜欢static_cast<>而不是C风格的强制转换?它们相等吗?速度有什么不同吗?

134692 次浏览

由于存在许多不同类型的强制转换,每种类型都具有不同的语义,因此static_cast<>允许您说“我正在进行从一种类型到另一种类型的合法转换”,例如从int型到double型。简单的c风格强制转换可能意味着很多事情。你在上/下选角吗?你是在重新解释指针吗?

c++样式转换由编译器检查。C风格强制转换在运行时不会失败,也可能失败。

此外,c++样式转换可以很容易地搜索到,而c样式转换则很难搜索到。

另一个很大的好处是,4种不同的c++风格类型转换更清楚地表达了程序员的意图。

在写c++的时候,我几乎总是使用c++风格,而不是C风格。

看到c++强制转换操作符的比较

但是,对各种不同的强制转换操作使用相同的语法可能会使程序员的意图不明确。

此外,在大型代码库中很难找到特定类型的强制转换。

对于只需要简单的转换的情况,c风格强制转换的通用性可能太过了。在几个不同功能程度的强制转换操作符之间进行选择的能力可以防止程序员无意中强制转换为不正确的类型。

简而言之:

  1. static_cast<>()给你一个编译时检查能力,c风格 李不。< / >
  2. static_cast<>()可读性更好,也更容易被发现 在c++源代码的任何地方,C_Style强制转换为'nt.
  3. 使用c++类型转换可以更好地传达意图。

更多的解释:

静态强制转换执行兼容的类型之间的转换。它类似于c风格的强制转换,但限制更大。例如,c风格的强制转换将允许整数指针指向char类型。

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

由于这将导致指向4字节类型的指针,指向已分配内存的1字节,因此写入此指针将导致运行时错误或覆盖一些相邻内存。

*p = 5; // run-time error: stack corruption

与c风格的强制转换相反,静态强制转换将允许编译器检查指针和被指针数据类型是否兼容,这允许程序员在编译期间捕获错误的指针赋值。

int *q = static_cast<int*>(&c); // compile-time error

你也可以查看本页关于c++类型转换的更多解释:点击这里

struct A {};
struct B : A {};
struct C {};


int main()
{
A* a = new A;


int i = 10;


a = (A*) (&i); // NO ERROR! FAIL!


//a = static_cast<A*>(&i); ERROR! SMART!


A* b = new B;


B* b2 = static_cast<B*>(b); // NO ERROR! SMART!


C* c = (C*)(b); // NO ERROR! FAIL!


//C* c = static_cast<C*>(b); ERROR! SMART!
}

static_cast在编译时检查转换是否在明显不兼容的类型之间。与dynamic_cast相反,在运行时不会检查类型兼容性。而且,static_cast转换并不一定安全。

static_cast用于从指向基类的指针转换为指向派生类的指针,或在原生类型之间转换,例如enum到int或float到int。

static_cast的用户必须确保转换是安全的。

c风格的强制转换不执行任何检查,无论是在编译时还是在运行时。

一个很好的帖子,解释了C/ c++中不同的类型转换,以及C风格的类型转换到底做什么:https://anteru.net/blog/2007/12/18/200/index.html

C-Style强制转换,使用(type)变量语法。有史以来最糟糕的 发明。它尝试执行以下强制类型转换,顺序如下:(参见 c++标准,5.4 expr。第5段)

  1. const_cast
  2. static_cast
  3. Static_cast后面跟着const_cast
  4. reinterpret_cast
  5. reinterpret_cast后面跟着const_cast