📜  cpp 中的类型转换 - C++ (1)

📅  最后修改于: 2023-12-03 15:00:03.074000             🧑  作者: Mango

C++ 中的类型转换

在 C++ 中,存在多种类型转换方式,如显式类型转换、隐式类型转换、reinterpret_cast、const_cast、dynamic_cast 等。本文将逐一介绍这些类型转换方式以及它们的使用场景。

显式类型转换

显式类型转换是指使用强制类型转换符将一个数据类型转换成另一种数据类型。

在 C++ 中,有以下四种显式类型转换:

  • static_cast
  • dynamic_cast
  • reinterpret_cast
  • const_cast
static_cast

static_cast 用于将一个表达式强制转换为某种类型,但是不能进行动态类型检查或是运行时检查。我们通常使用 static_cast 将一个较小的数据类型转换成一个较大的数据类型,以避免数据精度丢失。

double d = 123.456;
int i = static_cast<int>(d);
dynamic_cast

dynamic_cast 用于将一个指向基类的指针或引用转换成派生类的指针或引用。它会进行运行时类型检查,如果转换失败则返回 NULL 指针或引用。使用 dynamic_cast 转换时需要保证基类中存在虚函数。

class Base {
public:
    virtual void print() {}
};

class Derived : public Base {};

Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
reinterpret_cast

reinterpret_cast 用于进行底层的数据类型转换,它将一种类型转换成另一种没有关联的类型,如将一个整型强制转换成一个指针类型。

int i = 42;
void* ptr = reinterpret_cast<void*>(&i);
const_cast

const_cast 用于将一个常量变量转换成非常量类型,以便可以对其进行修改。需要注意的是,这里的“修改”并不包括对 const 变量本身的修改,而只是对它所引用对象的修改。

const int val = 10;
int& ref = const_cast<int&>(val);
ref = 20;  // 这里只是修改了 ref 所引用的对象,val 的值并未改变
隐式类型转换

隐式类型转换是指在表达式中,如果参与运算的两个数据类型不一致,则会自动进行类型转换。

在 C++ 中,存在如下几种隐式类型转换。

数字类型转换

当两个不同的数字类型参与运算时,通常会自动将它们转换成较大的那种类型。

int i = 1;
double d = 0.1;
double result = i + d;  // 自动将 i 转换成 double 类型进行计算
自动类型转换

可以通过赋值语句进行自动类型转换,将右侧的数据类型转换成左侧的数据类型。当右侧的数据类型比左侧更小的时候,可能会发生数据精度的丢失。

double d1 = 1.23;
int i1 = d1;  // 将 d1 转换成 int 类型,可能会造成数据精度的丢失
int i2 = 42;
char c = i2;  // 将 i2 转换成 char 类型,只会取 i2 的最后 8 位
单向类型转换

单向类型转换是指将一个子类的指针或引用转换成一个指向父类的指针或引用。在 C++ 中,这种转换是自动的,不需要使用任何操作符。

class Base {};

class Derived : public Base {};

Derived d;
Base& b = d;
小结

本文介绍了 C++ 中的多种类型转换方式,包括显式类型转换和隐式类型转换。在实际开发中,需要结合具体的场景来选择合适的类型转换方式。