⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userdefinedconversions.html

📁 关于 C++ 的历史无须我来介绍了
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>



  
  
  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">



  
  
  
  <link rel="stylesheet" href="css/print.css" type="text/css">



  
  
  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">



  
  
  
  <title>使用者自订型态转换(User-Defined Conversions)</title>
</head>


<body>



<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>



<h1><a href="CppGossip.html">C++
Gossip: 使用者自订型态转换(User-Defined Conversions)</a></h1>



在 <a href="friendOverLoadOperator.html">使用 friend 函式重载运算子</a>
中,您使用friend函式解决基本型态与自订型态相加、相减等运算的问题,也就是像10 + someObject、10 - someObject这类的运算可透过friend函式来重载相对应的运算子。<br>


<br>


然而想想在更多的运算需求中,您可能对+、-、*、/、%等等的运算子都想有基本型态与自订型态运算的需求,为每一个需求都重载相对应的运算子似乎是不合
效率的,内建的型态转换行为在 <a href="ArithmeticOperator.html">算术(Arithmetic)运算、型态转换(Type
conversion)</a>&nbsp;中有介绍过,所以您该提供的是一个自动型态转换,在需要的时候,编译器会根据您的自订型态转换,自动将您的自订型态转换为基本型态或您指定的型态。<br>


<br>


&nbsp;直接以实例说明如何自订型态转换:<br>

<ul>

  <li>Integer.h</li>

</ul>



<pre>class Integer {<br>public:<br>    Integer(int value) : _value(value) {<br>    }<br>    <br>    int value() {<br>        return _value;<br>    }<br>    <br>    // 自订型态转换<br>    // 当需要将Integer转换为int时如何执行 <br>    operator int() {<br>        return _value;<br>    }<br>    <br>    int compareTo(Integer);<br>    <br>private:<br>    int _value;<br>};</pre>



<br>

<ul>

  <li>Integer.cpp</li>

</ul>



<pre>#include "Integer.h"<br><br>int Integer::compareTo(Integer integer) {<br>    if(_value &gt; integer._value) {<br>        return 1;<br>    }<br>    else if(_value &lt; integer._value) {<br>        return -1;<br>    }<br>    <br>    return 0;<br>}</pre>


<br>

Integer类别将int基本型态包装为物件,以提供更多物件导向上的操作行为,例如提供compareTo()函式支援两个Integer实例的比
较,而为了支援与int基本型态的直接算术行为,您使用operator
int()定义了如何转换,当编译器需要作int型态转换时,就会使用您自定义的行为,例如:
<ul>

  <li>main.cpp</li>

</ul>



<pre>#include &lt;iostream&gt; <br>#include "Integer.h"<br>using namespace std; <br><br>int main() {<br>    Integer i1(10);<br>    Integer i2(20);<br>    <br>    cout &lt;&lt; i1.compareTo(i2) &lt;&lt; endl;<br>    <br>    cout &lt;&lt; i1 + 10 &lt;&lt; endl;<br>    <br>    return 0;<br>}<br></pre>

<br>



<span class="postbody">
执行结果:</span><br>



<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">



  <tbody>



    <tr>



      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">-1<br>

20</span></small><span style="color: rgb(255, 255, 255);"><br>



      </span></td>



    </tr>



  
  
  
  </tbody>
</table>



<br>

operator后紧跟着的即是转换的目标型态,自定义型态转换不只可以转换至基本型态,您也可以指定转换为自订义型态,例如:<br>

<div style="margin-left: 40px; font-weight: bold; font-family: Courier New,Courier,monospace;"><span style="font-weight: bold;">class Some {</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
public:</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
&nbsp; &nbsp; ....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
&nbsp; &nbsp;&nbsp;operator Other() {</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
&nbsp; &nbsp; &nbsp; &nbsp; ....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
&nbsp;&nbsp; &nbsp;}</span><br style="font-weight: bold;">

<br style="font-weight: bold;">
<span style="font-weight: bold;">
};</span><br>

</div>

<br>

要注意的是转换函式不能有参数列。<br>



</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -