一、概述
笔者曾经面试的时候遇到一个问题,在C++怎么改变const修饰的常量的值,当时我还想了一会,C语言的const修饰的常量是假常量,是可以通过指针修改的,而C++中的常量那可是一个真的常量,怎么修改呢!后来我想到了类型转换const_cast 去掉const属性转换。其实这道题我也不知道做对了没,回来也没有上网查过资料,借用一句话描述一下我这种性格吧,“不要和我比懒,我懒得和你比”。好了,废话不多说,让我们进入正题吧。我们都知道C语言的类型转换,其实C++中也有类型转换。C++提供了四种类型转换,分别适应不同的场合。
static_cast——>静态类型转换。reinterpreter_cast——>重新解释类型转换。dynamic_cast——>子类和父类之间的多态类型转换。const_cast——>去掉const属性转换。
二、转换方式及相关案例
1、static_cast 静态类型转换
所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种
代码格式
static_cast<目标类型> cast
案例:
#include <iostream>
using namespace std;
int main()
{
double dPi = 3.1415926;
int iPi1 = (int)dPi;
int iPi2 = dPi;
int iPi3 = static_cast<int> (dPi);
cout << "dPi:" << dPi << "iPi1:" << iPi1 << "iPi2:" << iPi2 << "iPi3:" << iPi3 << endl;
return 0;
}
2、dynamic_cast 子类和父类之间的多态类型转换
形式
dynamic_cast<目标类型> (标识符)
案例:
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void cry() = 0;
virtual void doWork() = 0;
};
class Cat : public Animal
{
public:
virtual void cry()
{
cout << "喵喵~~~~" << endl;
}
virtual void doWork()
{
cout << "抓老鼠" << endl;
}
};
class Dog :public Animal
{
public:
virtual void cry()
{
cout << "汪汪~~" << endl;
}
virtual void doWork()
{
cout << "看家" << endl;
}
};
int main(void)
{
Animal *animal = NULL;
animal = new Dog;
animal->cry();
animal->doWork();
cout << " -----" << endl;
Dog * dog = NULL;
dog = dynamic_cast<Dog*>(animal);
if (dog != NULL)
{
cout << "转换成功" << endl;
dog->cry();
dog->doWork();
}
else
{
cout << "转换失败" << endl;
}
Cat *cat = NULL;
if (cat != NULL)
{
cout << "转换成功" << endl;
cat->cry();
cat->doWork();
}
else
{
cout << "转换失败" << endl;
}
delete animal;
return 0;
}
3、const_cast 去掉const属性转换
目标类类型只能是指针或引用
形式:
const_cast<目标类型> (标识符)
案例:
const int a = 10;
const int *a_p = &a;
//把a_p的const 属性去掉
int *a_p1 = const_cast<int*>(a_p);
4、reinterpret_cast 重新解释类型转换
interpret 是解释的意思,reinterpret 即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。
形式:
reinterpret_cast<目标类型> (标识符)
案例:
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void cry() = 0;
virtual void doWork() = 0;
};
class Cat : public Animal
{
public:
virtual void cry()
{
cout << "喵喵~~~~" << endl;
}
virtual void doWork()
{
cout << "抓老鼠" << endl;
}
};
class Dog :public Animal
{
public:
virtual void cry()
{
cout << "汪汪~~" << endl;
}
virtual void doWork()
{
cout << "看家" << endl;
}
};
class Tree
{
public:
Tree(int age)
{
this->age = age;
}
virtual void print()
{
cout << "我是大叔" << endl;
}
int age;
};
int main(void)
{
Animal *animal = new Dog;
//是c++中真正的 强制转换, 也是最危险的转换方式。
Tree* tree = reinterpret_cast<Tree*>(animal);
if (tree != NULL)
{
cout << "转换成功" << endl;
cout << tree->age << endl;
tree->print();
}
else
{
cout << "转换失败" << endl;
}
return 0;
}
三、总结
程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。一般情况下,不建议进行类型转换。
本文介绍了C++中的四种类型转换:static_cast用于静态类型转换,dynamic_cast处理子类和父类之间的多态类型转换,const_cast用于去掉const属性,reinterpret_cast则涉及数据的二进制重新解释。每种转换都有其特定的应用场景,程序员应清楚转换前后的类型及可能后果。
407

被折叠的 条评论
为什么被折叠?



