static_cast 的部分用法

本文深入探讨了C++中类继承的概念及其应用,并详细解析了强制类型转换的不同场景,包括实例和代码示例,旨在帮助开发者更好地理解和运用这一高级特性。
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string>
#include <stack>
#include <utility>
#include <map>
using namespace std;

class CBaseX
{
public:
    int x;
    CBaseX() 
    { 
        x = 10; 
    }
    void foo() 
    { 
        printf("CBaseX::foo() x=%d ", x); 
    }
};

class CBaseY
{
public:
    int y;
    int* py;
    CBaseY() 
    { 
        y = 20; 
        py = &y; 
    }
    void bar() 
    { 
        printf("CBaseY::bar() y=%d, *py=%d ", y, *py); 
    }
};
class CDerived : public CBaseX, public CBaseY
{
public:
    int z;
};

void main()
{
	/*
    int a = 100;
    float b = 12.324;
    a = static_cast<int>(b); //正确.成功将 float 转换成了 int
    cout<<a<<endl;
	*/

	/*
	int a = 100;
    int *p = &a;
    //float *b = static_cast<float*>(p); //错,这里不能将int*转换成float*
	float c = static_cast<float>(a);  // 正确
	cout << c << endl;
	*/

	/*
    int a = 100;
    void *p = &a;
    float *b = static_cast<float*>(p); //正确.可以将void*转换成float*
    CBaseX *pX = new CBaseX();
    //CBaseY *pY1 = static_cast<CBaseY*>(pX); //错误,不能将CBaseX*转换成CBaseY*
	*/


    CBaseX *pX = new CBaseX();
    CBaseY *pY1 = reinterpret_cast<CBaseY*>(pX); //正确. “欺骗”编译器
    pY1->bar(); //崩溃
	
	//正如我们在泛型例子中所认识到的,如果你尝试转换一个对象到另一个
	//无关的类static_cast<>将失败,而reinterpret_cast<>就总是成功“欺骗”
	//编译器:那个对象就是那个无关类
}




                
### `static_cast` 的具体用法和使用场景 `static_cast` 是 C++ 中最常用且相对安全的类型转换操作符之一,适用于在编译时已知的、具有明确转换关系的类型之间进行转换。它不依赖运行时类型检查,因此在性能上优于 `dynamic_cast`,但其安全性也相对较低。 #### 基本数据类型之间的转换 `static_cast` 可用于在基本数据类型之间进行显式转换,例如将 `double` 转换为 `int`、`float` 转换为 `char` 等。这种转换通常用于数值类型之间的显式转换,并且可以避免隐式转换可能带来的警告或错误。 ```cpp double d = 3.14; int i = static_cast<int>(d); // i 的值为 3 ``` #### 指针类型之间的向上转型(Upcasting) 在类继承层次结构中,`static_cast` 可用于将派生类指针或引用转换为基类指针或引用。这种转换称为向上转型(upcasting),是安全的,因为派生类对象包含完整的基类子对象。 ```cpp class Base {}; class Derived : public Base {}; Derived d; Base* basePtr = static_cast<Base*>(&d); // 合法且安全 ``` #### 指针类型之间的向下转型(Downcasting) 虽然 `static_cast` 也可以用于将基类指针转换为派生类指针(即向下转型),但这种转换不会进行运行时类型检查,因此不如 `dynamic_cast` 安全。只有在确保目标对象确实是目标类型时才应使用 `static_cast` 进行向下转型。 ```cpp Base* basePtr = new Derived(); Derived* derivedPtr = static_cast<Derived*>(basePtr); // 不安全,除非确保 basePtr 实际指向 Derived 对象 ``` #### 用户自定义类型转换 `static_cast` 可用于调用类的构造函数或类型转换运算符,实现用户定义的类型转换。例如,一个类可以定义从 `int` 到该类的隐式或显式转换构造函数,此时 `static_cast` 可以用于执行该转换。 ```cpp class MyClass { public: MyClass(int value) : m_value(value) {} operator int() const { return m_value; } private: int m_value; }; MyClass obj = static_cast<MyClass>(42); // 调用构造函数 int value = static_cast<int>(obj); // 调用转换运算符 ``` #### 枚举与整型之间的转换 `static_cast` 可用于在枚举类型与整数类型之间进行转换。这在处理底层接口或状态码时非常常见。 ```cpp enum class Color { Red, Green, Blue }; int colorInt = static_cast<int>(Color::Green); // colorInt 的值为 1 ``` #### 注意事项 - `static_cast` 不会移除 `const` 或 `volatile` 属性,若需修改这些属性,应使用 `const_cast`。 - 它不能用于不相关的指针类型之间的转换,例如将 `int*` 转换为 `char*`,这种低级转换应使用 `reinterpret_cast`。 - 使用 `static_cast` 进行向下转型时,必须确保对象的实际类型与目标类型一致,否则行为未定义[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值