面试题答案
一键面试- 语法差异:
- 指针:对指针进行类型转换时,直接在指针变量前使用类型转换运算符。例如:
int *pInt = new int(5); double *pDouble = static_cast<double*>(pInt); // 用static_cast将int* 转换为double*,这是不安全的,只是示例语法
- 引用:引用在声明时就已经确定了类型,对引用进行类型转换需要在引用所绑定的对象前使用类型转换运算符。例如:
int num = 5; int &refInt = num; double &refDouble = static_cast<double&>(refInt); // 用static_cast将int& 转换为double&,这也是不安全的,只是示例语法
- 安全性差异:
- 指针:指针类型转换相对灵活,
reinterpret_cast
可以进行任意类型指针的转换,即使这种转换在逻辑上不合理,很容易导致未定义行为。例如:
int num = 10; int *pInt = # char *pChar = reinterpret_cast<char*>(pInt); // 此时通过pChar访问数据可能导致未定义行为,因为内存解释方式改变了
- 引用:因为引用在初始化后不能重新绑定,所以在类型转换时,使用
static_cast
会更受限制。reinterpret_cast
对引用的使用同样可能导致未定义行为,但由于引用的特性,相对指针来说,滥用的场景会少一些。例如:
int num = 10; int &refInt = num; char &refChar = reinterpret_cast<char&>(refInt); // 这样的转换极其危险,会导致未定义行为,因为改变了内存解释方式
- 指针:指针类型转换相对灵活,
- 可空性差异:
- 指针:指针可以为空指针(
nullptr
),在进行类型转换时,如果原指针为空,转换后的指针也为空,不会有运行时错误。例如:
int *pInt = nullptr; double *pDouble = static_cast<double*>(pInt); // pDouble 也是nullptr,不会引发运行时错误
- 引用:引用必须绑定到一个有效的对象,不存在空引用。所以在类型转换时,如果原引用绑定的对象无效,转换时同样会导致未定义行为。例如:
int *pInt = nullptr; // int &refInt = *pInt; // 这行代码会导致未定义行为,因为试图引用空指针 // 假设已有合法引用 int num = 10; int &refInt = num; double &refDouble = static_cast<double&>(refInt); // 如果refInt 不合法,这里转换会导致未定义行为
- 指针:指针可以为空指针(