隐式类型转换

隐式类型转换由编译器自动执行,通常发生在以下场景:

  • 赋值操作:将一种类型的值赋给另一种类型的变量时。
  • 算术运算:操作数类型不同时,较小的类型会被提升为较大的类型。
  • 函数调用:实参与形参类型不匹配时,实参会被转换为形参类型。
  • 返回值:函数返回类型与声明类型不一致时。

示例代码:

int i = 3.14; // double隐式转为int
double d = i; // int隐式转为double

显式类型转换(C风格)

通过强制转换运算符实现,包括:

  • (type)expression:传统C风格转换。
  • 可能引发未定义行为,例如指针类型不匹配时。

示例代码:

double d = 3.14;
int i = (int)d; // 显式截断小数部分

static_cast

用于编译时明确的类型转换:

  • 基本类型之间的转换(如int到double)。
  • 派生类指针到基类指针的上行转换。
  • 无多态类型的下行转换(可能不安全)。

示例代码:

float f = static_cast<float>(3.14);
Base* b = static_cast<Base*>(derived_ptr);

dynamic_cast

专门用于多态类型的运行时类型检查:

  • 下行转换时检查安全性,失败返回nullptr(指针)或抛出异常(引用)。
  • 要求基类至少有一个虚函数。

示例代码:

Derived* d = dynamic_cast<Derived*>(base_ptr);
if (d) { /* 转换成功 */ }

const_cast

用于修改类型的const或volatile限定符:

  • 常用于移除const属性(需谨慎使用)。
  • 不能改变实际类型。

示例代码:

const int ci = 10;
int* mod = const_cast<int*>(&ci);

reinterpret_cast

低级别的重新解释转换:

  • 用于指针与整数、无关指针类型间的转换。
  • 高度依赖平台,可能引发未定义行为。

示例代码:

intptr_t addr = reinterpret_cast<intptr_t>(ptr);

用户定义转换

通过重载转换运算符实现:

  • 类中定义operator type()成员函数。
  • 可以控制自定义类型与其他类型的转换行为。

示例代码:

class MyInt {
public:
    operator int() const { return value; }
private:
    int value;
};

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