天天看点

[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   ,如需转载请自行联系原作者

继续阅读