1、数据类型转换(static_cast)
//数据类型转换
printf("%d
", static_cast<int>(10.2));
2、指针类型转换(reinterpret_cast)
//指针类型转换
int *pint = new int(1);
char *pch = reinterpret_cast<char *>(pint);
3、涉及到const的指针类型转换(const_cast)
const int num[5] = { 1,2,3,4,5 };
const int *p = num;
int *pint = const_cast<int *>(p);
4、子类转化为父类(dynamic_cast)
class man { public: int name; //加上virtual关键字,可以使得父类用子类初始化后可以调用子类的函数 virtual void run() { cout << "man is running" << endl; } }; class son :public man { public: void run() { cout << "son is running" << endl; } }; void main() { /*man man1; son son1; man *p = &man1; p->run(); p = &son1; p->run();*/ man *pman = new man; son *pson = new son; //子类指针转换为父类指针,但是还是调用子类的函数 man *pfu = dynamic_cast<man *>(pson); pfu->run(); system("pause"); }
volatile关键字 表示该变量易变,每次在访问该关键字修饰的变量时都要读内存,不对其进行优化。 mutable关键字 类的常成员函数在语义上是不允许修改类的成员变量的,但是有时候可能根据代码的需要并不是这么绝对。那么就可以使用mutable声明一个类的成员变量,它告诉编译器类的常成员函数可以修改这个变量。 explicit关键字 修饰构造函数,通常用作 构造函数静止隐式转换。 四种类型转换 1. const_cast 去掉类型的const或volatile属性。 const int a=10; int &b=const_case<int&>(a); 2. static_cast 静态类型转换,用于类型间强制转换。用于: (1)基类和子类转换,子类指针转父类是安全的,父类转子类不安全。 (2)基本数据类型转换。 (3)空指针转换成目标类型指针。 (4)转换为void类型 int n=1; double d=static_cast<double>(n); int *pn=&n; double *d=static_cast<double*>(&n); void *p = static_case<void*>(pn); 3.dynamic_cast 动态类型转换,运行时类型安全检查(转换失败返回NULL) (1)安全基类和子类转换,基类转子类会失败。 (2)必须有虚函数。 (3)相同基类不同子类间转换,结果为NULL。 4.reinterpret_cast 重新解释类型,没有进行二进制转换。 一般用在函数指针类型之间转换。