📄 tutcpp_notionclasse.html
字号:
<br><tt><font color="#1A3251"> y += b;</font></tt>
<br><tt><font color="#1A3251">}</font></tt>
<br><tt><font color="#3333FF">void</font><font color="#1A3251"> Point::Affiche()</font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#1A3251"> cout << x
<< </font><font color="#CC6600">", "</font><font color="#1A3251">
<< y << endl;</font></tt>
<br><tt><font color="#1A3251">}</font></tt>
<p><tt><font color="#3333FF">void</font><font color="#1A3251"> main()</font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#1A3251"> Point p;</font></tt>
<br><tt><font color="#1A3251"> p.Init(3,4);</font></tt>
<br><tt><font color="#1A3251"> p.Affiche();</font></tt>
<br><tt><font color="#1A3251"> p.Deplace(4,6);</font></tt>
<br><tt><font color="#1A3251"> p.Affiche();</font></tt>
<br><tt><font color="#1A3251">}</font></tt></td>
</tr>
</table>
<p><font color="#1A3251"><font face="Verdana">Vous avez remarqué
la présence du "</font><b><tt><font size=+1>Point::</font></tt></b><font face="Verdana">"
qui signifie que la fonction est en faite une méthode de la classe
<i>Point</i>.
Le reste est complètement identique. La seule différence
entre ces 2 programmes vient du fait qu'on dit que les méthodes
du premier programme (dont l'implémentation est faite dans la classe),
sont "<b>inline</b>". Ceci signifie que chaque appel à la méthode
sera remplacé dans l'exécutable, par la méthode en
elle-même (un peu comme une <b>macro</b> en C). D'où un gain
de temps certain, mais une augmentation de la taille du fichier en sortie.</font></font>
<p><font color="#1A3251"><font face="Verdana">Mais la différence
entre une structure et une classe n'a pas encore été vraiment
détaillée. En effet, vous pourriez très bien compiler
le même source en retirant le terme "</font><tt><font size=+1>public</font></tt><font face="Verdana">"
et en remplaçant "</font><tt><font size=+1>class</font></tt><font face="Verdana">"
par "</font><tt><font size=+1>struct</font></tt><font face="Verdana">".</font></font>
<br><font face="Verdana"><font color="#1A3251">En fait, l'intérêt
réel du C++ tourne autour de cette notion importante d'encapsulation
de données. Dans l'exemple de la classe <i>Point</i>, nous n'avons
pour l'instant spécifier aucune protection de données ; vous
pouvez rajouter ces quelques lignes, sans erreur de compilation :</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#1A3251"> ...</font></tt>
<br><tt><font color="#1A3251"> p.x = 25; </font><font color="#009900">//
Accès aux variables de la classe point</font></tt>
<br><tt><font color="#1A3251"> p.y = p.x + 10;</font></tt>
<br><tt><font color="#1A3251"> cout << </font><font color="#CC6600">"le
point est en "</font><font color="#1A3251"> << p.x << </font><font color="#CC6600">",
"</font><font color="#1A3251"> << p.y << endl;</font></tt>
<br><tt><font color="#1A3251"> ...</font></tt></td>
</tr>
</table>
<p><font face="Verdana"><font color="#1A3251">L'encapsulation a pour objet
d'empêcher cela, afin de notamment limiter la nécessité
de compréhension d'un objet pour l'utilisateur. La classe devient
alors une espèce de "<i>boîte noire</i>" avec des interfaces
d'entrée et de sortie. D'où la déclaration suivante
:</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">private </font><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>
<p><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">void</font><font color="#1A3251">
Init(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Deplace(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Affiche();</font></tt>
<br><tt><font color="#1A3251">};</font></tt></td>
</tr>
</table>
<p><font color="#1A3251"><font face="Verdana">Il est alors interdit d'accéder
aux variables </font><tt><font size=+1>x</font></tt><font face="Verdana">
et </font><tt><font size=+1>y</font></tt><font face="Verdana"> qui sont
des membres "<b>privés</b>", en dehors de la classe <i>Point</i>
(elles restent accessibles dans les méthodes de Point !).</font></font>
<p><font face="Verdana"><font color="#1A3251">Il est également possible
d'effectuer une affection de classe, comme pour une structure C. Ceci a
le même effet puisque l'affectation a lieu sur les données
membre :</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#3333FF">#include</font><font color="#1A3251"> <iostream.h></font></tt>
<p><i><tt><font color="#006600">... // déclaration de la classe
point</font></tt></i>
<p><tt><font color="#3333FF">void</font><font color="#1A3251"> main()</font></tt>
<br><tt><font color="#1A3251">{</font></tt>
<br><tt><font color="#1A3251"> Point p;</font></tt>
<br><tt><font color="#1A3251"> p.Init(3,4);</font></tt>
<br><tt><font color="#1A3251"> p.Affiche();</font></tt>
<p><tt><font color="#1A3251"> Point p2;</font></tt>
<br><tt><font color="#1A3251"> p2 = p;</font></tt>
<br><tt><font color="#1A3251"> p2.Affiche();</font></tt>
<br><tt><font color="#1A3251">}</font></tt></td>
</tr>
</table>
</blockquote>
<a NAME="Constructeur et Destructeur"></a><b><font face="Verdana"><font color="#1A3251"><font size=+1>Constructeur
et Destructeur</font></font></font></b>
<blockquote><font face="Verdana"><font color="#1A3251">Au cours de l'élaboration
de cet exemple aussi simple que concret, vous vous êtes peut-être
dit qu'il serait intéressant d'initialiser l'objet au moment de
sa déclaration. En effet,il faut de toute façon généralement
utiliser tout de suite après la méthode "Init", alors pourquoi
ne pas faire d'une pierre deux coups ! Ceci est bien entendu possible en
C++ : il s'agit des constructeurs.</font></font>
<br><font face="Verdana"><font color="#1A3251">Voici comment nous pouvons
mettre en oeuvre un constructeur :</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><i><tt><font color="#006600"> // Ici le "<b>private</b>"
est optionnel dans la mesure où tout</font></tt></i>
<br><i><tt><font color="#006600"> // ce qui suit
la première accolade est privé par défaut</font></tt></i>
<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>
<p><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> Point(int, int);
</font><i><font color="#006600">//
Constructeur de la classe point</font></i></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">void</font><font color="#1A3251">
Init(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Deplace(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Affiche();</font></tt>
<br><tt><font color="#1A3251">};</font></tt></td>
</tr>
</table>
<p><font face="Verdana"><font color="#1A3251">Vous vous demandez sûrement
comment déclarer désormais, une variable de type <i>Point</i>
! Vous pensez peut-être pouvoir faire ceci :</font></font>
<p><tt><font color="#1A3251"><font size=+1>Point p;</font></font></tt>
<p><font face="Verdana"><font color="#1A3251">En fait, non. A partir du
moment où un constructeur est défini, il doit pouvoir être
appelé par défaut pour la création de n'importe quel
objet. Dans notre cas il faut par conséquent préciser les
paramètres, par exemple :</font></font>
<p><tt><font color="#1A3251"><font size=+1>Point p(4,5);</font></font></tt>
<p><font face="Verdana"><font color="#1A3251">Pour laisser plus de liberté,
et permettre une déclaration sans initialisation, il faut prévoir
un <b>constructeur par défaut</b> :</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>
<p><tt><font color="#3333FF">public</font><font color="#1A3251"> :</font></tt>
<br><tt><font color="#1A3251"> Point(); </font><i><font color="#006600">//
Constructeur par défaut</font></i></tt>
<br><tt><font color="#1A3251"> Point(int, int); </font></tt>
<br><tt><font color="#1A3251"> </font><font color="#3333FF">void</font><font color="#1A3251">
Init(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Deplace(</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"> </font><font color="#3333FF">void</font><font color="#1A3251">
Affiche();</font></tt>
<br><tt><font color="#1A3251">};</font></tt></td>
</tr>
</table>
<p><font face="Verdana"><font color="#1A3251">Tout comme il existe un constructeur,
on peut spécifier un destructeur. Ce dernier est appelé lors
de la destruction de l'objet, explicite ou non.</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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -