📄 overloadoperator.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: 重载运算子</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;"> //
实作重载内容 </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++(); // 前置,例如++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--(); // 前置 ,例如 --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&); // 重载+运算子 <br> Point2D operator-(const Point2D&); // 重载-运算子 <br> Point2D& operator++(); // 重载++前置,例如 ++p <br> Point2D operator++(int); // 重载++后置,例如 p++<br> Point2D& 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 &p) { <br> Point2D tmp(_x + p._x, _y + p._y); <br> return tmp; <br>} <br><br>Point2D Point2D::operator-(const Point2D &p) { <br> Point2D tmp(_x - p._x, _y - p._y); <br> return tmp; <br>} <br><br>Point2D& 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& 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 <iostream><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 << "p3(x, y) = (" <br> << p3.x() << ", " << p3.y() <br> << ")" << endl; <br><br> p3 = p2 - p1; <br> cout << "p3(x, y) = (" <br> << p3.x() << ", " << p3.y() <br> << ")" << endl;<br> <br> p3 = ++p1;<br> cout << "p3(x, y) = (" <br> << p3.x() << ", " << p3.y() <br> << ")" << 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;">.
:: .* ?:</span><br>
</div>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -