43
C++ 6ème cours Patrick Reuter maître de conférences http://www.labri.fr/~preuter/c++

C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Embed Size (px)

Citation preview

Page 1: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

C++

6ème cours

Patrick Reutermaître de conférences

http://www.labri.fr/~preuter/c++

Page 2: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Aujourd’hui

• Pointeurs

• Appel de fonctions

Page 3: C++ 6ème cours Patrick Reuter maître de conférences 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)

Page 4: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• #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

Page 5: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• #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

Page 6: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• #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.)

Page 7: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• #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)

Page 8: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Page 9: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Page 10: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Mémoire vive

Proc 64bit

2,93 GHz : 2,93 Giga-Instructions par seconde

Page 11: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoire

char a;

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

Page 12: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Organisation de la mémoirechar a;a = 97;

#0#1#2#3

a #4#5

...

#536.870.910#536.870.911

#1.000

...

97

Page 13: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Page 14: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Page 15: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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 »

Page 16: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Page 17: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

char *p_a; {4 octets, lire : pointeur vers a}

*p_a = 10;

#0#1#2#3

#4#5

...

#536.870.910#536.870.911

p_a #1.000

Comment connaître l’adresse de a ?&a

p_a #1.001p_a #1.002p_a #1.003

Page 18: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

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

Réserve une adresse qui tient un char

Remplit p_a avec cette adresse

Page 19: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

char *p_a; {4 octets, lire : pointeur vers a}

p_a = new p_a;

*p_a = 10;

...

delete p_a;

#0#1#2#3

#4#5

...

#536.870.910#536.870.911

p_a #1.000

10

Comment connaître l’adresse de a ?&a

p_a #1.001p_a #1.002p_a #1.003

Réserve une adresse qui tient un char

Libère l’adresse pointé par p_a

Page 20: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Variables globales et locales - la portée/*

Programme expliquant la portée*/#include <iostream>

int carre = 10; // variable globale

int sqr(int parametre){

int carre;carre = parametre * parametre;return carre;

}

// Debut du programmeint main() {

std::cout << "carre 1 :" << carre << std::endl;int x = 2;int y = sqr(x);std::cout << "carre 2 :" << carre << std::endl;int carre;carre = y;std::cout << "carre 3 :" << carre << std::endl;

}

Page 21: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Variables globales et locales - la portée/*

Programme expliquant la portée*/#include <iostream>

using namespace std;

int carre = 10; // variable globale

int sqr(int parametre){

int carre;carre = parametre * parametre;return carre;

}

// Debut du programmeint main() {

cout << "carre 1 :" << carre << endl;int x = 2;int y = sqr(x);cout << "carre 2 :" << carre << endl;int carre;carre = y;cout << "carre 3 :" << carre << endl;

}

Évite d’écrire std::à chaque fois

Page 22: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Variables globales et locales - la portée/*

Programme expliquant la portée*/#include <iostream>

int carre = 10; // variable globale

int sqr(int parametre){

int carre;carre = parametre * parametre;return carre;

}

// Debut du programmeint main() {

std::cout << "carre 1 :" << carre << std::endl;int x = 2;int y = sqr(x);std::cout << "carre 2 :" << carre << std::endl;int carre;carre = y;std::cout << "carre 3 :" << carre << std::endl;

}

Page 23: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Fonctions

• Déclaration d’une fonctiontype_retour nom_de_la_fonction(type1 argument1, type2 argument2,…)

{// bloc d’instruction

}• Appel de fonction

type_retour variable_de_retour;variable_de_retour=nom_de_la_fonction(argument1, argument2, ..);

• Prototype de la fonctiontype_retour nom_de_la_fonction(type1 argument1, type2 argument2,…);

Page 24: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Fonctions• Arguments (paramètres) d’une fonction

– Constante surfaceDuCercle(M_PI)– Variable surfaceDuCercle(rayon)– Expression surfaceDuCercle(2+3);– Autre fonction …

• Valeur par défaut d’une fonctiontype_retour nom_de_la_fonction(type1 argument1=valeur){

// bloc d’instruction}

variable_de_retour = nom_de_la_fonction(); // argument 1 prend valeur;

• Renvoi de valeur d’une fonction{..

type_retour variable_de_retour;return variable_de_retour;

}

Page 25: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Fonctions

• Surcharge de fonctions

int sqr(int arg1) // fonction 1{

return arg1*arg1;}float sqr(float arg1) // fonction 2{

