C++进阶STL-类型转化

我不是女神ヾ 2022-05-09 06:42 260阅读 0赞

1. static_cast: 普通内置数据类型之间转化,具有继承关系之间的指针或者引用之间的转化

  1. class Building{ }; class Animal{ }; class Cat:public Animal{ }; //int -> char int a = 97; char c = static_cast<char>(a); cout << c << endl; //int* -> char* 普通类型指针(无效) // int* pInt = NULL; // char* pChar = static_cast<char*>(pInt); //不同类指针之间的转化 (无效) // Building* pBuilding1 = NULL; // Animal* pAnimal1 = static_cast<Animal*>(pBuilding1); // 子类指针->父类指针 Cat* pCat2=NULL; Animal*pAnima2 = static_cast<Animal*>(pCat2); // 父类指针->子类指针 Animal* pAnimal3 = NULL; Cat* pCat3 = static_cast<Cat*>(pAnimal3); // 子类引用-> 父类引用 Cat cat4; Cat& yCat4 = cat4; Animal& yAnimal4 = static_cast<Animal&> (yCat4); // 父类引用 -> 子类引用 Animal animal5; Animal& yanimal5 = animal5; Cat& ycat5 = static_cast<Cat&> (yanimal5);

2. dynamic_cast : 具有继承关系的指针或者引用之间的转化,并且进行严格的检查,只能从子转父。

  1. class Building{ }; class Animal{ }; class Cat:public Animal{ }; //不同类指针之间的转化 (无效) //Building * pBuilding1 = NULL; //Animal * pAnimal1 = dynamic_cast<Animal*>(pBuilding1); // 父类引用 -> 子类引用 (无效) //Animal animal5; //Animal& yanimal5 = animal5; //Cat& ycat5 = dynamic_cast<Cat&> (yanimal5); // 父类指针->子类指针 (无效) //Animal* pAnimal3 = NULL; //Cat* pCat3 = dynamic_cast<Cat*>(pAnimal3); // 子类引用-> 父类引用 Cat cat4; Cat& yCat4 = cat4; Animal& yAnimal4 = dynamic_cast<Animal&> (yCat4); // 子类指针->父类指针 Cat* pCat2 = NULL; Animal*pAnima2 = dynamic_cast<Animal*>(pCat2);

3. const_cast: 增加或去除变量的 const 性

  1. // 引用 int a = 10; const int &b= a; //不可以通过 b 去修改 a 情况(1) //编译器报错 int &c=b; 情况(2) //这样就可以通过c修改 a 和 b int &c=const_cast<int &>(b); c = 11; //指针 //const -> none const const int* p1 = NULL; int *p2 = p1; (无效),//不可用const int* 型去初始化 int* int*p3= const_cast<int*>(p1); //OK //none const-> const int* p1 = NULL; const int *p2 = const_cast<const int*>(p1);

4. reinterpret_cast: 任何指针类型之间的转化(包括函数指针)

  1. class Building{ }; class Animal{ }; class Cat:public Animal{ }; // 不同类指针之间的转化 Building* B1; Animal* A1; A1 = reinterpret_cast<Animal*>(B1); // 函数指针之间转化 typedef void (FUNC1)(int, int); typedef void (FUNC2)(int, char); FUNC1* pfun1=NULL; FUNC2* pfun2 = reinterpret_cast<FUNC2* >(pfun1);

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++STL-函数对象

    函数对象的概念  重载  ()操作符  的类,它的对象叫做函数对象,即它是 类似于函数的 对象(它可以向函数一样调用),也叫作仿函数。 注意:函数对象(

    相关 C++STL-异常处理

    异常抛出是跨函数的 返回值:只是返回给调用的这一层函数 异常:最里面的函数func1如果抛出异常给 调用的func2 , 如果func2没有处理, 再抛出给调

    相关 C++STL-模板

    模板的机制 模板并不是能处理任何类型的数据,只是它根据传入参数的类型的不同生成了不同的 函数/类 体(我们在不使用函数模板的正常操作,只不过编译器帮我们做了)。在此编译过