C++ explicit 與 隱式類型轉換

隱式類型轉換

C++ 中的類型是可以相互轉換的,編譯器會自動地轉換運算對象的類型:

  1. 在大多數的表達式中,比int類型小的整形值首先提升爲較大的整數類型
  2. 在條件判斷中,非布爾值轉換成布爾類型
  3. 初始化過程中,初始值轉換爲變量的類型;在賦值語句中,右側運算對象轉換成左側運行對象的類型。
  4. 如果算術運算或關係運算的運算對象有多種類型,需要轉換爲同一種類型
  5. 函數調用

explicit

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

string的單參數構造函數定義如下。(basi_string 就是syring,在 stl_string_fwd.h 中有定義 typedef basic_string<char>    string;

  basic_string(const basic_string& __s) : _Base(__s.get_allocator()) 
    { _M_range_initialize(__s.begin(), __s.end()); }

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

在添加了explicit之後會怎樣?explicit的作用的抑制構造函數定義的隱式轉換,vector中的單參數構造函數添加了explicit定義。所以 vector<int> v = 1 ; 這種語句會出現編譯錯誤,我們只能夠使用 vector<int> v(1);

  explicit vector(size_type __n)
    : _Base(__n, allocator_type())
    { _M_finish = uninitialized_fill_n(_M_start, __n, _Tp()); }

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章