类型转换名称和语法
C风格的强制类型转换(Type case)很简单,无论什么类型的转换统统 TYPE b = (TYPE)a
C++风格的类型转换提供了4中方法:
static_cast 静态类型转换 reinterpreter_cast 重新解释类型(不安全,不推荐使用) dynamic_cast 动态类型转换 const_cast 去const属性
四种类型转换的详情
static_cast
静态类型转换,编译的时候 c++编译器会做类型检查。 基本类型能够转换,但是不能转换指针。可实现C++中内置基本数据类型之间的相互转换(int,struct,enum,char...)。不能进行无关类型指针之间的转换。【无关类型:非基类与派生类之间,也就是说可以进行基类与子类之间的类型转换,但是不建议使用,不安全。编译阶段进行的,它可以是基类转成子类,显然这样是不行的】
reinterpret_cast
与C风格相同,不考虑类型安全,不到万不得已不建议使用
重写解释类型,但没有进行二进制转换。转换类型必须是一个指针,应用、算数类型、函数指针、成员指针。在比特级别上进行转换。最普通的用途就是在函数指针类型之间进行转换,很难保证移植性。
dynamic_cast
动态类型转换,安全的基类和子类之间转换,运行时类型检查。使用时保证基类中有虚函数,否则编译不通过。类中存在虚函数,就说明它想让基类的指针或引用指向派生类。
const_cast
去除变量的只读属性。不能在不同种类间转换。仅仅作用于const,可以使本来不是const转成const,本来是const去除const。
向上转型:dynamic_cast与static_cast效果一样 向下转型:dynamic_cast比static_cast更加安全 (父类指针可以指向子类对象,因为类型兼容机制 子类指针不能指向父类对象)
程序案例
C语言中,能隐式类型转换的在C++中可以用static_cast进行类型转换
C语言中,不能隐式类型转换的在C++中可以用reinterpret_cast进行类型转换
要转型就必须先有继承。继承是面向对象语言中一个代码复用机制。简单说就是子类继承了父类中的非私有属性和可以继承的方法。然后子类可以继承扩展自己的属性和方法。
向上转型:通过子类对象实例化父类对象,这种是自动转换(Father f = new Son)
向下转型:通过父类对象实例化子类对象,这种需要强制转换(Son s = (Son)f)
#include <iostream> using namespace std; class Animal { public: virtual void cry() = 0; }; class Dog:public Animal { public: virtual void cry() { cout<<"wangwnag"<<endl; } void doSwim() { cout<<"狗爬"<<endl; } }; class Cat:public Animal { public: virtual void cry() { cout<<"miaomiao"<<endl; } void doTree() { cout<<"我要爬树"<<endl; } }; class Book { public: void printP() { cout<<price<<endl; } private: int price; }; void ObjPlay(Animal *base) { base->cry(); //Dog *pDog = static_cast<Dog *>(base); //向下转型 Dog *pDog = dynamic_cast<Dog *>(base); if(pDog != nullptr) { pDog->cry(); pDog->doSwim(); } Cat *pCat = dynamic_cast<Cat *>(base); //向下转型 if(pCat != nullptr) { pCat->cry(); pCat->doTree(); } } int main(void) { Animal *base = NULL; Cat *pCat; Dog *pDog = dynamic_cast<Dog *>(base); //向下转型: base = dynamic_cast<Animal *>(pCat); //向上转型 base = pCat; //向上转型 //pCat = base; //err 向下转型需要强制转换 //把base转换成其他 非动物相关的 err //Book *pbook = static_cast<Book *>(base); Book *pbook = reinterpret_cast<Book *>(base); //dynamic_cast用法 ObjPlay(new Cat()); //这个传参的过程是一个向上转型 return 0; }
cosnt_cast实例
如果需要去const属性进行修改,首先要保证这段内存能够被修改