浅析c++中的类型转换--const_cast

csdn(床上等你)博客的排名终于不是千里之外了,有了具体的数字。。。

今天就搞一个简单的介绍const_cast类型转换符。

作用就是:
从类中移除 const、volatile 和 __unaligned 特性。
语法如下:
const_cast < type-id > ( expression )

指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const、volatile 和 __unaligned 限定符除外)。

对于指针和引用,结果将引用原始对象。

对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员。 根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针的写入操作可能产生未定义的行为。

您不能使用 const_cast 运算符直接重写常量变量的常量状态。
const_cast 运算符将 null 指针值转换为目标类型的 null 指针值。

上代码:
(一)常量指针被转化成非常量指针,转换后指针指向原来的变量(即转换后的指针地址不变)
(二)常量引用转为非常量引用。
(三)常量对象(或基本类型)不可以被转换成非常量对象(或基本类型)。

//代码一
class A  
{  
public:  
     A()  
     {  
      m_iNum = 0;  
     }  

public:  
     int m_iNum;  
};  

void foo()  
{  
    //1. 指针指向类  
    const A *pca1 = new A;  
    A *pa2 = const_cast<A*>(pca1);  //常量对象转换为非常量对象  
    pa2->m_iNum = 200;    //fine  

    //转换后指针指向原来的对象  
    cout<< pca1->m_iNum <<pa2->m_iNum<<endl; //200 200  

    //2. 指针指向基本类型  
    const int ica = 100;  
    int * ia = const_cast<int *>(&ica);  
    *ia = 200;  
    cout<< *ia <<ica<<endl;   //200 100  
}
//代码二
class A
{
public:
  A()
  {
    m_iNum = 1;
  }

public:
  int m_iNum;
};

void foo()  
{  

  A a0;
  const A &a1 = a0;
  A a2 = const_cast<A&>(a1); //常量引用转为非常量引用

  a2.m_iNum = 200;    //fine  

  cout<< a0.m_iNum << a1.m_iNum << a2.m_iNum << endl; //1 1 200  
}
//代码三
void foo()
{
 //常量对象被转换成非常量对象时出错
 const A ca;
 A a = const_cast<A>(ca);  //不允许

 const int i = 100;
 int j = const_cast<int>(i);  //不允许

}

总结:
使用const_cast去掉const属性,其实并不是真的改变原类类型(或基本类型)的const属性,它只是又提供了一个接口(指针或引用),使你可以通过这个接口来改变类型的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值