EXERCICE CORRIGE C++
// Fichier d’entête eleve.h
class Eleve {
protected:
char[25] matricule;
char[25] nom;
float note1;Analyse d'un Code en C++
float note2;
static int nombre_eleves;
public:
~Eleve(); // destructeur
Eleve();
Eleve(const Eleve &e);
Eleve(char* nom, float note1=0, float note2=0);
virtual void affichage() const;
char* getNom() const { return this→nom; }
void setNom(char* nom) { strcpy((*this).nom, nom); }
friend int operator==(const Eleve &e1, const Eleve &e2);
};
// Fichier d’implémentation eleve.cxx
#include "eleve.h"
#include
#include
#include
using namespace std;
int Eleve::nombre_eleves = 0;
Eleve::~Eleve() {}
Eleve::Eleve() {
this->matricule = nombre_eleves;
(this->).nom[0] = ' \0';
this->note1 = 0;
this->note2 = 0;
nombre_eleves++;
}
Eleve::Eleve(char* nom, float n1, float n2) {
(*this).matricule = nombre_eleves;
strcpy((*this).nom, nom);
(*this).note1 = n1;
(*this).note2 = n2;
nombre_eleves++;
}
Eleve::Eleve(Eleve &e) {
(*this).matricule = e.matricule;
strcpy((*this).nom, nom);
(*this).note1 = e.n1;
(*this).note2 = e.n2;
nombre_eleves++;
}
void Eleve::affichage() {
cout << "Eleve[";
cout << this->matricule << ",";
cout << this->nom << ",";
cout << this->note1 << ",";
cout << this->note2;
cout << "]";
}
// on n’a pas mis “Eleve::” devant “operator==”
// parce qu’elle n’est pas une fonction membre. C’est
// une fonction amie.
int Eleve::operator==(const Eleve &e1, const Eleve &e2) {
return strcmp(e1.matricule, e1.matricule) == 0;
}
// Fichier d’entête eleveEtranger.h
#include "eleve.h"
class EleveEtranger : public Eleve {
private:
char* nationality;
public:
void affichage();
~EleveEtranger(); // destructeur
EleveEtranger();
EleveEtranger(const EleveEtranger &e);
EleveEtranger(char* nom, char* nationality, float note1=0, float note2=0);
char* getNationality() const;
void setNationality(char* n);
};
// Fichier d’implémentation eleveEtranger.cxx
#include "eleveEtranger.h"
#include
#include
#include
using namespace std;
EleveEtranger::EleveEtranger() : Eleve() {
(this->nationality)[0] = ' \0';
}
EleveEtranger::EleveEtranger(char* nom, char* nationality, float n1, float n2) : Eleve(nom, n1, n2) {
strcpy((*this).nationality, nationality);
}
char* EleveEtranger::getNationality() {
return (*this).nationality;
}
void EleveEtranger::setNationality(char* n) {
strcpy((*this).nationality, n);
}
void EleveEtranger::affichage() {
cout << "EleveEtranger[";
cout << this->matricule << ",";
cout << this->nom << ",";
cout << this->note1 << ",";
cout << this->note2 << ",";
cout << this->nationality << "]";
}
// Fichier d’entête employe.h
class Employe {
protected:
char[25] matricule;
char[25] nom;
float salaire;
static int nombre_employes;
public:
~Employe(); // destructeur
Employe();
Employe(const Employe &e);
Employe(char* nom, float salaire=0);
char* getMatricule() const;
char* getNom() const { return this->nom; }
void setNom(char* nom);
virtual void affichage() const;
};
Partie I : Analyse du Code la Classe Eleve
1) Quelle est la signification de const dans l’entête du constructeur de recopie et des fonctions ?
2) Citer les attributs pour lesquels il n’y a pas d’accesseur.
3) Y a-t-il une méthode de classe (fonction membre statique) ?
4) Quel est l’intérêt de la variable statique nombre_eleves ?
5) Quelle est la signification de virtual dans l’entête de la fonction membre affichage ? Expliquer pourquoi on peut redéfinir (surcharge fonctionnelle) affichage() dans les classes dérivées de Eleve.
6) Pourquoi on ne peut pas redéfinir getNom() et setNom() dans les classes dérivées de Eleve.
7) La classe Eleve contient-elle une méthode abstraite ? Expliquer pourquoi la classe Eleve est instanciable (est une classe concrète).
8) Expliquer pourquoi la déclaration suivante est correcte : Eleve e("DUPON"). Si le deuxième et le troisième argument du constructeur à trois arguments de Eleve n’étaient pas optionnels, cette déclaration serait-elle correcte ?
9) Que faut-il faire pour rendre la méthode affichage() abstraite ? Qu’est-ce qu’une classe abstraite ? Une classe abstraite est-elle inconstatable ?
10) Modifier la définition de l’opérateur == en le considérant comme une méthode.
11) Y a-t-il une méthode dont un argument est passé par valeur ? par référence ? par pointeur ? On rappelle que :
(1) Dans le passage par valeur, le corps de la méthode travaille sur une copie de l’argument. Le constructeur de recopie est utilisé pour faire une copie de l’argument.
(2) Dans le passage par référence, le corps de la méthode travaille sur l’original de la variable référencée.
(3) Dans le passage par pointeur, le corps de la méthode travaille sur l’original de la variable pointée.
(4) La principale différence entre le passage par référence et le passage par pointeur provient de ce que le passage par référence est géré par le compilateur alors que le passage par pointeur est géré par le programmeur.