C/C++數據類型判斷與轉換


  

  最近總想着寫一些通用的代碼,然集中收納到自己的私人庫中去,這些代碼期望能與公司基礎數據結構無關。然而這比較難,因為無論如何,必需要用到一些結構 化的東西,這些與基礎引擎等有關,必需極度抽象才可以做到層層分離,於是我想將分兩個層級,一級模版代碼,只支持標准C++的東西,存入庫中;二級代碼,這些作為普通常函數,將會引擎一些引擎級別的數據,盡量通用;三級則是應用實例代碼。

  如此一來必需有類型判斷和通用的結構,以下收集一些數據類型處理的的方法。

一、typeid

  typeid 和 sizeof一樣是個運算符,eg.

int a;

if(typeid(a) == typeid(int))

    cout<<"int";

  另外 typeid(int).name() 返回值 為string 或者char*,可據此檢測類型。

 

 

二、類型轉換

  1、隱式轉換,當數據參與運算時,不同類型將被自動轉換

 

                                數據類型排名

long double
double
float
unsigned long long int
long long int
unsigned long int
long int
unsigned int
int

    char、short 和 unsigned short 值自動升級為 int 值;

    當運算符使用不同數據類型的兩個值時,較低排名的值將被升級為較高排名值的類型;

    當表達式的最終值分配給變量時,它將被轉換為該變量的數據類型。

 

 

  2、C風格的強轉換和C++風格的強轉換

      double booksPerMonth = (double)books / months;//C風格

      double booksPerMonth = double(books) / months;//C++風格,這種類型轉換表示法被稱為功能性表示法

 

  3、特殊的類型轉換

    1)static_cast<DataType>(Value)

      功能:完成編譯器認可的隱式類型轉換,如基礎類型和派生系向上轉換,但不支持指針與常見的int、float等類型轉換。

      一種用法是用來防止發生整除法,即除得的結果被舍入得到整數。另外在涉及輸出時也可能需要用到強制轉換來規避隱式轉換帶來的弊端。

      double booksPerMonth = static_cast<double>(books) / months;    

    2)dynamic_cast<DataType>(Value)

  功能:執行派生類指針或引用與基類指針或引用之間的轉換。

特征:

      1、其他三種都是編譯時完成的,dynamic_cast是運行時處理的,運行時要進行運行時類型檢查;

      2、不能用於內置的基本數據類型的強制轉換;

dynamic_cast轉換如果成功的話返回的是指向類的指針或引用,轉換失敗的話則會返回NULL。

      3、使用dynamic_cast進行轉換的,基類中一定要有虛函數,否則編譯不通過;

  需要檢測有虛函數的原因:類中存在虛函數,就說明它有想要讓基類指針或引用指向派生類對象的情況,此時轉換才有意義。這是由於運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(關於虛函數表的概念)中,只有定義了虛函數的類才有虛函數表。

4、在類的轉換時,在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉換時,dynamic_cast具有類型檢查的功能,比 static_cast更安全。

  向上轉換即為指向子類對象的向下轉換,即將父類指針轉化子類指針。向下轉換的成功與否還與將要轉換的類型有關,即要轉換的指針指向的對象的實際類型與轉換以后的對象類型一定要相同,否則轉換失敗。可以實現向上轉型和向下轉型,前提是必須使用public或protected繼承

3)const_cast<DataType>(Value)

  功能:只能對指針或者引用去除或者添加const屬性,對於變量直接類型不能使用const_cast;不能用於不同類型之間的轉換,只能改變同種類型的const屬性。

  const int a= 0;   int b = const_cast<int>(a);//錯

const int *pi = &a;  int * pii = const_cast<int *>pi;//去除指針中的常量性,也可以添加指針的常量性;

特征:const_cast操作不能在不同的種類間轉換。相反,它僅僅把一個它作用的表達式轉換成常量。它可以使一個本來不是const類型的數據轉換成const類型的,或者把const屬性去掉。

4)reinterpret_cast<DataType>(Value)

功能:

  即重新解釋,此標識符重新解釋數據的二進制形式,但是不改變其值。有着和C風格的強制轉換同樣的能力。它可以轉化任何內置的數據類型為其他任何的數據類型,也可以轉化任何指針類型為其他的類型。它甚至可以轉化內置的數據類型為指針,而考慮類型安全或者常量的情形。

不得已時才用!

    

    希望盡快重新改掉熬夜的習慣,重拾夕日良好的精神面貌。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM