显式类型转换的要求

时间:2011-08-30 16:19:42

标签: c++ type-conversion

对于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完成的显式类型转换是否需要转换函数?

3 个答案:

答案 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;
}

在您的示例中,静态广告无效,因为hwndvoid *wordunsigned short。对于c ++强制转换,任何类型都可以被视为一个类;

reinterpret_cast的作品始终。它只是一个二进制副本