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

📄 overloadoperator.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>重载运算子</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:&nbsp;重载运算子</a></h1>

在C++中,预设除了基本资料型态可以使用运算子进行运算,例如int、double、char等,如果您要将两个物件相加,预设上是不可行的。 <br>

<br>

然而很多情况下,您会想要将两个物件的某些属性值相加,并传回运算后的结果,例如座标相加,如果您定义了Point2D类别,当中有x与y两个属性成员,
您会想要透过+或-运算子的动作得到座标相加或相减的动作,或是透过++与--来达到递增或递减的运算,在C++中,这可以透过重载运算子来达到目的。
<br>

<br>

运算子的重载其实是函式重载的一个延伸应用,您指定要重载哪一个运算子,并在类别中定义运算子如何动作,运算子重载的语法宣告如下所示: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">传回值
类别名称::operator#(参数列) { </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">

<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">&nbsp; &nbsp; //
实作重载内容 </span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">

<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">}</span><br>

</div>

<br>

其中#中需指明您要重载哪一个运算子,例如重载一个+运算子,#处就替换为+运算子。<br>

<br>

如果要重载++或--运算子,必须要注意到前置与后置的问题,例如一个变数x,您知道++前置时(++x)与++后置时(x++)实际上意义并不相同,在
重载时为了要区别前置与后置,C++中使用一个int参数来作区别:<br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">传回型态
operator++();&nbsp; // 前置,例如++x</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">

<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">传回型态
operator++(int); // 后置,例如x++</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">

<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">传回型态 operator--();&nbsp; // 前置 ,例如 --x</span><br style="font-weight: bold; font-family: Courier New,Courier,monospace;">

<span style="font-weight: bold; font-family: Courier New,Courier,monospace;">传回型态 operator--(int); // 后置,例如 x--</span><br>

</div>

<br>

在后置中会传入一个0,但实质上没有作用,只是作为识别前置与后置之用,通常在重载++与--运算子时,前置与后置都要重载;下面这个范例告诉您如何重载
+与-运算子,以及++与--运算子,以完成上面所提及的座标相加、相减、递增、递减的运算: <br>

<ul>

  <li>Point2D.h</li>

</ul>

<pre>class Point2D { <br>public: <br>    Point2D();<br>    Point2D(int, int);<br>    int x() {return _x;} <br>    int y() {return _y;} <br>    Point2D operator+(const Point2D&amp;);  // 重载+运算子 <br>    Point2D operator-(const Point2D&amp;);  // 重载-运算子 <br>    Point2D&amp; operator++();         // 重载++前置,例如 ++p <br>    Point2D operator++(int);      // 重载++后置,例如 p++<br>    Point2D&amp; operator--();         // 重载--前置,例如 --p <br>    Point2D operator--(int);      // 重载--后置,例如 p--<br>    <br>private:<br>    int _x;<br>    int _y;        <br>}; <br></pre>

<br>

<ul>

  <li>Point2D.cpp</li>

</ul>

<pre>#include "Point2D.h"<br><br>Point2D::Point2D() {<br>    _x = 0;<br>    _y = 0;<br>}<br><br>Point2D::Point2D(int x, int y) {<br>    _x = x;<br>    _y = y;<br>}<br><br>Point2D Point2D::operator+(const Point2D &amp;p) { <br>    Point2D tmp(_x + p._x, _y + p._y); <br>    return tmp; <br>} <br><br>Point2D Point2D::operator-(const Point2D &amp;p) { <br>    Point2D tmp(_x - p._x, _y - p._y); <br>    return tmp; <br>} <br><br>Point2D&amp; Point2D::operator++() { <br>    _x++; <br>    _y++; <br><br>    return *this; <br>} <br><br>Point2D Point2D::operator++(int) { <br>    Point2D tmp(_x, _y); <br>    _x++; <br>    _y++; <br><br>    return tmp; <br>} <br><br>Point2D&amp; Point2D::operator--() { <br>    _x--; <br>    _y--; <br><br>    return *this; <br>} <br><br>Point2D Point2D::operator--(int) { <br>    Point2D tmp(_x, _y); <br>    _x--; <br>    _y--; <br><br>    return tmp; <br>} <br></pre>

<ul>

</ul>

<ul>

</ul>

<ul>

  <li>main.cpp</li>

</ul>

<pre>#include &lt;iostream&gt;<br>#include "Point2D.h"<br>using namespace std;<br><br>int main() {<br>   Point2D p1(5, 5);<br>   Point2D p2(10, 10);<br>   Point2D p3; <br><br>    p3 = p1 + p2; <br>    cout &lt;&lt; "p3(x, y) = (" <br>         &lt;&lt; p3.x() &lt;&lt; ", " &lt;&lt; p3.y() <br>         &lt;&lt; ")" &lt;&lt; endl; <br><br>    p3 = p2 - p1; <br>    cout &lt;&lt; "p3(x, y) = (" <br>         &lt;&lt; p3.x() &lt;&lt; ", " &lt;&lt; p3.y() <br>         &lt;&lt; ")" &lt;&lt; endl;<br>         <br>    p3 = ++p1;<br>    cout &lt;&lt; "p3(x, y) = (" <br>         &lt;&lt; p3.x() &lt;&lt; ", " &lt;&lt; p3.y() <br>         &lt;&lt; ")" &lt;&lt; endl;    <br><br>    return 0;<br>}</pre>

<span class="postbody"><br>

执行结果:</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);">p3(x, y) = (15, 15)<br>

p3(x, y) = (5, 5)<br>

p3(x, y) = (6, 6)<br>

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

    </tr>

  
  </tbody>
</table>

<br>

在重载+与-号运算子时,所接收的物件引数来自被重载的运算子右边,例如在程式码中加法运算时,+右边是p2,所以传入的物件引数就是p2物件,减法运算
时-号右边是p1,所以传入的就是p1物件,在传入引数时,您使用传参考的方式进行,这可以省去物件复制的动作,您也可以不使用传参考,这对这个程式并不
成结果的差异,但使用传参考方式可以节省CPU在复制物件时的处理时间。 <br>

<br>

大部份的运算子都是可以被重载的,除了以下的运算子之外: <br>

<div style="margin-left: 40px;"><span style="font-weight: bold; font-family: Courier New,Courier,monospace;">.&nbsp;
&nbsp;::&nbsp; &nbsp;.*&nbsp; &nbsp;?:</span><br>

</div>

<br>

<br>

</body>
</html>

⌨️ 快捷键说明

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