强制转换符--const-cast

强制转换符 —const_cast

问题

  • 基类---->派生类 : 可能越界

  • 函数指针的转换

  • 整数转换成指针

  • 常量指针转换成非常量指针

强制转换符

  • const_cast
  • static_cast
  • reinterpret_cast
  • dynamic_cast

c语言强制转换符的缺点

主要是为了克服一下三个缺点

  • 没有从形式上体现转换功能和风险的不同
  • 多态基类指针转换为派生类指针不检查安全性
  • 难以发现强制转换的位置

1.const_cast

  • 只针对指针,引用,this指针

  • 针对于指针引用和this指针可以去 const

 const int  n = 5;
 const string  s = "CX";

 int* k = const_cast<int*>(&n);
*k = 123;
int& m = const_cast<int&>(&n);
k = 123;


class Test{
   	public:Test m_nTest(2){}
    		//常成员函数----不能改变
    		void foo(int t)const {
                vois *p =this;
                const_cast<Test*const>(this)->m_nTest = nTest;
            }
    		int m_nTest;
}

2.static_cast

int main(){
   int n = 5;
   float f =10.0f;
   double d = 1.0;
   char ch = 'a';

    //本质山发生了隐式转换
   f =  n;

   f = static_cast<float>(n);

   //低风险的转换
   //整型和浮点型
   n =  static_cast<int>(d);

   //字符和整型
   n = static_cast<int>(ch);

    //void*指针的转换
    void* p = nullptr;
    int *pn  = static_cast<int*>(p);

3.dynamic_cast

RTTI

用于虚函数基类派生类之间的引用和指针的转换

  • 基类必须具备虚函数
  • 运行时检查,转型不成功则返回一个空指针
  • 非必要不使用,有额外的开销

使用

#include<iostream>
using namespace std;
class Base{
    public:
	    virtual void foo(){}
};
class subClass: public Base{
    public:
        void foo() override{} 
};
int main(){
    Base a;
    subClass b;
    
    Base* c = &a;
    subClass* d = &b;

    //向下转换, 父类转子类 不安全
    
    //使用dynamic_cast可以检测这种转换是不安全的
    //再运行时检测是否安全
    
    //在运行的时间检测被转换指针的类型
    d = static_cast<Base*>(c);
    d = dynamic_cast<Base*>(c);		//null
   

    //向上转换,子类转成父类 安全
    c = d;
    c = static_cast<Base*>(d);
}

4.reinterpret_cast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值