首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++类型转换之总结

2012-10-10 
C++类型转换之小结1.C和C类型转换C风的强制转换:T(exdivssion)或者(T)exdivssionC的类型转换用:dynamic_ca

C++类型转换之小结
1.C和C++类型转换

    C风格的强制转换:

           T(exdivssion)或者(T)exdivssion

     C++的类型转换用:dynamic_cast,static_cast,reinterdivt_cast,const_cast

2.运行时类型识别(RTTI)

  (1)定义:程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

  (2)RTTI提供了两个有用的操作符:

    typeid:返回指针或引用所指的实际类型

    dynamic_cast:用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用

  (3)typeid 函数

    该函数的主要作用就是让用户知道当前的变量是什么类型的,比如使用typid(a).name()就能知道变量a是什么类型的。因为typid()函数是一个反回类型为const typid_info&类型的函数,所以下面先对type_info类作下介绍

  (4)type_info类

    该类的具体实现方式依编译器而定,但一般都有如下的成员定义

#include <iostream> class B { int i; public: // Conversion constructor. B(int a) : i(a) { } void display() { std::cout << i;} }; int main() { B bobj1 = (B)123; // C-style cast int to B.bobj1.display();std::cout << '/'; bobj2 = B(456); // Constructor notation Bbobj2.display(); std::cout << '/'; B bobj3 = static_cast<B>(789); // Static_cast. bobj3.display(); return 0; }

  (3)reinterpret_cast

     reinterpret_cast操作符代替了大多数其它C风格类型转换的使用。reinterpret_cast将指针转换为其它指针类型、将数字转换为指针或将指针转换为数字。与使用C风格的类型转换一样,当使用reinterpret_cast操作符时,用户应该知道自已要干什么。有时,只有C风格的类型转换才能起作用,但这并不是说从来都不应该使用reinterpret_cast。下例展示了一个用void型指针返回100个字符的缓冲区的简单内存分配程序。Main()函数将返回结果赋值给一个字符型指针。C++的转换规则与C并不相同。在C++的转换规则中,不能隐式地将void*转换为char*,因此,需要进行类型转换。下面使用了reinterpret_cast而不是C语言风格的类型转换。

#include <iostream> #include <cstring>  //Create a buffer. // void* getmem() { static char buf[100];      return buf; }  int main() {      char* cp = reinterpret_cast<char*>(getmem());      strcpy(cp, "Hello, Woody");      std::cout << cp;        return 0; }

  (4)const_cast

      刚才所讨论的3种类型转换操作都没有涉及“常量属性”,即不能使用它们移去对象的常量属性。为此,我们要使用const_cast操作符。除了const和volatile关键字之外,它的类型参数必须和对象参数的类型相匹配。
      例如,考虑一个全局的计数器,它描述了对常类对象或其它类型的类对象的操作次数。下面给出了这样的一个例子

#include <iostream>  class A {     int val;     int rptct;  // Number of times the object is reported.public:     A(int v) : val(v), rptct(0) { }     ~A() { cout << val << " was reported " << rptct << " times."; }     void report() const; };  void A::report() const {     const_cast<A*>(this)->rptct++;     cout << val << endl; }  int main() {     const A a(123);      a.report();     a.report();     a.report();       return 0; }



 

热点排行