C ++铸造操作员和传统的C铸造操作员
可能重复:
什么时候应该使用static_cast,dynamic_cast和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));
编写上面的代码去除const
和unsigned
在C ++中非常复杂? 那么为什么人们使用reinterpret_cast
, const_cast
或static_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