显式类型转换

时间:2010-06-02 18:54:51

标签: c++ types explicit

我在一本书中读到了这一点:

//: C03:SimpleCast.cpp
int main() {
int b = 200;
unsigned long a = (unsigned long int)b;
} ///:~

“施放是强大的,但它可能会导致头痛,因为在某些情况下 这种情况迫使编译器将数据视为(对于 实例)比实际大,所以它会占用更多的空间 记忆;这可以践踏其他数据。这通常会发生 在投射指针时,而不是在制作像这样的简单投射时 如上所示。“

现在请你提供一个示例,其中转换指针可以践踏其他数据吗?

4 个答案:

答案 0 :(得分:5)

int main(void)
{
    short int a = 5;
    short int b = 7;
    *(long int*)&a = 0;
}

假设sizeof(long) > sizeof(short),假设编译器在a之前将b放在堆栈上,b将被删除。

答案 1 :(得分:1)

int main() { 
    char a[] = "This is a string.";

    *(long *)a = 12345678;  // will typically overwrite first four or eight bytes of a.

    std::cout << a;
    return 0;
}

答案 2 :(得分:0)

char unix[5]="unix";
char* first= &(unix[0]);
int * intptr= (int*) first;
*first=64;
printf("%s\n",unix); /* prints @ /*

答案 3 :(得分:0)

由于这被标记为C ++,而不是C,我还建议您阅读C样式转换的C ++样式转换:

static_cast<Derived *>(pBase)->DMethod();
if (dynamic_cast<Derived *>(pBase)) dynamic_cast<Derived *>(pBase)->DMethod();
const_cast<CRect &>(constRect).x = 3;
int *pInt = reinterpret_cast<int *>(charbuff);

我强烈推荐Scott Myer的书“Effective C ++,55改进你的程序和设计的具体方法”,第3版非常好地解释了这些。确保你获得第3版,尽管第2版也可能包含C ++样式。

基本上,如果您使用C ++并且您的编译器是在过去10年内编写的,那么绝对不要使用C风格的强制转换。使用C ++样式转换。