MST

星途 面试题库

面试题:C++中static_cast的使用场景及注意事项

请详细阐述C++中static_cast的常见使用场景,并说明在使用它时需要注意哪些方面,同时给出至少两个不同场景下使用static_cast的代码示例。
24.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

常见使用场景

  1. 基本数据类型转换:用于将一种基本数据类型转换为另一种基本数据类型,例如将int转换为float,或者float转换为int等。
  2. 指针类型转换:在具有继承关系的类之间进行指针类型转换,例如将派生类指针转换为基类指针,或者在没有多态的情况下将基类指针转换为派生类指针(这种转换存在风险,需谨慎使用)。
  3. void*指针转换为其他类型指针:在需要将通用指针void*转换为特定类型指针时使用。

使用注意事项

  1. 安全性static_cast不进行运行时类型检查,所以在进行指针类型转换时,如果转换不正确,可能会导致未定义行为,特别是在将基类指针转换为派生类指针时。
  2. 数据丢失:在基本数据类型转换时,如将浮点数转换为整数,可能会发生数据截断,丢失小数部分。

代码示例

基本数据类型转换

#include <iostream>

int main() {
    int numInt = 10;
    float numFloat = static_cast<float>(numInt);
    std::cout << "将int转换为float: " << numFloat << std::endl;

    float floatValue = 10.5f;
    int intValue = static_cast<int>(floatValue);
    std::cout << "将float转换为int: " << intValue << std::endl;

    return 0;
}

指针类型转换(派生类指针转基类指针)

#include <iostream>

class Base {
public:
    virtual void print() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Derived* derivedPtr = new Derived();
    Base* basePtr = static_cast<Base*>(derivedPtr);
    basePtr->print();

    delete derivedPtr;
    return 0;
}