C 隱式轉換

2021-09-26 06:43:20 字數 3023 閱讀 7979

下面幾種型別的轉換被稱之為隱式轉換 

隱式轉換可以在很多種情況下發生,包括函式子句呼叫,cast計算表示式和賦值語句。

預定義的隱式轉換總會成功而且不會引發異常,適當合理的使用者自定義隱式轉換也可以展示出這些 特性。

一. 同一性轉換

同一性轉換把任何型別轉換為統一的型別。只有在所需轉換的實體可以被轉換到一種特定的型別時才可以進行同一性轉換。

二. 隱式數值轉換

隱式數值轉換可以在下面型別中發生:

• 從 sbyte 到 short, int, long, float, double 或 decimal。 •

從 byte 到 short, ushort, int, uint, long, ulong, float, double 或 decimal。 •

從 short 到 int, long, float, double 或 decimal。 •

從 ushort 到 int, uint, long, ulong, float, double 或 decimal。 •

從 int 到 long, float, double 或 decimal。 •

從 uint 到 long, ulong, float, double 或 decimal。 •

從 long 到 float, double 或 decimal。 •

從 ulong 到 float, double 或 decimal。 •

從 char到 ushort,int,uint, long, ulong, float, double 或 decimal。 •

從 float到 double。

從 int,uint,long到float以及從long到double型別的轉換可能會造成精度的損失,但並不會造成數量上的損失。除此之外的其他隱式數值轉換不會損失任何資訊。這裡不存在轉到 char型別的隱式數值轉換,也就是說其他的整型資料不會被自動地轉換為字元型資料。

三. 隱式列舉轉換

乙個隱式列舉轉換允許小數-整數實字(decimal-integer-literal)被轉換成任意的列舉型別。

四. 隱式引用轉換

隱式 reference轉換可以在下面型別之間發生:

• 從任意 引用型別 到物件 。 •

從任意 類型別 s 到任意 類型別 t, 只要 s 是由 t 派生出來的。 •

從任意 類型別 s 到任意 介面型別 t, 只要 s 實現 t。 •

從任意 介面型別 s 到任意 介面型別 t, 只要 s 是由 t 派生出來的。 •

從乙個帶有元素型別 s 的 陣列型別 s 到乙個帶有元素型別 t 的 陣列型別 t,只要下述各項均成立: •

s 和 t 只是元素型別不同。換句話說,s 和 t 有相同的維度。 •

se 和 te 都是 引用型別 。 •

存在從 se 到 te 隱式引用轉換。 •

從任意 數 組型別 到 system.array。 •

從任意 代 表型別 到 system.delegate。 •

從任意 數 組型別 或 代表型別 到 system.icloneable。 •

從 null型別到任意 引用型別 。.

隱式引用轉換指的是在引用型別間肯定可以成功的型別轉換,它們是不需要實時檢測的。

引用轉換,不管是顯式或是隱式的都不會改變被轉換物件的引用一致性。換句話說,當引轉換發生時,它並未改變被轉換物件的數值。

五. 包裝轉換

包裝轉換允許任何數值型別被隱式地轉換為型別物件,或者任何由這個數值型別實現的介面型別。 包裝乙個數值型別的數值包括分配乙個物件例項並且將數值型別的數值複製到例項當中。

包裝數值型別的資料的實際過程,可以通過想像乙個對那種型別的包裝類的實際例子來解釋。對於數值型別 t,包裝類要按下面定義:

class t_box

}

對於型別 t的數值 v的包裝現在由執行表示式 t_box(v)來代替,並且返回型別為 object的結果例項。這樣,語句

int i = 123;

object box = i;

從概念上符合

int i = 123;

object box = new int_box(i);

如上面的 t_box 和 int_box 的包裝型別實際不存在,而被包裝資料的動態型別實際上並不是乙個類型別。作為替代,型別t 的乙個被包裝的資料有動態型別t,而使用 is 操作符的動態型別檢查可以很方便地引用t。例如

int i = 123; 

object box = i;

if (box is int)

將在控制台輸出字串

「box contains an int」。

包裝轉換隱式地把被包裝的資料進行了備份。這與從引用型別到object型別的轉換不同,在那裡資料一直引用相同的例項,並被認為幾乎不從型別 object派生。例如,給出宣告

struct point

}

下面的語句

point p =

newpoint(10, 10);

object

box = p;

p.x = 20;

console.write(((point)box).x);

因為在發生把 p賦值給 box的隱含包裝操作時,p被拷貝,所以將在控制台上輸出數值 10。如果point被宣告為乙個類,因為p和box將引用相同的例項,就會輸出20。

六. 隱式常數表示式轉換

常量表示式的型別可以是以下型別之一:sbyte、byte、short、ushort、int、uint、long、ulong、 char、float、double、decimal、bool、string、列舉型別或空(null)型別。

隱式常數表示式轉換允許下列型別的轉換:

整型常數表示式可以被轉換成為 sbyte,byte,short,ushort,uint或者 ulong型別,只有這個整型常數表示式的數值未超出目標型別的取值範圍就行。 

乙個 long型別的常數表示式可以被轉換成為 ulong型別,只有這個常數表示式的取值非負就行。

c 隱式轉換

class string string s1 a 錯誤 不能做隱式char string轉換 string s2 10 可以 呼叫explicit string int n string s3 string 10 可以 呼叫explicit string int n 再呼叫預設的複製建構函式 str...

C 隱式轉換

眾所周知,c 的基本型別中並非完全的對立,部分資料型別之間是可以進行隱式轉換的。所謂隱式轉換,是指不需要使用者干預,編譯器私下進行的型別轉換行為。很多時候使用者可能都不知道進行了哪些轉換。c 物件導向的多型特性,就是通過父類的型別實現對子類的封裝。通過隱式轉換,你可以直接將乙個子類的物件使用父類的型...

C 隱式轉換

include using namespace std class a a int main 程式輸出 constructor destructor a a 10 這樣的語法是通過的,為什麼?由於發生了建構函式的隱式轉換,隱式轉換這樣的規則同意用乙個引數來初始化物件,這會呼叫類中帶有乙個引數的建構函...