Le C++

- Commentaires : /* remarques */ ou // remarques jusque fin de la ligne
- Inline:l'ensemble des instructions est recopié à chaque appel :

Inline int Max (int N1, int N2)
{

return (N1 > N2 ? N1 :N2)

}

A chaque appel de la fonction Max, le code est recopié.

- Référence ou alias
Une référence permet l’accès indirecte à une variable, elle permet de passer des paramètres qui pourront être modifiés par une fonction.

Int I = 0 ;
int& R=I ;

R++ ; I vaut alors 1

La définition de R équivaut à *(&i) c.a.d. contenu de l’adresse de I

ceci est valable aussi pour char, struct, ... et même pour class !

- Sur-définition :

int max (int n1, int n2) ;
float max (float n1, float n2) ;
char * max (char* ch1, char* ch2) ;

- La déclaration :
La variable ou objet peut être déclaré(e) n’importe où, même dans une instruction.

Ex. :

for (int i = 0, i < 10, i++) {...}

Où dans une fonction
{

int j =10 ;
int i = 2 ;
int k = max(j,i) ;

}

- Allocation dynamique :
int *p
p = new int ;

char *ch ;
ch = new char[100] ;

struct st_fiche *f ;
f = new struct st_fiche ;
f->age = 20 ;

- Désallouer :
delete ch
delete p

- Argument par défaut :
Il est possible d'indiquer les valeurs par défaut pour des arguments qui ne seraient pas renseignés:

Soit une fonction max qui retourne la valeur la plus grande entre 2 paramètres passés:

extern int max (int = 0 ; int = 1) ;

ou extern int max (int i = 0 ; int j = 1) ;

i = 10 ;
i = max(i) ; // réponse 10 car i est le premier paramètre et est = 10, le second paramètre n'étant pas renseigné implique la valeur par défaut 1 (j = 1 par défaut est < i)
i = -1 ;
i = max(i) ; // i recevra 1 car j > i

- Les flux
# include <stdio.h>
cout << « Salut » << ‘\n’ // Affichage Salut

int val ;
cin >> val // Saisie

- Création d’une classe

Exemple de création d’une classe : la classe date

Image non trouvée !A savoir:

D est une instance de classe date. Le code que nous lançons en tapant d.afficher() est celui de la classe date. Il n'y a en effet pas de duplication du code de la classe date vers l'instance d (inutile de surcharger la mémoire !).

Par contre et évidemment, les données sont bien dupliquées dans l'instance d…

 

Image non trouvée !Pour les méthodes sans types, il faut préciser void ! Microsoft C++ ne dira pas forcement grand chose à la compilation si vous ne le faîtes pas, mais d'autres compilateurs un peu plus regardant ne seront pas tout à fait d'accord !

Constructeur/destructeur

Pour initialiser une instance de classe, vous pourrez utiliser un constructeur. Il devra s'écrire de la manière suivante:

public:

nom_de_la_classe (Eventuels paramètres qui pourront être initialisés par défaut)

par exemple date(int j = 1, int m = 1, int a = 1970)

 

Le destructeur sert lui à libérer les ressources utilisées par l'instance.

~nom_de_la_classe()

Image non trouvée !Le nom du constructeur comme le destructeur devant impérativement porter le nom de la classe ! Ce sont les deux seules méthodes qui ont cette possibilité.

 


Dérivation/héritage simple

Dérivation/héritage simple de la classe date vers une classe spécialisée : dater
Il s'agit en fait de se créer une nouvelle classe ayant ses propres propriétés, et qui reprendra les propriétés d'une autre classe (la classe de base).

Il est alors possible de rendre les méthodes de la classe héritée accessibles depuis l'extérieur en indiquant public.
Ou encore d'interdire les méthodes de cette classe depuis l'extérieur en indiquant protected. Bien entendu, votre classe spécialisée peut toujours accéder aux méthodes de la classe de base si celles-ci ne sont pas private !


Surcharge de méthodes

