类型转换有 c 风格的,当然还有 c++风格的。 c 风格的转换的格式很简单(TYPE) EXPRESSION,但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的 指针,这两种转换之间的差别是巨大的,但是传统的 c 语言风格的类型转换没有区分这 些。还有一个缺点就是,c 风格的转换不容易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。
static_cast | 静态类型转换。 |
reinterpreter_cast | 重新解释类型转换。 |
dynamic_cast | 子类和父类之间的多态类型转换。 |
const_cast | 去掉const属性转换。 |
static_cast
#include <iostream> using namespace std; int main() { double d = 3.14; int num1 = (int)d; //C语言的旧式类型转换 int num2 = d; //隐式类型转换 int num3 = static_cast<int> (d); //静态类型转换 cout<<"d: "<<d<<", "<<"num1: "<<num1<<", "<<"num2: "<<num2<<", "<<"num3: "<<num3<<endl; return 0; }
dynamic_cast 子类和父类之间的多态类型转换
用于多态中的父子类之间的强制转化。
#include <iostream> using namespace std; class Base { public: virtual void print() = 0; }; class A: public Base { public: virtual void print() { cout<<"I am A"<<endl; } }; class B: public Base { public: virtual void print() { cout<<"I am B"<<endl; } }; int main() { Base *base = NULL; base = new A(); base->print(); B *b = dynamic_cast<B *> (base); //将父类指针转化为子类指针B,但是由于父类指针原来指向的是A,所以转换失败返回空指针 if(b == NULL) { cout<<"b is NULL"<<endl; } A *a = dynamic_cast<A *> (base); //将父类指针转化为子类指针A if(a != NULL) { a->print(); } return 0; }