C++中类型转换何时会发生?
·
隐式类型转换
隐式类型转换由编译器自动执行,通常发生在以下场景:
- 赋值操作:将一种类型的值赋给另一种类型的变量时。
- 算术运算:操作数类型不同时,较小的类型会被提升为较大的类型。
- 函数调用:实参与形参类型不匹配时,实参会被转换为形参类型。
- 返回值:函数返回类型与声明类型不一致时。
示例代码:
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;
};
更多推荐
所有评论(0)