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属性,它只是又提供了一个接口(指针或引用),使你可以通过这个接口来改变类型的值。