类型转换(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)。然而,它可以不顾类型安全或常量性,在内置数据类型和指针之间进行转换。这种特定的转换运算符只应在绝对必要时使用。
希望本文对任何正在努力理解类型转换理论的人有所帮助。
编程愉快。