C 語言中的型別轉換(靜態,動態,常量)

2021-10-10 13:59:37 字數 1906 閱讀 4985

概述:

型別轉換(cast)是將一種資料型別轉換成另一種資料型別。例如,如果將乙個整型 值賦給乙個浮點型別的變數,編譯器會暗地裡將其轉換成浮點型別。 轉換是非常 有用的,但是它也會帶來一些問題,比如在轉換指標時,我們很可能將其轉換成一 個比它更大的型別,但這可能會破壞其他的資料。 應該小心型別轉換,因為轉換 也就相當於對編譯器說:忘記型別檢查,把它看做其他的型別。

無論什麼原因,任何乙個程式如果使用很多態別轉換都值得懷疑. 標準 c++提供了乙個顯示的轉換的語法,來替代舊的 c 風格的型別轉換。 使用 c 風格的強制轉換可以把想要的任何東西轉換成我們需要的型別。那為什麼還需要一 個新的 c++型別的強制轉換呢? 新型別的強制轉換可以提供更好的控制強制轉換 過程,允許控制各種不同種類的強制轉換。c++風格的強制轉換其他的好處是,它 們能更清晰的表明它們要幹什麼。

靜態轉換:

#include

#include

using

namespace std;

classa;

classb;

classc:

public a

;void

test01()

void

test02()

void

test03()

intmain()

注意:

靜態轉換中static_cast並不會保證安全性,對於普通變數是使用的時候像c語言的強制轉換一樣,但是static_cast不能轉換普通變數的指標test03,如果是自定義變數的話,只有發生繼承關係的類才能相互轉換,並且只能向上轉換,子物件指標轉向父物件指標,因為不會發生指標指向的記憶體空間越界(大轉小),不能父物件轉子物件。

動態轉化:

1,不能用於轉換基本的資料型別

2,可以用於轉換發生繼承關係的類,保證轉換是安全的

3,如果發生了多型,子轉父和父轉子總是安全的(虛函式表是動態繫結的,不會發生越界)

classa;

classb;

classc:

public a

;//動態轉換 dynamic_cast

void

test04()

void

test05()

注:dynamic_cast轉化只能轉換發生繼承關係的自定義資料型別,不能用來轉內建型別(int ,char)等,並且轉換時如果發生了父轉子,就會報錯,所以保證了安全性

常量轉換:

該運算子用來修改型別的 const 屬性。。 常量指標被轉化成非常量指標,並且仍 然指向原來的物件; 常量引用被轉換成非常量引用,並且仍然指向原來的物件;

注意:不能直接對非指標和非引用的變數使用 const_cast 操作符去直接移除它的 const.

void

test06()

注意:const_cast就是加const和去const但是只能位址狀態操作。

重新解釋轉換

void

test07()

注意:一般用來轉換指標,整數等基本型別和指標之間也可以轉換。

總結:

static_cast一般用來轉換基本的資料型別;

dynamic_cast一般用來轉換發生繼承關係的自定義型別

const_cast 一般同來加const和去除const(位址訪問的時候:引用和指標)

C語言中的型別轉換

計算機進行算術運算時,通常要求運算元具有相同的位數 相同的儲存方式。而c語言支援在表示式中混合使用基本資料型別,因此需要在不同的資料型別之間進行轉換。在c語言中存在兩種型別的轉換,一種是隱式轉換,由編譯器自動處理轉換而無需程式開發人員介入,另一種是強制型別轉換 顯式轉換 需要程式開發人員使用強制轉換...

C語言中的型別轉換!

自動轉換發生在不同資料型別運算時,在編譯的時候自動完成 自動轉換遵循的規則就好比小盒子可以放進大盒子裡面一樣,下圖表示了型別自動轉換的規則。縮寫 ascii 英文全稱 american standard code for information interchange 美國資訊交換標準 是一種用於資...

C語言中的型別轉換

c語言中的型別轉換可以分為兩種 隱式轉換中的規則有 窄的向寬的轉變 unsigned 同型別無符號比有符號寬 同型別的轉換例如 int a 10 unsigned int b 10 if a b printf a b else printf a不同型別的轉換例如 int c 10 unsigned ...