C explicit 與 隱式型別轉換

2021-10-07 15:54:38 字數 854 閱讀 1849

c++ 中的型別是可以相互轉換的,編譯器會自動地轉換運算物件的型別:

在大多數的表示式中,比int型別小的整形值首先提公升為較大的整數型別

在條件判斷中,非布林值轉換成布林型別

初始化過程中,初始值轉換為變數的型別;在賦值語句中,右側運算物件轉換成左側執行物件的型別。

如果算術運算或關係運算的運算物件有多種型別,需要轉換為同一種型別

函式呼叫

結合explicit關鍵字可以很好地理解第3點。比如有string str = "123";  這語句中就是隱式呼叫了string 類的單引數建構函式。

string的單引數建構函式定義如下。(basi_string 就是syring,在 stl_string_fwd.h 中有定義typedef basic_stringstring;

basic_string(const basic_string& __s) : _base(__s.get_allocator()) 

這個就是上面第3點的例子。

在新增了explicit之後會怎樣?explicit的作用的抑制建構函式定義的隱式轉換,vector中的單引數建構函式新增了explicit定義。所以 vectorv = 1 ; 這種語句會出現編譯錯誤,我們只能夠使用 vectorv(1);

explicit vector(size_type __n)

: _base(__n, allocator_type())

此前懷疑是由於string可能存在無引數建構函式,但是看原始碼發現string沒有無參的建構函式,進一步證實了explicit的作用。

c mysql型別轉換 MYSQL隱式型別轉換

前言 今天看了下團隊發的xctf高校戰疫的wp,這裡先喊一句。楊大樹師傅太強了orz 幾乎沒幫啥忙,簡單的題目都被師傅們秒了,我進度太慢,跟不上,後面難的題目基本動不了。再喊一遍,星盟的師傅tql。再接再厲,希望下次能上師傅們,幫到師傅們解題。mysql弱型別轉換 這裡本地搭建一下環境 用的老的語句...

隱式型別轉換 與 隱式型別轉換操作符

1 考慮下面的情況 有個person類,內部有個age欄位。正常情況下,定義和賦值為 person p person 8 p person 9 但是有個傢伙很懶,他想這麼寫 person p 8 p 9 這樣寫也是可以的,因為編譯器知道你的意圖,執行的時候會進行一次隱式型別轉換,中間適配乙個臨時物件...

C explicit關鍵字 禁止隱式轉換

explicit關鍵字是用來防止由建構函式定義的隱式轉換。要明白這個關鍵字的含義,首先我們要知道class型別的物件的隱式轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個隱式轉換。比如 class somebody intcompareto const somebody othe...