作者:
2016年5月15日 (最后更新:2016年5月16日)

C++ 类型转换

评分:4.0/5 (472 票)
*****
类型转换(Casting)是一个转换过程,通过该过程,数据可以从一种类型更改为另一种类型。C++ 有两种类型的转换:

隐式转换:由编译器自动执行的转换,无需程序员干预。

例如
1
2
int iVariable = 10;
    float fVariable = iVariable; //Assigning an int to a float will trigger a conversion.  


显式转换:仅在程序员明确指定时才执行的转换。

例如
1
2
int iVariable = 20;
    float fVariable = (float) iVariable / 10;



在 C++ 中,有四种类型的转换运算符。
1
2
3
4
- static_cast
- const_cast
- reinterpret_cast
- dynamic_cast

在本文中,我们将只探讨前三种转换运算符,因为 dynamic_cast 非常不同,几乎只用于处理多态性,这不在本文的讨论范围之内。

static_cast
格式
static_cast<类型>(表达式);
例如
float fVariable = static_cast<float>(iVariable); /* 该语句将 int 类型的 iVariable 转换为 float 类型。*/

看一眼上面的代码,你会立刻明白这次类型转换的目的,因为它非常明确。static_cast 告诉编译器尝试在两种不同的数据类型之间进行转换。它可以在内置类型之间转换,即使会损失精度。此外,static_cast 运算符还可以在相关的指针类型之间进行转换。

例如
1
2
3
4
int* pToInt = &iVariable;
    float* pToFloat = &fVariable;
    
    float* pResult = static_cast<float*>(pToInt); //Will not work as the pointers are not related (they are of different types).  



const_cast
格式
const_cast<类型>(表达式);
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void aFunction(int* a)
{
    cout << *a << endl;
}

int main()
{
    int a = 10;
    const int* iVariable = &a;
    
    aFunction(const_cast<int*>(iVariable)); 
/*Since the function designer did not specify the parameter as const int*, we can strip the const-ness of the pointer iVariable to pass it into the function. 
Make sure that the function will not modify the value. */

    return 0;
} 



const_cast 可能是最少使用的转换运算符之一,它不在不同类型之间进行转换,而是改变表达式的“常量性”(const-ness)。它可以将非 const 的内容变为 const,也可以通过去除 const 使其变为 volatile/可变的。一般来说,你不会想在程序中使用这种特定的转换。如果你发现自己正在使用这个转换,你应该停下来重新思考你的设计。

reinterpret_cast
格式
reinterpret_cast<类型>(表达式);

reinterpret_cast 可以说是最强大的转换运算符之一,它可以将任何内置类型转换为任何其他类型,也可以将任何指针类型转换为另一种指针类型。但是,它不能去除变量的常量性或易变性(volatile-ness)。然而,它可以不顾类型安全或常量性,在内置数据类型和指针之间进行转换。这种特定的转换运算符只应在绝对必要时使用。


希望本文对任何正在努力理解类型转换理论的人有所帮助。

编程愉快。