2.3.4 Modification du programme : test de la copie

Nous allons quand même regarder si notre constructeur de copie fonctionne :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <iostream>
#include "shadok.h"

using namespace std;


int main(int argc, char** argv) {
	Shadok shadok;
	shadok.setNom("Shadoko");
	shadok.setAge(3);
	shadok.setType(ShadokOption::SHADOKDUHAUT);
	shadok.parler();
	
	Shadok clone(shadok);
	clone.parler();
	
	return 0;
}

On copie le shadok dans un autre shadok et on le fait se présenter.

Recompilons avec g++ :

g++ -Wall shadok.cpp main.cpp -o test

Et exécutons le programme :

./test 
Bonjour, je m’appelle Shadoko et j'ai 3 ans.
je suis un Shadok du haut.
Bonjour, je m’appelle Shadoko et j'ai 3 ans.
je suis un Shadok du haut.

Bien, c'est plutôt une bonne nouvelle.

Ben oui, mais si je veux copier un Shadok autre qu'a sa constructions j'utilise le constructeur de copie aussi ?

Non, justement, vous n'avez pas le droit d'utiliser le constructeur ou le constructeur de copie (qui est un constructeur) sur une variable qui existe déjà, il faut utiliser l'opérateur =.

Et bien soyons fous, utilisons l'opérateur = :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <iostream>
#include "shadok.h"

using namespace std;


int main(int argc, char** argv) {
	Shadok shadok;
	shadok.setNom("Shadoko");
	shadok.setAge(3);
	shadok.setType(ShadokOption::SHADOKDUHAUT);
	shadok.parler();
	
	Shadok clone;
	clone = shadok;
	
	clone.parler();
	
	return 0;
}

Compilons le tout :

g++ -Wall shadok.cpp main.cpp -o test

Et exécutons le programme :

./test 
Bonjour, je m’appelle Shadoko et j'ai 3 ans.
je suis un Shadok du haut.
Bonjour, je m’appelle Shadoko et j'ai 3 ans.
je suis un Shadok du haut.

Et bien ça fonctionne, et alors ?

Et alors, est-ce vous avez vu un opérateur = définit quelque part ?

Heu, non.

Et justement, c'est un opérateur définit par défaut qui copie les attributs de la classe.

Et bien, c'est très bien tout ça.

Sauf qu'il est toujours mieux de savoir ce que l'on fait, je vous ai dit que l'opérateur = par défaut copiait les attributs, mais vous le voulez pas forcément copier un attribut, ou pas le copier, s'il s'agit d'un pointeur, vous voudriez peut-être copier l'espace mémoire qui sur lequel il pointe.

Enfin, tout ça pour dire qu'il faut redéfinir les opérateurs que l'on utilise.

Et bien soit, comment on fait ?