• 2022.8.3 C++——C++类型转换方式1(static_cast)


    static_cast

    用法: static_cast(expression)
    说明:该运算符把expression转换为type_name类型,static_cast在编译时使用类型信息执行转换,在转换执行必要的检测(如指针越界计算,类型检查等),但没有运行时类型检查来保证转换的安全性。
    使用范围:

    1 用于基本类型间的转换,如把int转换成char,把int转换成enum

    enum WeekType {sun=0,mon=1,thus=2,wed=3,thurs=4,fir=5,sat=6};
    int main()
    {
    	int main()
    {
    	int a = 10;
    	cout << a << endl;
    	char ch = 'x';
    	cout << ch << endl;
    	double dx = 12.23;
    	cout << dx << endl;
    	a = static_cast<int>(ch);
    	cout << a << endl;
    	a = static_cast<int>(dx);
    	cout << a << endl;
    	WeekType x = mon;
    	a = x;
    	cout << a << endl;
    	x = static_cast<WeekType>(a);
    	cout << x << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这个代码中,转换的都有:将ch转换为int类型,dx转换为int类型,a转换为枚举类型,这些都是基本类型间的转换。
    输出结果为:
    在这里插入图片描述
    注意,其中的x转换成int类型后,打印的是其ASII值

    2 指针转换的限制

    int main()
    {
    	int a = 10;
    	int* p = &a;
    	int* s = static_cast<int*>(&a);
    	//指针转换的限制
    	const int* cp = &a;
    	s = static_cast<int*>(cp);//error
    	char* dp = static_cast<char*>(p);//error
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:
    s = static_cast(cp)错误,是因为static_cast不能转换掉const属性(包括volatile);
    char* dp = static_cast§错误,是因为指针p是int类型,而要转换成char类型,这是不允许的。

    3 可以将void*转换为其他类型

    int main()
    {
    	int a = 10;
    	int* ip = nullptr;
    	double* dp = nullptr;
    	void* vp = &a;
    	ip = static_cast<int*>(vp);
    	dp = static_cast<double*>(vp);
    	return 0;
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:
    在这里插入图片描述

    4 弃值表达式

    int main()
    {
    	int a = 10;
    	int b = 20;
    	static_cast<void>(a + b);
    
    	return 0;	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    5 左值转到右值

    int main()
    {
    	int a = 10;
    	int &x = a;
    	int&& rx = a;//error
    	int&& rx = static_cast<int&&>(a);
    
    	return 0;	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码中&& rx = a错误是因为,一个&加变量rx是引用,两个&加变量rx就变成了右值,右值就是不能取地址的值(不能修改的值),如果一意将一个左值a给rx,这是不行的。
    但是可以用static_cast将左值转换成右值,即int&& rx = static_cast(a)。

    6 用于类层次结构中基类和派生类之间指针或引用的转换

    class Object
    {
    private:
    	int value;
    public:
    	Object(int x=0):value(x) { }
    	void func() { }
    };
    class Base :public Object
    {
    private:
    	int num;
    public:
    	Base(int x = 0) :Object(x + 10), num(x) { }
    	void show() const { }
    };
    int main()
    {
    	Object* op = nullptr;
    	Base* bp = nullptr;
    	Base base;
    	Object obj;
    	op = &obj;
    	bp = &base;
    	op = static_cast<Object*>(&base);
    	bp = static_cast<Base*>(&obj);//不安全
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    代码中出现了上行转换和下行转换,即上行转换为把派生类的指针或引用转换为基类表示,下行转换为把基类的指针或引用转换为派生类表示,注意上行转换是安全的,下行转换没有动态类型检查,是不安全的。
    在这里插入图片描述
    注意:
    隐式执行任何类型的转换都可由static_cast显示完成,但是static_cast不能转换掉表达式含有const,volatile或者_unaligned属性。

  • 相关阅读:
    全景房屋装修vr可视化编辑软件功能及特点
    linux下定位内存泄漏 /proc/pid/status 解释
    tdk-lambda电源主要应用
    startService启动服务,应用置于后台超过1min,服务被销毁
    矩阵置零
    CSRF 攻击详解
    有什么软件能实现erp、crm、oa、财务系统一体化?
    【开源】基于SpringBoot的农村物流配送系统的设计和实现
    vue-router入门学习3
    算法刷题第一天:二分查找
  • 原文地址:https://blog.csdn.net/weixin_58631717/article/details/126078402