C++中const-cast與reinterpret-cast運算符的用法

C++中const_cast與reinterpret_cast運算符的用法,經常被用於表達式中的類型轉換,下面是小編分享的運算符的用法,一起來看一下吧。

C++中const-cast與reinterpret-cast運算符的用法

  const_cast 運算符

從類中移除 const、volatile 和 __unaligned 特性。

  語法

const_cast <

type-id

> (

expression

)

 備註

指向任何對象類型的指針或指向數據成員的指針可顯式轉換爲完全相同的類型(const、volatile 和 __unaligned 限定符除外)。對於指針和引用,結果將引用原始對象。對於指向數據成員的指針,結果將引用與指向數據成員的原始(未強制轉換)的指針相同的成員。根據引用對象的類型,通過生成的指針、引用或指向數據成員的.指針的寫入操作可能產生未定義的行爲。

您不能使用 const_cast 運算符直接重寫常量變量的常量狀態。

const_cast 運算符將 null 指針值轉換爲目標類型的 null 指針值。

// expre_const_cast_

// compile with: /EHsc

#include <iostream>

using namespace std;

class CCTest {

public:

void setNumber( int );

void printNumber() const;

private:

int number;

};

void CCTest::setNumber( int num ) { number = num; }

void CCTest::printNumber() const {

cout << "Before: " << number;

const_cast< CCTest * >( this )->number--;

cout << "After: " << number;

}

int main() {

CCTest X;

umber( 8 );

tNumber();

}

在包含 const_cast 的行中,this 指針的數據類型爲 const CCTest *。 const_cast 運算符會將 this 指針的數據類型更改爲 CCTest *,以允許修改成員 number。強制轉換僅對其所在的語句中的其餘部分持續。

reinterpret_cast 運算符

允許將任何指針轉換爲任何其他指針類型。也允許將任何整數類型轉換爲任何指針類型以及反向轉換。

 語法

reinterpret_cast < type-id > ( expression )

  備註

濫用 reinterpret_cast 運算符可能很容易帶來風險。除非所需轉換本身是低級別的,否則應使用其他強制轉換運算符之一。

reinterpret_cast 運算符可用於 char* 到 int* 或 One_class* 到 Unrelated_class* 之類的轉換,這本身並不安全。

reinterpret_cast 的結果不能安全地用於除強制轉換回其原始類型以外的任何用途。在最好的情況下,其他用途也是不可移植的。

reinterpret_cast 運算符不能丟掉 const、volatile 或 __unaligned 特性。有關移除這些特性的詳細信息,請參閱 const_cast Operator。

reinterpret_cast 運算符將 null 指針值轉換爲目標類型的 null 指針值。

reinterpret_cast 的一個實際用途是在哈希函數中,即,通過讓兩個不同的值幾乎不以相同的索引結尾的方式將值映射到索引。

#include <iostream>

using namespace std;

// Returns a hash code based on an address

unsigned short Hash( void *p ) {

unsigned int val = reinterpret_cast<unsigned int>( p );

return ( unsigned short )( val ^ (val >> 16));

}

using namespace std;

int main() {

int a[20];

for ( int i = 0; i < 20; i++ )

cout << Hash( a + i ) << endl;

}

Output:

64641

64645

64889

64893

64881

64885

64873

64877

64865

64869

64857

64861

64849

64853

64841

64845

64833

64837

64825

64829

reinterpret_cast 允許將指針視爲整數類型。結果隨後將按位移位並與自身進行“異或”運算以生成唯一的索引(具有唯一性的概率非常高)。該索引隨後被標準 C 樣式強制轉換截斷爲函數的返回類型。