01.05.2013 Views

C++ et éléments finis Note de cours de DEA (version provisoire)

C++ et éléments finis Note de cours de DEA (version provisoire)

C++ et éléments finis Note de cours de DEA (version provisoire)

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

8 CHAPITRE 1. QUELQUES ÉLÉMENTS DE SYNTAXE<br />

1.1 Les déclarations du <strong>C++</strong><br />

Les types <strong>de</strong> base du <strong>C++</strong> sont respectivement: char, short, int, long, long long, float, double,<br />

plus <strong>de</strong>s pointeurs, ou <strong>de</strong>s références sur ces types, <strong>de</strong>s tableaux, <strong>de</strong>s fonctions sur ces types. Le tout nous<br />

donne une algèbre <strong>de</strong> type qui n’est pas triviale.<br />

Voilà les principaux types généralement utilisé pour <strong>de</strong>s types T,U:<br />

déclaration Prototypage <strong>de</strong>scription du type en français<br />

T * a T * un pointeur sur T<br />

T a[10] T[10] un tableau <strong>de</strong> T composé <strong>de</strong> 10 variable <strong>de</strong> type T<br />

T a(U) T a(U) une fonction qui a U r<strong>et</strong>ourne un T<br />

T &a T &a une référence sur un obj<strong>et</strong> <strong>de</strong> type T<br />

const T a const T un obj<strong>et</strong> constant <strong>de</strong> type T<br />

T const * a T const * un pointeur sur obj<strong>et</strong> constant <strong>de</strong> type T<br />

T * const a T * const un pointeur constant sur obj<strong>et</strong> <strong>de</strong> type T<br />

T const * const a T const * const un pointeur constant sur obj<strong>et</strong> constant<br />

T * & a T * & une référence sur un pointeur sur T<br />

T ** a T ** un pointeur sur un pointeur sur T<br />

T * a[10] T *[10] un tableau <strong>de</strong> 10 pointeurs sur T<br />

T (* a)[10] T (*)[10] un pointeur sur tableau <strong>de</strong> 10 T<br />

T (* a)(U) T (*)(U) un pointeur sur une fonction U →T<br />

T (* a[])(U) T (*[])(U) un tableau <strong>de</strong> pointeur sur <strong>de</strong>s fonctions U→T<br />

...<br />

Remarque il n’est pas possible <strong>de</strong> construire un tableau <strong>de</strong> référence car il sera impossible à initialiser.<br />

Exemple d’allocation d’un tableau data <strong>de</strong> ldata pointeurs <strong>de</strong> fonctions <strong>de</strong> R à valeur dans R:<br />

R (**data)(R) = new (R (*[ldata])(R)) ;<br />

ou encore avec déclaration <strong>et</strong> puis allocation:<br />

R (**data)(R) ; data = new (R (*[ldata])(R)) ;<br />

1.2 Quelques règles <strong>de</strong> programmation<br />

Malheureusement, il est très facile <strong>de</strong> faire <strong>de</strong>s erreurs <strong>de</strong> programmation, la syntaxe du <strong>C++</strong> n’est pas<br />

toujours simple à comprendre <strong>et</strong> comme l’expressibilité du langague est très gran<strong>de</strong>, les possibilités d’erreur<br />

sont innombrables. Mais avec un peu <strong>de</strong> rigueur, il est possible d’en éviter un grand nombre.<br />

La plupart <strong>de</strong>s erreurs sont dû à <strong>de</strong>s problèmes <strong>de</strong> pointeurs (débor<strong>de</strong>ment <strong>de</strong> tableau, <strong>de</strong>struction multiple,<br />

oublie <strong>de</strong> <strong>de</strong>struction), r<strong>et</strong>urn <strong>de</strong> pointeur sur <strong>de</strong>s variable locales.<br />

Voilà quelques règles a respecté.<br />

Régle 1 (absolue) : dans une classe avec <strong>de</strong>s pointeurs <strong>et</strong> avec un <strong>de</strong>structeur, il faut que les <strong>de</strong>ux opérateurs<br />

<strong>de</strong> copie (création <strong>et</strong> affection) soient dé<strong>finis</strong>. Si vous considérez que ces <strong>de</strong>ux opérateurs ne doivent pas<br />

exister alors les déclarez en privé sans les définir.<br />

class sans_copie { public:<br />

long * p ; // un pointeur<br />

. . .<br />

sans_copie() ;<br />

˜sans_copie() { <strong>de</strong>l<strong>et</strong>e p ;}<br />

private:<br />

sans_copie(const sans_copie &) ; // pas <strong>de</strong> constructeur par copie<br />

void operator=(const sans_copie &) ; // pas d’affection par copie<br />

} ;<br />

Dans ce cas les <strong>de</strong>ux opérateurs <strong>de</strong> copies ne sont pas programmer pour qu’une erreur à l’édition <strong>de</strong>s liens<br />

soit généré.<br />

class avec_copie { public:<br />

long * p ; // un pointeur<br />

˜avec_copie() { <strong>de</strong>l<strong>et</strong>e p ;}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!