C 隱式轉換

2021-08-10 03:46:33 字數 1192 閱讀 2927

眾所周知,c++的基本型別中並非完全的對立,部分資料型別之間是可以進行隱式轉換的。

所謂隱式轉換,是指不需要使用者干預,編譯器私下進行的型別轉換行為。很多時候使用者可能都不知道進行了哪些轉換。

c++物件導向的多型特性,就是通過父類的型別實現對子類的封裝。

通過隱式轉換,你可以直接將乙個子類的物件使用父類的型別進行返回。

在比如,數值和布林型別的轉換,整數和浮點數的轉換等。

某些方面來說,隱式轉換給c++程式開發者帶來了不小的便捷。

c++是一門強型別語言,型別的檢查是非常嚴格的。

如果沒有型別的隱式轉換,這將給程式開發者帶來很多的不便。

當然,凡事都有兩面性,在你享受方便快捷的一面時,你不得不面對太過智慧型以至完全超出了你的控制。

風險就在不知不覺間出現。

#參考:

#以上四種情況下的隱式轉換,都滿足了乙個基本原則:低精度 –》 高精度轉換。

不滿足該原則,隱式轉換是不能發生的。

當然這個時候就可以使用與之相對於的顯式型別轉換(又稱強制型別轉換),使用方法如下:

double a = 2.0;

int b = (int)a;

使用強制型別轉換會導致精度的損失,因此使用時務必確保你已經擁有足夠的把握。

隱式轉換的風險一般存在於自定義的類建構函式中。

按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件。

既然隱式轉換存在這麼多的風險,那如何能夠禁止隱式轉換的發生呢。

c++中提供了explicit關鍵字,在建構函式宣告的時候加上explicit關鍵字,能夠禁止隱式轉換。使用方法如下:

1

2

3

4

5

6

classtest

加上該關鍵字以後,如下的操作是合法的:

1

test(10);

如下的操作就變成非法的了:

1

test aa = 10;

這樣就可以有效的防止隱式轉換的發生,從而能夠對程式進行精確控制,達到提高品質的目的。

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 隱式轉換

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

C 隱式轉換

下面幾種型別的轉換被稱之為隱式轉換 隱式轉換可以在很多種情況下發生,包括函式子句呼叫,cast計算表示式和賦值語句。預定義的隱式轉換總會成功而且不會引發異常,適當合理的使用者自定義隱式轉換也可以展示出這些 特性。一.同一性轉換 同一性轉換把任何型別轉換為統一的型別。只有在所需轉換的實體可以被轉換到一...