天天看點

[C++再學習系列] 隐式類型轉換與轉換操作符

  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   ,如需轉載請自行聯系原作者

繼續閱讀