四种类型转换的理解

  • const_cast

    该操作两句口诀:

    ​ “常量指针转化为非常量的指针,并且指向原来的对象”

    ​ “常量引用转化为非常量的引用,并且指向原来的对象”

    通俗说,该操作会去掉常量属性。

    例子如下:

    int value = 1;
    const int* p = &value;	//此处底层const无法修改value的值
    //*p = 3;	//无法修改指向value的值,error C3892: “p”: 不能给常量赋值
    int* p1 = const_cast<int*>(p);
    *p1 = 2;	//可以修改指向value的值
    std::cout << value << std::endl;	//输出为2
    

    注意一点,const_cast只能改变底层const,这句话的涵义我们就上述例子可以看出,value的值,可以被p1修改,但是指针p的指向,我们无法通过p1去更换。

    应用场景:

    1.函数传参过程中,参数为非const指针,但外面的变量是const常量,且函数内部不会进行更改变量值的行为。

    void Func(int * p)
    {
    	std::cout << *p << std::endl;
    }
    int main()
    {
        const int num = 1;
    	Func(const_cast<int *>(&num));	
    
    	return 0;
    }
    

    ​ 2.有一个非const变量,但却被一个const指针所指向了,当只能操作该指针时,我们想要更改该变量的值,可以通过const_cast操作。

    int value = 1;
    const int* p = &value;	
    int* p1 = const_cast<int*>(p);
    *p1 = 2;
    std::cout << value << std::endl;	//输出为2
    
  • static_cast

    该操作是一种低风险的转换操作,可以对整数、浮点数、字符这些类型之间作转换。

    不可用作指针和类型之间的转换

    不可用作不同类型指针之间的转换

    不可用作不同类型引用之间的转换

	int t = 1;
	int* p = &t;
	char c = static_cast<char>(t);		//可以进行转换
	
	//char* p1 = static_cast<int*>(&t);	//违法的转换
	//int* p2 = static_cast<int*>(t);	//违法的转换

  • reinterpret_cast

    超级灵活的类型转换,但是无法确定安全性,慎用

  • dynamic_cast

    多态基类指针强制转换成派生类指针时,可以检查转换后的指针是否指向派生类的对象,如果转换不安全,返回NULL。

class F
{
public:
	virtual void run()
	{

	}
	
};
class Son : public F
{
};
int main()
{
    F f;
	Son s;
	Son* s1;
	s1 = reinterpret_cast<Son*>(&f);
	std::cout << s1 << std::endl;	//不为NULL reinterpret_cast不检查是否为派生类指针
	s1 = dynamic_cast<Son*>(&f);
	std::cout << s1 << std::endl;	//NULL,dynamic_cast检测到要转换的&f不是派生类对象
	s1 = dynamic_cast<Son*>(&s);
	std::cout << s1 << std::endl;	//不为NULL,s是派生类对象,&s可以转换成派生类对象
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值