C ++铸造操作员和传统的C铸造操作员

可能重复:
什么时候应该使用static_cast,dynamic_cast和reinterpret_cast?

我做了大量的搜索以查找关于:

  • 为什么要使用C ++铸造操作符而不是传统的C样式铸造操作符?
  • 何时使用C ++转换运算符,一些实例?
  • 以下是我发现的:

  • 传统上,任何C ++铸造操作符都用于更好地维护您的代码(即),与C风格铸造操作符不同,我们可以通过仅搜索复杂表示法(reinterpret_cast <)来轻松找到在代码中使用铸造的位置。
  • 现在让我简要说明为什么和何时为每个C ++铸造操作员

    的static_cast:

    为什么使用它在C风格铸造? static_cast用于执行相关类型之间的转换。

    例子 :

     Class A {};
     Class B {};
    
     A* a = new A();
     B* b = static_cast<B*>(a); // Compiler error
     B* b1 = (A*)a;  // Works fine
     float f;
     int addr = (int)(&f); // Works fine
     int addr = static_cast<int>(&f);  // Compiler error
    

    但是我想知道何时使用上述代码的真实用例?

    reinterpret_cast:

    reinterpret_cast将指针指向不相关的类型。

    例子:

     Class A {};
     Class B {};
    
     A* a = new A();
     B* b = reinterpret_cast<B*>(a); // Works fine
     B* b1 = (A*)a;  // Works fine
     float f;
     int addr = (int)(&f); // Works fine
     int addr = reinterpret_cast<int>(&f);  // Works fine
    
    
     int ai = 10;
     float af = 13.33;
     // Would depend on how floating point is stored in machine
     // int& since reinterpret_cast expects either the type or operand to be pointer or reference 
     int ki = reinterpret_cast<int&>(af); // ki would not be 13
     int kitemp = (int)af; // kitemp would be 13
    
     // The same reinterpret_cast behaviour can be achieved using this,
     int* in = (int*)(af);
     cout << (*in);
    

    我的问题是reinterpret_cast与C风格铸造有什么不同? 我无法找到与传统铸造操作员一起使用它的原因,以及何时使用它?

    另一个使这些运营商变得更糟的重要例子是:

       const unsigned int * p;
       (int*)p; // Would remove unsigned and const at one shot
       // Using C++ casting operators
       // Const_cast expects a pointer or a reference
       reinterpret_cast<int*>(const_cast<unsigned int* >(p));
    

    编写上面的代码去除constunsigned在C ++中非常复杂? 那么为什么人们使用reinterpret_castconst_caststatic_cast不是传统的C casting操作符?

    我了解dynamic_cast用于多态类的情况; 这个运营商也有额外的RTTI费用。


    Google的C ++风格指南为使用C ++风格强制转换提供了一些动机:

    C剧组的问题是操作的模糊性; 有时你正在做一个转换(例如, (int)3.5 ),有时你正在进行转换(例如, (int)"hello" ); C ++强制避免这种情况。 此外,C ++强制转换在搜索时更为明显。

    我喜欢C ++类型转换,因为它们可以非常明确地完成你想做的事情,从而允许编译器捕捉不正确的用法。

    例如,如果您知道您只打算对整数进行数字转换,则只有在数值转换有意义时, static_cast才会进行编译。 正如您在示例代码中所展示的,C风格转换将执行转换,而不管其有效性。

    C ++类型转换实际上只是为了更好地表达意图,以及编译时防止意外使用。


    删除const限定符是不好的做法。 您可能最终会写入您不应写入的内存变量或区域。 因此,你的问题的一部分无效。


    从我的记忆中,reinterpret_cast与c风格演员几乎是相同的,除非我认为如果你有一个const Thing你不能reinterpret_cast noncost_other_thing(c stye让你删除它们,这可能不是故意的,可能是危险的)。

    我只在自己的项目中使用c语言,因为我有懒惰的奢侈,有时我不会懒惰。 在使用C ++时,你'假设'使用C ++风格的转换和其他C ++特性(ostream而不是文件,没有printf,避免memset和其他不安全的函数等)。 但大多数人只是做他们想做的事情(并因此而得到错误)。

    通常情况下,如果您知道何时使用dynamic_cast和静态转换,您将会很好。 我发现reinterpret_cast不可能,除非我与C接口并需要使用void *。 const_cast ...我从来没有使用过,希望我永远不需要。 你应该“总是使用它们。

    PS:无关注。 我实际上抛出异常并断言(0)未实现的东西。 如果我不处理一个参数,并期望它是一个0我会写一个异常或断言检查。 当我调试/添加更多的代码,我碰到这些而不是bug和theres绝对没有神秘为什么它发生:)

    链接地址: http://www.djcxy.com/p/28697.html

    上一篇: C++ Casting Operators and traditional C casting operators

    下一篇: Best practice in C++ for casting between number types