笔者曾经面试的时候遇到一个问题,在C++怎么改变const修饰的常量的值,当时我还想了一会,C语言的const修饰的常量是假常量,是可以通过指针修改的,而C++中的常量那可是一个真的常量,怎么修改呢!后来我想到了类型转换const_cast 去掉const属性转换。其实这道题我也不知道做对了没,回来也没有上网查过资料,借用一句话描述一下我这种性格吧,“不要和我比懒,我懒得和你比”。好了,废话不多说,让我们进入正题吧。我们都知道C语言的类型转换,其实C++中也有类型转换。C++提供了四种类型转换,分别适应不同的场合。
static_cast ——>静态类型转换。reinterpreter_cast ——>重新解释类型转换。dynamic_cast ——>子类和父类之间的多态类型转换。const_cast ——>去掉const属性转换。所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种 代码格式
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; }形式
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; }目标类类型只能是指针或引用 形式:
const_cast<目标类型> (标识符)案例:
const int a = 10; const int *a_p = &a; //把a_p的const 属性去掉 int *a_p1 = const_cast<int*>(a_p);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; }程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。一般情况下,不建议进行类型转换。