return arg1*arg1;}int main(){

int x;float y,z;x=sqr(2); // appel de la fonction 1y=sqr(2); // appel de la fonction 2z=sqr(2.5); // appel de la fonction 2

}

Page 26: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Appel de fonctions

• Appel par valeur

• Appel par référence

Page 27: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2; // equivalent à parametre = parametre + 2

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

Appel par valeur

Page 28: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Appel par valeur /*

Programme expliquant la portée*/#include <iostream>

using namespace std;

void ajouter (char parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2;

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

#220#221

...

...

#222

#223...

...

4

Page 29: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2;

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

parametre #220#221

...

...

#222

#223...

...

4

4

Appel par valeur

Page 30: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2;

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

parametre #220#221

...

...

#222

#223...

...

6

4

Appel par valeur

Page 31: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2;

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

#220#221

...

...

#222

#223...

...

4

Appel par valeur

Page 32: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (int parametre){

cout << "parametre : " << parametre << endl;

parametre += 2;

cout << "parametre : " << parametre << endl;}

// Debut du programme

int main() {

int a = 4;

cout << "a :" << a << endl;

ajouter(a);

cout << "a :" << a << endl;}

#0

#200 #201

#202

#536.870.910#536.870.911

#203

#220#221

...

...

#222

#223...

...Appel par valeur

Page 33: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Appel par référence/*

Programme expliquant la portée*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a);

cout << "a :" << int(a) << endl;}

Page 34: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a);

cout << "a :" << int(a) << endl;}

Appel par référence

Parametre est un pointeur

Appel par référence

Page 35: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a);

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

...

...

...

...

4

Appel par référence

Page 36: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a); // &a est # 200

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

parametre #240parametre #241

...

...

parametre #242

parametre #243

...

...

4

200000

Appel par référence

Page 37: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a); // &a est # 200

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

parametre #240parametre #241

...

...

parametre #242

parametre #243

...

...

6

200000

Appel par référence

Page 38: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

/*Programme expliquant la portée

*/#include <iostream>

using namespace std;

void ajouter (char* parametre){

cout << "parametre : " << int(*parametre) << endl;

(*parametre) += 2;

cout << "parametre : " << int(*parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(&a); // &a est # 200

cout << "a :" << int(a) << endl;}

#0

a #200 #201

#202

#536.870.910#536.870.911

#203

#240#241

...

...

#242

#243

...

...

6

Appel par référence

Page 39: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

Appel par référence (2)/*

Programme expliquant la portée*/#include <iostream>

using namespace std;

void ajouter (char& parametre){

cout << "parametre : " << int(parametre) << endl;

parametre += 2;

cout << "parametre : " << int(parametre) << endl;}

// Debut du programme

int main() {

char a = 4;

cout << "a :" << int(a) << endl;

ajouter(a);

cout << "a :" << int(a) << endl;}

Page 40: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++
Page 42: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• class Name• {• private:• char* _nom;

• public:

• Name(void) • {• _nom = 0; • }• • ~Name(void) • { • delete[] _nom; • }

• void SetName(char* n)• {• _nom = new char[strlen(n)+1];• strcpy(_nom,n);• }

• void Print(void) { cout << _nom << endl; }

• };

Name

Contact

Page 43: C++ 6ème cours Patrick Reuter maître de conférences preuter/c++

• class Name• {• private:• char* _nom;

• public:

• Name(void) • {• _nom = 0; • }• • ~Name(void) • { • delete[] _nom; • }

• void SetName(char* n)• {• _nom = new char[strlen(n)+1];• strcpy(_nom,n);• }

• void Print(void) { cout << _nom << endl; }

• };

class Contact: public Name{private: char* _addresse;

public: Contact(void)

{ _addresse = 0;

}

~Contact(void) {

delete[] _addresse; }

void SetAddress(char* c) { _addresse = new char[strlen(c)+1]; strcpy(_addresse,c); }

void Print(void) { Name::Print(); cout << _addresse << endl; }

};

int main(void){ Contact c;

c.SetName("Amelie Mauresmo"); c.SetAddress("5 rue de la Tulippe, 75017 Paris");

c.Print();}