C++强制类型转换

it2022-05-05  157

#include<iostream> using namespace std; //static_cast、reinterpret_cast、const_cast、dynamic_cast #if 0 //static_cast //static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换 //都可用static_cast,但它不能用于两个不相关的类型进行转换 int main() { double d = 12.34; int a = static_cast<int>(d); cout << a <<endl; return 0; } #endif #if 0 //reinterpret_cast //reinterpret_cast 操作符通常尾操作数的位模式提供较低层次的重新解释, //用于将一种类型转换为另一种不同类型 typedef void(*Func)(); int DoSomething(int i) { cout << "DoSometing" << endl; return 0; } void Test() { //reinterpret_cast 可以编译器以Fnnc的定义方式去看待DoSomething函数 //所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用 //C++不保证所有的函数指针都被一样的使用,所以这样用优势会产生不确定的结果 Func f = reinterpret_cast<Func>(DoSomething); f(); } #endif #if 0 //const_cast //const_cast最常用的用途就是删除变量的const属性,方便赋值 void Test() { volatile const int a = 3; //在这里不加volatile编译器会优化, //将3放入到寄存器中,所以打印出的数是3,加上volatile之后, //编译器会去内存中取值,这样就是5 int* p = const_cast<int*>(&a); *p = 5; cout << a << endl; } #endif #if 0 //dynamic_cast //dynamic_cast用于将一个父类对象的指针转换位子类对象的指针或引用(动态转换) //向上转型:子类对象指针->父类指针/引用(不需要转换,赋值兼容规则)(切片) //向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的) //注意: //1. dynamic_cast只能用于含有虚函数的类 //2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0 class A { public: virtual void f() {} }; class B :public A {}; void fun(A* pa) { // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0 B* pb1 = static_cast<B*>(pa); B* pb2 = dynamic_cast<B*>(pa); cout << "pb1:" << pb1 << endl; cout << "pb2:" << pb2 << endl; } int main() { //Test(); A a; B b; fun(&a); fun(&b); return 0; } #endif //注意 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前, //程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可, //则应限制强制转换值的作用域,以减少发生错误的机会。 //强烈建议:避免使用强制类型转换 #if 0 //explicit //explicit 关键字阻止经过转换构造函数进行隐式转换的发生 class A { public: explicit A(int a) { cout << "A(int a)" << endl; } A(const A& a) { cout << "A(count A& a)" << endl; } private: int _a; }; int main() { A a1(1); //隐式转换 -> A tmp(1); A a2(tmp) A a2 = 1; } #endif

最新回复(0)