对于static_cast
,除非存在内置类型转换功能,否则您无法使用static_cast
执行转换。但是,考虑到返回类型有效,您可以为类型执行reinterpret_cast
。
int main()
{
WORD word;
HWND hwnd = static_cast<HWND>(word); // error
HWND hwnd = reinterpret_cast<HWND>(word); // ok, considering a valid handle is returned.
}
与reinterpret_cast不同,使用static_cast完成的显式类型转换是否需要转换函数?
答案 0 :(得分:2)
reinterpret_cast
只允许您转换完全不相关的类型。它只是将内存块视为另一种类型。所以使用它是非常不安全的,因为它不会给你任何编译或运行时错误但只是导致(通常)崩溃
static_cast
提供演员有效性的编译时间检查。如果某个类型不能被视为另一种类型,则static_cast
会在尝试强制转换时给出编译时错误。
它在类型之间进行隐式转换(例如int到float,或者指向void *),它也可以调用显式转换函数(或隐式转换函数)。
所以你可以说它可以进行隐式转换,其中存在隐式转换内置函数。如果这是混乱,它通常被认为是c型铸造的替代品。
答案 1 :(得分:0)
在转换指针和引用时,C ++强制转换最有意义。
具体例子
void foo (Base & b) {
if (b .is_a_Foo ())
static_cast <Foo &> (b) .bar ();
else
b .do_default_bar ();
dynamic_cast <Baz &> (b) .something (); // throws if invalid conversion
}
char data [4];
* reinterpret_cast <float *> (data) = 1.23;
Windows API从上到下是一个可怕的黑客 - 在你的例子中,reinterpret_cast忠实于原始的意图(并强调它让世界钦佩),它基本上意味着“抛弃类型系统并使用原始位:相信我“。
答案 2 :(得分:0)
基本上static_cast
为目标类型的兼容类大小分配内存,并用可能的填充,但是没有任何检查新对象完成。让我举个例子:
class A {
public:
int a;
};
class B : public A {
public:
int c;
int b;
};
int main()
{
A *a = new A;
a->a = 5;
B *b = new B;
b->a = 6;
b->b = 7;
b->c = 8;
B* bb = static_cast<B*>(a);
A* aa = static_cast<A*>(b);
cout << bb->a << endl; // 5
cout << bb->b << endl; // scrap value from memory
// member b was not initialized, because it was not found in A
cout << aa->a << endl; // 6
return 0;
}
在您的示例中,静态广告无效,因为hwnd
为void *
而word
为unsigned short
。对于c ++强制转换,任何类型都可以被视为一个类;
reinterpret_cast的作品始终。它只是一个二进制副本