總結一下C 型別轉換

2021-10-24 03:24:45 字數 3778 閱讀 6938

簡短版參考:

我們知道c語言中的型別轉換只有一種:

type b =

(type)a;

而在c++語言中新增了四個關鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。

1.static_cast

double bv =

100.0

int i =

(int

)bv;

//c style, 0x64

int iv2 =

static_cast

<

int>

(bv)

;//0x64

int iv2 =

reinterpret_cast

<

int>

(bv)

;//error,

double bv =

100.0

;double

*pbv =

&bv;

int*iv1 =

(int

*)pbv;

//c style, right

int*iv2 =

static_cast

<

int*

>

(pbv)

;//error: invalid static_cast from type `double*' to type `int*'

int*iv2 =

reinterpret_cast

<

int*

>

(pbv)

;//right,

void

*piv1 =

(void

*)pbv;

void

*piv2 =

static_cast

<

void

*>

(pbv)

;int

*piv3 =

static_cast

<

int*

>

(piv2)

;//right

classa;

classb:

public a

;classc;

intmain()

2.const_cast

const

double a =7;

const

double

* p =

&a;double

* q =

const_cast

<

double

*>

(p);

*q =20;

//通過q寫值是未定義的行為

//c style

const

char const_char =

'a';

char

*pch =

&const_char;

//error: invalid conversion from `const char*' to `char*'

char

*pch =

(char*)

&const_char;

//right

*pch =

'c';

//c++style

const

char const_char =

'a';

char chv =

const_cast

<

char

>

(const_char)

;//error, invalid use of const_cast with type `char',

//which is not a pointer, reference, nor a pointer-to-data-member type

char

*chv =

const_cast

<

char

*>

(&const_char)

;//right

*chv=

'c';

3.reinterpret_cast

int lv =

100;

long

long llv =

100;

int*piv1 =

(int

*)lv;

//c style, do』not check size

int*piv2 =

reinterpret_cast

<

int*

>

(lv)

;//lv is treated as pointer

piv2 =

reinterpret_cast

<

int*

>

(llv)

;// warning, different size

4.dynamic_cast

dynamic_cast將乙個基類物件指標(或引用)cast到繼承類指標,dynamic_cast會根據基類指標是否真正指向繼承類指標來做相應處理, 即會作出一定的判斷。

若對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標;

若對引用進行dynamic_cast,失敗丟擲乙個異常,成功返回正常cast後的物件引用。

class

base

;class

derived

:public base ;

base* pb =

newbase()

;if(derived* pd =

static_cast

>

(pb)

)//下行轉換是不安全的(堅決抵制這種方法)

derived* pd =

newderived()

;if(base* pb =

static_cast

>

(pd)

)//上行轉換是安全的

#include

#include

using

namespace std;

// 我是父類

class

tfather};

// 我是子類

class

tson

:public tfather

int data;

// 我是子類獨有成員};

intmain()

總結:

轉換型別操作符

作用const_cast

去掉型別的const或volatile屬性

static_cast

無條件轉換,靜態型別轉換

dynamic_cast

有條件轉換,動態型別轉換,執行時檢查型別安全**換失敗返回null)

reinterpret_cast

僅重新解釋型別,但沒有進行二進位制的轉換

參考文章:

稍微總結一下

其實整個程式16日的時候應該已經搞得差不多,文件也已經比較詳細。但是由於這個禮拜又是筆試又是面試,所以都沒有時間review整個程式。今天看了一下,改了一些輸出檔案的位置,基本上完成了所有任務了。程式放在 http xiao 81 svn auto testing 下。其中包括三個可執行指令碼 1....

總結一下模板

二叉樹的各種操作 include include include includetypedef struct node tree void createbitree tree p 建樹 return void xpreorder tree p 輸出先序 void zpreorder tree p 輸...

隨便總結一下

資訊和人是主體也是核心。兩者需要進行測算。資訊是由頭,體,鍵,三部分構成。所謂頭,是題目,簡介,id,等,也就是乙個代表或者叫名,總之就是這樣類似的乙個東西。我不能把這種東西說的真正明白,因為其完全是代表性的,而代表性的不是自身,所以不能明確。體,是資訊的核心內容。這個不需要過多解釋。乙個人,不如說...