📄 tutcpp_surdefop.html
字号:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Author" content="Gwena雔 Brunet">
<meta name="GENERATOR" content="Mozilla/4.7 [fr] (WinNT; I) [Netscape]">
<meta name="Description" content="Tutorial C++ : Surd閒inition d'op閞ateur">
<title>Surdéfinition d'opérateur</title>
</head>
<body text="#000000" bgcolor="#E2E2F1" link="#0000FF" vlink="#800080" alink="#FF0080">
<center><table BORDER=0 CELLSPACING=0 CELLPADDING=0 COLS=2 WIDTH="95%" BGCOLOR="#F7F2F6" >
<tr>
<td WIDTH="100"><img SRC="../Images/Tutorial_LogoMini.jpg" NOSAVE height=120 width=120 align=ABSCENTER></td>
<td><b><font face="Verdana"><font color="#407AC3"><font size=+3>Surdéfinition
d'opérateur</font></font></font></b>
<blockquote><a href="TutCpp_SurdefOp.html#Comment 鏰 marche"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Comment ça marche</font></font></font>
<br><a href="TutCpp_SurdefOp.html#Op閞ateurs simples"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Opérateurs simples</font></font></font>
<br><a href="TutCpp_SurdefOp.html#Op閞ateur d'affectation"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Opérateur d'affectation</font></font></font></blockquote>
</td>
</tr>
</table></center>
<br>
<br>
<center><table BORDER=0 COLS=1 WIDTH="80%" >
<tr>
<td><a NAME="Comment 鏰 marche"></a><b><font face="Verdana"><font color="#1A3251"><font size=+1>Comment
ça marche</font></font></font></b>
<blockquote><font color="#1A3251"><font face="Verdana">Nous avons commencé
à réaliser une classe <i>Point</i> qui permet la recopie
d'objet. Mais jusqu'à maintenant, nous avons été obligés
de créer des méthodes telles que "</font><tt><font size=+1>Coincide</font></tt><font face="Verdana">"
qui vérifie que deux points sont égaux. Nous aurions pu également
réaliser une fonction membre qui ajoute un point à un autre
:</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#3333FF">class</font><font color="#1A3251"> <b>Point</b></font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#3333FF"> int</font><font color="#1A3251">
x;</font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">int</font><font color="#1A3251">
y;</font></tt>
<br><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> Point();</font></tt>
<br><tt><font color="#1A3251"> Point(</font><font color="#3333FF">int</font><font color="#1A3251">
a, </font><font color="#3333FF">int</font><font color="#1A3251"> b);</font></tt>
<br><tt><font color="#1A3251"> Point(</font><font color="#3333FF">const</font><font color="#1A3251">
Point & pt);</font></tt>
<br><tt><font color="#1A3251"> void Ajoute(const
Point & pt);</font></tt>
<br><tt><font color="#1A3251"> ... </font><i><font color="#006600">//
D'éventuelles autres méthodes</font></i></tt>
<br><tt><font color="#1A3251">};</font></tt></td>
</tr>
</table>
<p><font face="Verdana"><font color="#1A3251">Vous sentez alors qu'il serait
très appréciable et plus naturel de pouvoir faire quelque
chose comme :</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#1A3251"> Point a(1,2);</font></tt>
<br><tt><font color="#1A3251"> Point b(3,4);</font></tt>
<br><tt><font color="#1A3251"> Point c;</font></tt>
<br><b><tt><font color="#1A3251"> c = a + b;</font></tt></b></td>
</tr>
</table>
<p><font face="Verdana"><font color="#1A3251">C++ permet de réaliser
une surdéfinition des opérateurs de base, comme "<b>+</b>",
"<b>-</b>", "<b>*</b>", "<b>/</b>", "<b>&</b>", "<b>^</b>", etc. La
liberté étant totale, vous pouvez faire réellement
ce que vous voulez, par exemple une soustraction pour l'opérateur
d'addition et inversement. Mais il est clair qu'il est plus que conseillé
de respecter la signification de chacun des ces opérateurs.</font></font>
<br> </blockquote>
<a NAME="Op閞ateurs simples"></a><b><font face="Verdana"><font color="#1A3251"><font size=+1>Opérateurs
simples</font></font></font></b>
<blockquote><font face="Verdana"><font color="#1A3251">Mettre en oeuvre
les opérateurs simples est une opération assez rapide. Un
exemple est utile pour vous montrer comment on fait :</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#3333FF">class</font><font color="#1A3251"> <b>Point</b></font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#3333FF"> int</font><font color="#1A3251">
x;</font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">int</font><font color="#1A3251">
y;</font></tt>
<br><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> Point();</font></tt>
<br><tt><font color="#1A3251"> Point(</font><font color="#3333FF">int</font><font color="#1A3251">
a, </font><font color="#3333FF">int</font><font color="#1A3251"> b);</font></tt>
<br><tt><font color="#1A3251"> Point(</font><font color="#3333FF">const</font><font color="#1A3251">
Point & pt);</font></tt>
<br><tt><font color="#1A3251"> Point </font><font color="#3333FF">operator</font><font color="#1A3251">+(const
Point & a)</font></tt>
<br><tt><font color="#1A3251"> {</font></tt>
<br><tt><font color="#1A3251">
Point p;</font></tt>
<br><tt><font color="#1A3251">
p.x = a.x + x;</font></tt>
<br><tt><font color="#1A3251">
p.y = a.y + y;</font></tt>
<br><tt><font color="#1A3251">
</font><font color="#3333FF">return</font><font color="#1A3251"> p;</font></tt>
<br><tt><font color="#1A3251"> }</font></tt>
<br><tt><font color="#1A3251"> ... </font><i><font color="#006600">//
D'éventuelles autres méthodes</font></i></tt>
<br><tt><font color="#1A3251">};</font></tt></td>
</tr>
</table>
<p><font color="#1A3251"><font face="Verdana">Des explications sont nécessaires.
Tout d'abord, vous remarquerez le "</font><tt><font size=+1>const Point
& a </font></tt><font face="Verdana">". Ceci signifie que l'on passe
un point en paramètre (l'autre point de l'addition est en fait la
classe appelante elle-même). Ce dernier est transmis par référence,
afin d'éviter une recopie, lourde et moins rapide. Le "</font><tt><font size=+1>const</font></tt><font face="Verdana">"
est optionnel mais permet d'éviter de modifier les paramètres
et également autorise l'utilisation d'objets constants.</font></font>
<br><font color="#1A3251"><font face="Verdana">L'opérateur rend
un <i>Point</i>. En fait, on rend en fin de méthode le point qui
a été créé temporairement au départ
et qui contient la somme des deux paramètres. Plus exactement, on
rend une copie de cet objet, le retour de la fonction étant "</font><tt><font size=+1>Point</font></tt><font face="Verdana">",
et non "</font><tt><font size=+1>Point&</font></tt><font face="Verdana">"
ou "</font><tt><font size=+1>Point*</font></tt><font face="Verdana">".
Ceci est normal. Il faut savoir que l'objet créé dans la
méthode sera automatiquement détruit à la fin de cette
dernière. On ne peut bien évidemment pas rendre l'adresse
d'un objet qui sera détruit ! D'où la nécessité
d'une recopie.</font></font>
<p><font face="Verdana"><font color="#1A3251">Ce que nous avons mis en
oeuvre pour l'opérateur d'addition, nous pouvons en faire de même
pour tous les autres opérateurs "<i>simples</i>". Quelques exemples
:</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#3333FF">class</font><font color="#1A3251"> <b>Point</b></font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#3333FF"> int</font><font color="#1A3251"> x;</font></tt>
<br><tt><font color="#3333FF"> int</font><font color="#1A3251"> y;</font></tt>
<br><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> Point(){}</font></tt>
<br><tt><font color="#1A3251"> Point(</font><font color="#3333FF">int</font><font color="#1A3251">
a, </font><font color="#3333FF">int</font><font color="#1A3251"> b){ x=a;
y=b; }</font></tt>
<br><tt><font color="#1A3251"> Point </font><font color="#3333FF">operator</font><font color="#1A3251">
+(</font><font color="#3333FF">const</font><font color="#1A3251"> Point
& a);</font></tt>
<br><tt><font color="#1A3251"> Point </font><font color="#3333FF">operator</font><font color="#1A3251">
-(</font><font color="#3333FF">const</font><font color="#1A3251"> Point
& a);</font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">int operator</font><font color="#1A3251">==(</font><font color="#3333FF">const</font><font color="#1A3251">
Point & p);</font></tt>
<p><tt><font color="#1A3251"> </font><font color="#3333FF">void</font><font color="#1A3251">
Affiche()</font></tt>
<br><tt><font color="#1A3251"> {</font></tt>
<br><i><tt><font color="#006600"> // "<b>this</b>" est un pointeur
sur la classe même</font></tt></i>
<br><tt><font color="#1A3251"> cout << </font><font color="#3333FF">this</font><font color="#1A3251">
<< "->" << x << ", " << y << endl;</font></tt>
<br><tt><font color="#1A3251"> }</font></tt>
<br><tt><font color="#1A3251">};</font></tt>
<p><tt><font color="#1A3251">Point Point::</font><font color="#3333FF">operator</font><font color="#1A3251">
+(</font><font color="#3333FF">const</font><font color="#1A3251"> Point
& a)</font></tt>
<br><tt><font color="#1A3251">{ </font><i><font color="#006600">// <b>Addition</b>
de 2 points</font></i></tt>
<br><tt><font color="#1A3251"> Point p;</font></tt>
<br><tt><font color="#1A3251"> p.x = x + a.x;</font></tt>
<br><tt><font color="#1A3251"> p.y = y + a.y;</font></tt>
<p><tt><font color="#1A3251"> </font><font color="#3333FF">return</font><font color="#1A3251">
p;</font></tt>
<br><tt><font color="#1A3251">}</font></tt>
<br><tt><font color="#1A3251">Point Point::</font><font color="#3333FF">operator</font><font color="#1A3251">
-(</font><font color="#3333FF">const</font><font color="#1A3251"> Point
& a)</font></tt>
<br><tt><font color="#1A3251">{ </font><i><font color="#006600">// <b>Soustraction</b>
de 2 points</font></i></tt>
<br><tt><font color="#1A3251"> Point p;</font></tt>
<br><tt><font color="#1A3251"> p.x = x - a.x;</font></tt>
<br><tt><font color="#1A3251"> p.y = y - a.y;</font></tt>
<p><tt><font color="#1A3251"> </font><font color="#3333FF">return</font><font color="#1A3251">
p;</font></tt>
<br><tt><font color="#1A3251">}</font></tt>
<p><tt><font color="#3333FF">int</font><font color="#1A3251"> Point::</font><font color="#3333FF">operator</font><font color="#1A3251">==(</font><font color="#3333FF">const</font><font color="#1A3251">
Point & p)</font></tt>
<br><tt><font color="#1A3251">{ </font><i><font color="#006600">// <b>Egalité</b>
de 2 points (remplace "Coincide")</font></i></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">if</font><font color="#1A3251">(
x==p.x && y==p.y )</font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">return</font><font color="#1A3251">
1;</font></tt>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -