C++标準允許隐式類型轉換,即對特定的類,在特定條件下,某些參數或變量将隐形轉換成類對象(建立臨時對象)。如果這種轉換代價很大(調用類的構造函數),隐式轉換将影響性能。隐式轉換的發生條件:函數調用中,參數類型不比對,如果隐式轉換後能滿足類型比對條件,編譯器将啟用類型轉換。
控制隐式類型轉換的兩種途徑:
1) 減少函數調用的參數不比對情況:提供簽名(函數參數類型)與常見參數類型的精确比對的重載函數。
2) 限制編譯器的啟用隐式轉換:使用explicit限制的構造函數和具名轉換函數。
下面的例子将導緻隐式類型轉換:
1) 未限制的構造函數:
<code>class</code> <code>Widget {</code><code>// …</code>
<code> </code><code>Widget( unsigned</code><code>int</code> <code>factor );</code>
<code> </code><code>Widget(</code><code>const</code> <code>char</code><code>* name,</code><code>const</code> <code>Widget* other = 0 );</code>
<code>};</code>
2) 轉換操作符(conversion operators, 定義成operator T(),其中T為C++類型)
<code>class</code> <code>String {</code>
<code>public</code><code>:</code>
<code> </code><code>operator</code><code>const</code> <code>char</code><code>*(); </code><code>//在需要情況下,String 對象可以轉成const char*指針。</code>
上面的定義将使很多愚蠢的表達式通過編譯(編譯器啟用了隐式轉換)。
<code>Assume s1, s2 are Strings:</code>
<code>int</code> <code>x = s1 - s2; </code><code>// compiles; undefined behavior</code>
<code>const</code> <code>char</code><code>* p = s1 - 5; </code><code>// compiles; undefined behavior</code>
<code>p = s1 +</code><code>'0'</code><code>; </code><code>//compiles; doesn't do what you'd expect</code>
<code>if</code><code>( s1 ==</code><code>"0"</code> <code>) { ...} </code><code>// compiles; doesn't do what you'dexpect</code>
合理的解決方案:
1) 預設時,為單參數的構造函數加上explicit:
<code> </code><code>explicit</code> <code>Widget( unsigned</code><code>int</code> <code>factor );</code>
<code> </code><code>explicit</code> <code>Widget(</code><code>const</code> <code>char</code><code>*name,</code><code>const</code> <code>Widget* other = 0 );</code>
2)使用提供的轉換具名函數代替轉換操作符(conversion operators):
<code>class</code> <code>String {</code><code>// …</code>
<code> </code><code>const</code> <code>char</code><code>* as_char_pointer()</code><code>const</code><code>; </code><code>// in the grand c_strtradition</code>
---------------------------------------------------
歡迎轉載,請注明作者和出處。
本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2010/11/26/implicit_conversion_and_conversion_operator.html ,如需轉載請自行聯系原作者