📄 tutcpp_constrdestinit.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.5 [fr] (WinNT; I) [Netscape]">
<meta name="Description" content="Tutorial C++ : Base">
<title>Base</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>Construction,
destruction et initialisation d'objets</font></font></font></b>
<blockquote><a href="TutCpp_ConstrDestInit.html#Constructeur par d閒aut/initialisant"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Constructeur par défaut / "initialisant"</font></font></font>
<br><a href="TutCpp_ConstrDestInit.html#Constructeur par recopie"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Constructeur par recopie</font></font></font>
<br><a href="TutCpp_ConstrDestInit.html#Mise en oeuvre"><img SRC="../Images/Puce2.gif" NOSAVE BORDER=0 height=12 width=12></a><font face="Verdana"><font color="#1F3D61"><font size=-1>
Mise en oeuvre</font></font></font></blockquote>
</td>
</tr>
</table></center>
<br>
<br>
<center><table BORDER=0 COLS=1 WIDTH="80%" >
<tr>
<td><a NAME="Constructeur par d閒aut/initialisant"></a><b><font face="Verdana"><font color="#1A3251"><font size=+1>Constructeur
par défaut/initialisant</font></font></font></b>
<blockquote><b><font face="Verdana"><font color="#1A3251">Constructeurs
simples</font></font></b>
<br><font face="Verdana"><font color="#1A3251">Nous avons aborder précédemment
la possibilité d'initialiser un objet lors de sa construction, ou
encore de proposer un constructeur par défaut. Nous allons dans
ce chapitre généraliser le principe tout en l'approfondissant.</font></font>
<p><font face="Verdana"><font color="#1A3251">Tout d'abord, il faut bien
comprendre l'intérêt de la chose : un constructeur initialisant
permet comme son nom l'indique d'initialiser les données membre,
que ces valeurs soient entrées par l'utilisateur, ou bien qu'elles
soient par défaut. Les destructeur quant à lui est appelé
à la fin de la vie de l'objet, de façon automatique ou non
(si l'objet est un pointeur).</font></font>
<br><font face="Verdana"><font color="#1A3251">Ceci prend toute son importance
dans le cas d'un objet qui contient lui-même des données de
type pointeur. Prenons par exemple une classe <b>Vecteur</b> qui gère
un vecteur mémoire d'entiers. Nous allons essayer d'intégrer
dans un premier temps :</font></font>
<ul>
<li>
<i><font face="Verdana"><font color="#1A3251">un <b>constructeur initialisant</b>,
connaissant la <b>taille</b> du vecteur,</font></font></i></li>
<li>
<i><font face="Verdana"><font color="#1A3251">un <b>destructeur</b>,</font></font></i></li>
<li>
<i><font face="Verdana"><font color="#1A3251">une méthode de <b>lecture</b>
d'une valeur dans le vecteur,</font></font></i></li>
<li>
<i><font face="Verdana"><font color="#1A3251">---------------- d'<b>écriture</b>
---------------------------------,</font></font></i></li>
<li>
<i><font face="Verdana"><font color="#1A3251">une méthode qui renvoie
la <b>taille </b>du vecteur.</font></font></i></li>
</ul>
<font face="Verdana"><font color="#1A3251">Dans la mesure où vous
devriez être capable de réaliser cette classe, essayez de
la concevoir tout seul dans un premier temps...</font></font>
<div align=right><font face="Verdana"><font color="#1A3251"><font size=-1>>
<a href="#Solution">Aller
à la solution</a> <</font></font></font></div>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<p><a NAME="Solution"></a><b>Solution</b>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="85%" BGCOLOR="#DBDBEE" >
<tr>
<td><tt><font color="#3333FF">#include</font> <iostream.h></tt>
<p><tt><font color="#3333FF">class</font> Vecteur</tt>
<br><tt>{</tt>
<br><tt> <font color="#3333FF">int</font> *pVecteur;</tt>
<br><tt> <font color="#3333FF">int</font> nTaille;</tt>
<p><tt><font color="#3333FF">public</font> :</tt>
<br><tt> Vecteur(<font color="#3333FF">int</font>);
<i><font color="#006600">//
Construction connaissant la taille du vecteur</font></i></tt>
<br><tt> ~Vecteur(); <i><font color="#006600">//
Destruction</font></i></tt>
<p><tt> <font color="#3333FF">int</font> GetAt(<font color="#3333FF">int</font>
ind) <i><font color="#006600">// Lecture
de valeur en "inline"</font></i></tt>
<br><tt> {</tt>
<br><tt> <font color="#3333FF">if</font>(
ind>=0 && ind<nTaille )</tt>
<br><tt>
<font color="#3333FF">return</font> pVecteur[ind];</tt>
<br><tt> <font color="#3333FF">else</font></tt>
<br><tt> <i><font color="#006600">//
comportement indéfini, pour l'instant retour 0;</font></i></tt>
<br><tt>
<font color="#3333FF">return</font> 0;</tt>
<br><tt> }</tt>
<br><tt> <font color="#3333FF">void</font> SetAt(<font color="#3333FF">int</font>
ind, <font color="#3333FF">int</font> val) <i><font color="#006600">//
Ecriture de valeur</font></i></tt>
<br><tt> {</tt>
<br><tt> <font color="#3333FF">if</font>(
ind>=0 && ind<nTaille )</tt>
<br><tt>
pVecteur[ind]=val;</tt>
<br><tt> }</tt>
<br><tt> <font color="#3333FF">int</font> Size(){
<font color="#3333FF">return</font>
nTaille; }</tt>
<br><tt>};</tt>
<p><tt>Vecteur::Vecteur(<font color="#3333FF">int</font> Taille)</tt>
<br><tt>{</tt>
<br><tt> <i><font color="#006600">// Aucun contrôle
de taille n'est fait pour simplifier</font></i></tt>
<br><tt> nTaille = Taille;</tt>
<br><tt> pVecteur = <font color="#3333FF">new</font>
int[nTaille];</tt>
<br><tt>}</tt>
<br><tt>Vecteur::~Vecteur()</tt>
<br><tt>{</tt>
<br><tt> <font color="#3333FF">delete</font> pVecteur;</tt>
<br><tt>}</tt>
<p><tt><font color="#3333FF">void</font> main()</tt>
<br><tt>{</tt>
<br><tt> Vecteur *v;</tt>
<br><tt> v = <font color="#3333FF">new</font> Vecteur(10);</tt>
<br><tt> <font color="#3333FF">for</font>( <font color="#3333FF">int</font>
i=0; i<v->Size(); i++ )</tt>
<br><tt> v->SetAt(i,
i*i-i);</tt>
<br><tt> <font color="#3333FF">for</font>( i=0;
i<v->Size(); i++ )</tt>
<br><tt> cout <<
v->GetAt(i) << <font color="#CC6600">" "</font>;</tt>
<br><tt> cout << endl;</tt>
<br><tt> <font color="#3333FF">delete</font> v;</tt>
<br><tt>}</tt></td>
</tr>
</table>
<p><b><font face="Verdana"><font color="#1A3251">Le pourquoi du comment</font></font></b>
<br><font color="#1A3251"><font face="Verdana">Il faut bien comprendre
le rôle du destructeur. Un destructeur de classe est appelé
à la destruction de l'objet, c'est-à-dire à la fin
du bloc dans lequel il a été instancié, ou bien à
un endroit spécifié par l'utilisateur, si l'objet a été
créé dynamiquement (appel à un </font><tt><font size=+1>delete</font></tt><font face="Verdana">
à ce moment là).</font></font>
<br><font face="Verdana"><font color="#1A3251">Mais le destructeur détruit
*seulement* l'objet, soit la mémoire allouée pour les membres.
En outre, il ne peut pas savoir que la classe est composée de pointeurs
et qu'une allocation mémoire a été effectuée
vers tel segment mémoire. C'est au créateur de la classe
qu'il advient de spécifier la désallocation des pointeurs
(tout comme l'allcoation d'ailleurs).</font></font><font face="Verdana"><font color="#1A3251"></font></font>
<p><font face="Verdana"><font color="#1A3251">Quant au <i>main</i>, il
est vraiment très simple. Il se propose juste de créer un
objet de type <i>Vecteur</i>, dynamiquement, de le remplir avec différentes
valeurs, puis de les afficher.</font></font>
<br><font face="Verdana"><font color="#1A3251">Pour comprendre un peu le
fonctionnement de la classe, essayez d'autres opérations telles
que différentes créations d'objets statiquement et dynamiquement.</font></font></blockquote>
<a NAME="Constructeur par recopie"></a><b><font face="Verdana"><font color="#1A3251"><font size=+1>Constructeur
par recopie</font></font></font></b>
<blockquote><font face="Verdana"><font color="#1A3251">Reprenons notre
classe <i>Point</i>. Nous avons donc déjà deux constructeurs,
à savoir un par défaut et un autre par initialisation des
coordonnées.</font></font>
<br><font face="Verdana"><font color="#1A3251">Il apparaît qu'il
pourrait être intéressant de réaliser un constructeur
à partir d'un point !</font></font>
<br><font face="Verdana"><font color="#1A3251">C++ permet cette fonctionnalité
par défaut, en voici l'exemple :</font></font>
<br>
<table BORDER=0 CELLSPACING=0 CELLPADDING=3 COLS=1 WIDTH="80%" BGCOLOR="#DBDBEE" >
<tr>
<td><i><tt><font color="#006600">// Définition de la classe Point</font></tt></i>
<br><tt><font color="#1A3251">...</font></tt>
<br><tt><font color="#1A3251"> Point pt(1,2);</font></tt>
<br><tt><font color="#1A3251"> Point pt2(pt); </font><i><font color="#006600">//
Construction par recopie de Point</font></i></tt>
<br><tt><font color="#1A3251">...</font></tt></td>
</tr>
</table>
<font face="Verdana"><font color="#1A3251">Il est possible de redéfinir
ce constructeur. Bien entendu, il faut qu'il est un intérêt
quelconque.</font></font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -