是什么的static_cast <>和C风格的铸造之间的区别?(What is the

2019-08-31 11:54发布

没有任何理由,更喜欢static_cast<>对C风格的铸造? 他们是等价? 是他们的任何种类的速度差?

Answer 1:

C ++风格的转换是由编译器检查。 ç风格转换不会也在运行时失败

同时,C ++风格的转换可以搜索容易,而这真的很难搜索对于C风格的转换

另一大好处是,在4个不同的C ++风格的转换表达了程序员的意图更清晰。

当写C ++我倒是几乎总是使用C ++的人过的空调风格。



Answer 2:

总之

  1. static_cast<>()给你一个编译时检查能力,C样式转换没有。
  2. static_cast<>()是更具有可读性和可一个C ++源代码内的任何地方容易地发现,C_Style投is'nt。
  3. 意图是用C ++强制转换传达好得多。

更多的解释

静态浇铸进行兼容的类型之间的转换。 它类似于C风格的演员,而是更加严格。 例如,C样式转换将允许整数指针指向一个炭。

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

因为这导致在一个4个字节的指针(指针4字节的数据类型)指向1个字节分配的存储器,写入该指针将或者导致运行时间错误,或者将覆盖一些相邻存储器。

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

与此相反的C样式转换,静态投将让编译器检查指针和指针对象数据类型是兼容的,它允许程序员在编译期间赶上这不正确指针赋值。

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

您还可以在更多的解释检查此页面上的C ++转换: 点击这里



Answer 3:

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!
}


Answer 4:

见的C ++转换运算符的比较 。

然而,使用相同的语法,适用于各种不同的铸造操作可以使程序员的意图尚不清楚。

此外,它可以是很难找到一个大的代码库特定类型的演员。

在C样式转换的普遍性可以矫枉过正,所有需要的是一个简单的转换情况。 的能力,不同程度的电力的几种不同的铸造运营商之间进行选择,可以防止程序员无意中铸造类型不正确。



Answer 5:

static_cast在编译时该转换不是很明显不兼容的类型之间的检查。 相反, dynamic_cast ,不检查是否兼容类型在运行时完成。 此外, static_cast转换不一定是安全的。

static_cast用于从指针转换为基类的指针的派生类,或天然类型,例如枚举之间整数或浮点数为int。

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

C风格的转换并不在编译或运行时进行任何检查。



Answer 6:

由于有许多不同种类的铸件各有不同的语义,的static_cast的<>让你说:“我正在做从一种类型的法律转换为另一种”像从int翻番。 一个普通的C样式转换可能意味着很多东西。 你向上/向下铸造? 你重新诠释的指针?



Answer 7:

一个伟大的帖子在C / C ++解释不同类型转换,什么C样式转换确实: https://anteru.net/blog/2007/12/18/200/index.html

C-样式铸造,使用(类型)变量语法。 最糟糕的发明过。 这将尝试做以下类型转换,顺序如下:(见C ++标准,5.4 expr.cast第5款)

  1. const_cast会
  2. 的static_cast
  3. 的static_cast随后的const_cast
  4. reinterpret_cast的
  5. 通过const_cast会reinterpret_castfollowed


文章来源: What is the difference between static_cast<> and C style casting?