隱式類型轉換
C++ 中的類型是可以相互轉換的,編譯器會自動地轉換運算對象的類型:
- 在大多數的表達式中,比int類型小的整形值首先提升爲較大的整數類型
- 在條件判斷中,非布爾值轉換成布爾類型
- 初始化過程中,初始值轉換爲變量的類型;在賦值語句中,右側運算對象轉換成左側運行對象的類型。
- 如果算術運算或關係運算的運算對象有多種類型,需要轉換爲同一種類型
- 函數調用
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的作用。