📄 userdefinedconversions.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> 中有介绍过,所以您该提供的是一个自动型态转换,在需要的时候,编译器会根据您的自订型态转换,自动将您的自订型态转换为基本型态或您指定的型态。<br>
<br>
直接以实例说明如何自订型态转换:<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 > integer._value) {<br> return 1;<br> }<br> else if(_value < 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 <iostream> <br>#include "Integer.h"<br>using namespace std; <br><br>int main() {<br> Integer i1(10);<br> Integer i2(20);<br> <br> cout << i1.compareTo(i2) << endl;<br> <br> cout << i1 + 10 << 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;">
....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
operator Other() {</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
....</span><br style="font-weight: bold;">
<span style="font-weight: bold;">
}</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 + -