C++
5ème cours
Patrick Reutermaître de conférences
http://www.labri.fr/~preuter/c++
Les classes
• class Matrix2x2 { .. }
– Définition : fichier en-tête Matrix2.2.h (avec les prototypes des méthodes/fonctions membres)
– Implémentation : fichier source Matrix2x2.cpp (avec les implémentations des méthodes/fonctions membres)
• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };
• #endif // define MATRIX_H
• Attributs ou propriétés
• Méthodes ou fonctions membres
• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };
• #endif // define MATRIX_H
Encapsulation
• privatePropriétés etfonctions qui nepeuvent pas êtreaccédées en dehors de la classe
• public Propriétés et fonctions peuvent être accédées en dehors de la classe
• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };
• #endif // define MATRIX_H
• Constructeurest appelé lors dela création d’un objet de la classe,porte le même nomque la classe
• Destructeur est appelé lors de la destruction d’un objet de la classe, porte le même nom que la classe précédé d'un tilde ~ (explicitement par delete p.ex.)
• #ifndef MATRIX2x2_H• #define MATRIX2x2_H• class Matrix2x2 { • private: • float _matrix[2][2];• public: • // constructeur par defaut• Matrix2x2(); • // constructeur• Matrix2x2(const float e00, const float e01, const float e10, const float e11);• // destructeur par defaut• ~Matrix2x2(); • // Accès aux éléments • float getElement(const unsigned int line, const unsigned int column) const; • // Affecter les éléments • void makeZero();• // Affecter les éléments • void makeIdentity();• // Affecter les éléments • void setElement( const unsigned int line, • const unsigned int column, const float value);• // Affecter les éléments • void setElements( const float e00, const float e01,• const float e10, const float e11);• • // Calculer le determinant • float determinant() const;• • void afficher() const;• • Matrix2x2 addition (const Matrix2x2 matrix) const;• Matrix2x2 operator+(const Matrix2x2 matrix) const;• Matrix2x2 multiplication(const float k) const;• Matrix2x2 operator*(const float k) const;• };
• #endif // define MATRIX_H
• AccesseursFonctions membresqui permettent d’accéder auxdonnées membres(get
• Mutateur Fonctions membres qui permettent de modifier les données membres
(set)
Surdéfinition d’operateurs
• Binaire (p.ex. 2+3 = 5)
• Unaire (p.ex. -3)
Opérateur binaire
Matrix2x2 addition (const Matrix2x2 matrix) const;Matrix2x2 operator+(const Matrix2x2 matrix) const;
• la syntaxe de l'opération + est semblable à celle de addition().
• matrix est le paramètre de l'opérateur +.
• lorsque l'on écrit A=B*C, – l'opérateur + est appelé pour l'objet B qui se trouve à gauche de
+; à l'appel de cette opération, le paramètre de la fonction se trouve à droite de *. (alors C)
• les symboles possibles pour un opérateur binaire sont: (),[ ], -> , *,/,%,+,-, <<,>>,<, <=,>,>=,==,!=,&,, ||,&&,|,=, +=,-=,*=,/=,%=,&=,=,|=,<<=,>>=,et la virgule ,.
Surdéfinition d’operateurs
Operateur unaire
Matrix2x2 operator-() const;
–W=-V • la seule entrée de - est l'objet V de la classe qui
se trouve à droite. (il n'y a pas d'entrée à gauche).
– Les symboles possibles pour un opérateur unaire sont:
+,-,++,-,!,~,*,&,new,new[],delete,(cast)
Surdéfinition d’operateurs
Les flots << et >>
• Rappel : Flot de sortie
std::cout << "Hello World" << std::endl;
• Rappel : Flot d’entrée
int x;
std::cin >> x;
Operateur<<
Fichier .h (en dehors de classe { .. }
std::ostream& operator<<(std::ostream& f, Matrix2x2 matrix);
Fichier .cpp
std::ostream& operator<<(std::ostream& f, Matrix2x2 matrix)
{
return f << "((" << matrix.getElement(0,0) << "," << matrix.getElement(0,1)
<<"),(" << matrix.getElement(1,0) << ", " << matrix.getElement(1,1) << "))";
}
Surdéfinition d’operateurs
Ecrire dans un fichier
• void Matrix2x2::save(std::string nomFichier) const• {• std::ofstream fichierSortie(nomFichier.c_str());• fichierSortie << _matrix[0][0];• fichierSortie << " ";• fichierSortie << _matrix[0][1];• fichierSortie << " ";• fichierSortie << _matrix[1][0];• fichierSortie << " ";• fichierSortie << _matrix[1][1];• }
Flots et fichiers
Ecrire dans un fichier
• void Matrix2x2::save(std::string nomFichier) const• {• std::ofstream fichierSortie(nomFichier.c_str());• if ( !fichierSortie )• {• std::cerr << "Erreur d'ouverture\n";• return; • }• fichierSortie << _matrix[0][0];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[0][1];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }•
Flots et fichiers• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[1][0];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << " ";• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• fichierSortie << _matrix[1][1];• if ( !fichierSortie )• {• std::cerr << "Erreur d'écriture\n";• return; • }• }
Lire dans un fichier
• void Matrix2x2::load(std::string nomFichier)• {• std::ifstream fichierEntree(nomFichier.c_str());• fichierEntree >> _matrix[0][0];• fichierEntree >> _matrix[0][1];• fichierEntree >> _matrix[1][0];• fichierEntree >> _matrix[1][1];• }
Flots et fichiers
Lire dans un fichier
• void Matrix2x2::load(std::string nomFichier)• {• std::ifstream fichierEntree(nomFichier.c_str() );• if ( !fichierEntree )• {• std::cerr << "Erreur d'ouverture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[0][0] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[0][1] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[1][0] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• if ( ! ( fichierEntree >> _matrix[1][1] ) )• {• std::cerr << "Erreur de lecture\n";• return;• }• • }
Flots et fichiers
Récapitulatif
• Types de base (bool, unsigned char, signed char, unsigned int, float, double)
• Type enumerateur enum t_etat {gaz=0, solide=1, liquide=4};
• Type tableau type nom_du_tableau[taille]; - structure de données la plus connu- structure homogène, chaque élément est du même type
• Organisation de la mémoire
Déclaration de variables
int counter;
float diviseur;
char c;
double precision;
string nom;
bool masculin;
diviseur = 1.1;compteur = 1;Nom = « Gerhard »;
// Nombre entier
// Nombre à virgule flottante
// Nombre à virgule flottante avec double précision
// caractère
// Chaîne de caractère
// VRAI/FAUX
Mémoire vive
Proc 64bit
2,93 GHz : 2,93 Giga-Instructions par seconde
Organisation de la mémoirechar jours[13]; {13 octets, statique!}
jours[1]=31; jours[2]=30; …
#0
jours[1] #2001
...
#536.870.910#536.870.911
...
jours[3] #2003
jours[12] #2012
...
jours[2] #2002312831
31
...jours[0] #2000
Occupe de la place successivedans la mémoire
jours[index] #(2000+index)
Organisation de la mémoire
char a;
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
Organisation de la mémoirechar a;a = 97;
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Organisation de la mémoirechar a;a = 97;
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Comment connaître l’adresse de a ? &a
Organisation de la mémoirechar a;a = 97;p_a = &a; { Sauvegarder l’adresse }
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
#1.000
...
97
Comment connaître l’adresse de a ? &a
char a;char *p_a; {4 octets, lire : pointeur vers a}a = 97;p_a = &a; { Sauvegarder l’adresse }
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
p_a #1.0000
97
Comment connaître l’adresse de a ? Addr(a)
p_a #1.001p_a #1.002p_a #1.003
4
00
« p_a pointe vers a »
char a;
char *p_a; {4 octets, lire : pointeur vers a}
a = 97;
p_a = &a; { Sauvegarder l’adresse }
*p_a = 10;
a = 10; { Déréférencement }
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
p_a #1.0000
10
Comment connaître l’adresse de a ?&a
p_a #1.001p_a #1.002p_a #1.003
4
00
char *p_a; {4 octets, lire : pointeur vers a}
p_a = new p_a;
*p_a = 10;
#0#1#2#3
*p_a #4#5
...
#536.870.910#536.870.911
p_a #1.0000
10
Comment connaître l’adresse de a ?&a
p_a #1.001p_a #1.002p_a #1.003
4
00
char a;
char *p_a; {4 octets, lire : pointeur vers a}
a = 97;
p_a = &a; { Sauvegarder l’adresse }
*p_a = 10;
a = 10; { Déréférencement }
#0#1#2#3
a #4#5
...
#536.870.910#536.870.911
p_a #1.0000
10
Comment connaître l’adresse de a ?&a
p_a #1.001p_a #1.002p_a #1.003
4
00
Tableaux dynamiquesL’operateur new crée un objet en mémoire et
renvoie un pointeur vers l'adresse de cet objet. • char* jours;• jours = new char[13];• • jours[1] = 31;• jours[2] = 28;• jours[3] = 31;
• char *jours;• jours = new char[13];•
#0#1#2#3
&jours #4#5
...
#536.870.910#536.870.911
jours[0] #1.00031jours[1] #1.001
jours[2] #1.002jours[3] #1.003
0
2831
Tableau dynamique• const int WIDTH = 800;• const int HEIGHT = 600;
• int i, x, y; char **tab; // le tableau à 2 dimensions = pointeur de pointeur
• tab = new char*[WIDTH]; • • for( i=0; i<WIDTH; i++ )
tab[i] = new char[HEIGHT];
• // Exemple d'affectation dans le tableau -> c'est identique à // l'ancienne méthode
• for( y=0; y<HEIGHT; y++ ) for( x=0; x<WIDTH; x++ ) tab[x][y] = '1' + x+y;
• // Libération de la mémoire for( i=0; i<WIDTH; i++ ) delete []tab[i]; delete []tab; }
Format de fichier PPM
P3#exemple.ppm 4 4 255 0 0 0 16 16 16 32 32 32 48 48 48 64 64 64 80 80 80 96 96 96 112 112 112 128 128 128 143 143 143 159 159 159 175 175
175 191 191 191 207 207 207 223 223 223 239 239
239
Top Related