Il est possible d'avoir une méthode portant le même nom qu'une méthode de la classe parent. Dans ce cas, l'appel à la méthode de votre instance lancera bien la méthode de la classe dérivée.

Cependant, cette classe dérivée pourra toujours appeler la méthode de même nom de la classe parent. Il suffira pour cela d'indiquer le nom de la classe parent.

Par exemple

En fait, on peut toujours indiquer le nom de la classe à toutes les méthodes. Si vous ne le faites pas, le compilateur va associer automatiquement la méthode à la classe par défaut.


Fonction virtuelle

Les fonctions virtuelles permettent aux classes dérivées de remplacer totalement ou partiellement les méthodes de la fonction de base.

Dans l'exemple qui suit, surchage de la fonction afficher date pour afficher en plus l'heure dans la classe dérivée.


Dérivation/héritage multiple

Cas un peu particulier, il s'agit d'une classe qui hérite de n classes.

En principe, le cas ne devrait pas se produire bien souvent, et s'il se produit, il faudra peut-être revoir avant tout la conception, il y a peut-être un problème…

Le principe est identique à un héritage simple, mais au niveau de la définition de la classe dérivée, vous indiquerez les n classes de bases.

Class nomclassederivee :public classebase1, public classebase2, …

Se pose alors le problème d'ambiguïté possible entre les méthodes des différentes classes de base.

Par exemple, il existe une variable X dans la classe de base A et la classe de base B.
Pour lever toutes ambiguïtés, vous allez écrire dans la classe dérivée: Y=A::X pour accéder au X de la classe A.

Au niveau des constructeurs, le constructeur de la classe dérivée va lancer les constructeurs des classes de base dans l'ordre de définition de la classe dérivée puis le code du constructeur de la classe dérivée.

Au niveau des destructeurs, le constructeur de la classe dérivée fait l'inverse du constructeur…

 

Fonctions virtuelles pures

Les fonctions virtuelles pures permettent de déclarer l'existence de la fonction, sans pour autant avoir de définition concrète. Les classes dérivées devront obligatoirement définir exactement la fonction.

Par exemple: la fonction dessine de la classe forme est une fonction virtuelle pure.
Les classes dérivées devront déclarer cette fonction. Vous aurez alors dans la classe dérivée cercle la fonction pour dessiner un cercle, …


class forme {
public:
virtual void dessiner() const = 0; // = 0 signifie "virtuelle pure"

};

 

Classe abstraite


Vous avez vu dans le chapitre Notion objet que le terme véhicule était abstrait. Un véhicule pouvant être un avion, un camion, une voiture, …

Une classe de base abstraite (Abstract Base Class) va ainsi vous permettre de définir des fonctions virtuelles pures. En fait, une classe abstraite n'est définie que de fonctions virtuelles pures.

L'avantage, étant d'obliger les classes dérivées à définir exactement le contenu de ces fonctions.

 

Création dynamique d'une instance de classe

Pour le moment, vous n'avez fait que des créations statiques d'instances de classe, par exemple en tapant date d1 (20,3,1994);

Mais il est possible de créer des instances dynamiquement. En effet il est plutôt rare de connaître exactement le nombre d'instances qui seront créées !

Pour cela vous utiliserez la commande new

En commençant tout d'abord par créer un pointeur de type la classe à instancier, par exemple:

date *d1;

Puis en affectant une instance à ce pointeur en faisant

d1 = new date (20,3,1994); ce qui aura pour effet de déclencher le constructeur automatiquement.

Si les options par défauts définies dans la classe pour le constructeur vous suffisent, vous pouvez taper:

d1 = new date;

où encore

d1 = new date (20,3) Dans ce cas, l'année sera positionnée avec la valeur par défaut !

Image non trouvée ! La compilation ne fonctionnera pas si un des paramètres du constructeur n'a pas de valeur par défaut !

 

La libération en mémoire se fera via la commande delete (d1); qui déclenchera automatiquement le destructeur.

 

Liens intéressants

Apprenez à programmer en C++ sur le site du zéro