Title: Formation C
1Formation C
2Hello World !
include ltiostreamgt / Commentaire sur plusieurs
lignes / int main() //Affiche hello
world stdcout ltlt "Hello World ! ltlt
stdendl
3Nouveautés de syntaxe en C
- Surcharge de fonctions, dopérateurs
- Références
- Namespace (non abordé)
- Fonctions templates (non abordé)
4Surcharge de fonction
void f(int i) int f(double i) void f(int
a,int b) // ERREUR // Diffère uniquement
par // le type de retour double f(int i)
5Attention aux ambiguïtés
- void f(int a, double b)
- void f(double a, int b)
- int a,b
- f(a,b) // ??
- f((double)a,b) //ok
- Le mieux est encore de ne pas écrire deux
fonctions aux paramètres si proche lun de
lautre !
6Opérateurs
- Mathématiques , -, , /, , , --
- Logiques , , !, , !, lt, gt, lt, gt
- Données , , -gt
- Binaire , , , , ltlt, gtgt
- Assignation , , /, , , -, ltlt, gtgt,
, , - Tous surchargeables.
7Références
- Permettent de passer la variable plutôt que la
copie. - Evite la recopie de la variable (gain en rapidité
pour de grosses structures). - Permet de simplifier lécritures de fonctions qui
écrivent dans une variable.
8Référence
void Double(int x) x2 Double(a) //a
4
void Double(int x) x2 int
a2 Double(a) //a2
void Double(int x) x2 Double(a) //a4
9Quest ce quun objet ?
- Un type qui regroupe des informations (membres),
et qui offre des moyens de les traiter (grâce à
des méthodes).
Exemple objet joueur Membres points de
vie envie de manger état (mort ?)
Méthodes Attaqué par Mange
10Comment définir un objet en C
class CJoueur public void AttaqueDe(CJoueur
J) Vie - J.Vie EnvieManger 10 Mort
((Vielt0)(EnvieMangergt100)) void
Mange() EnvieManger0 int Vie, EnvieManger
bool Mort
11Structure des fichiers dun projet C
Link
Compilation
12Les erreurs
- Compilation
- Syntaxe (erreurs)
- Warnings
- Linkage
- Fonctions et variables déclarées, non
implémentées - Exécution
- Segfault
13Organisation des fichiers
Joueur.h class CJoueur public void
AttaqueDe(CJoueur J) void Mange() int Vie,
EnvieManger bool Mort
Joueur.cpp void CJoueurAttaqueDe(CJoueur
J) Vie - J.Vie EnvieManger 10 Mort
((Vielt0)(EnvieMangergt100)) void
CJoueurMange() EnvieManger0
14Pré compilateur
Joueur.h ifndef JOUEUR_H define
JOUEUR_H Class CJoueur / / endif
Joueur.cpp include Joueur.h void
CJoueurAttaqueDe(CJoueur J)
15Utilisation de lobjet
- CJoueur J
- J.Mortfalse
- J.Vie100
- J.Mange()
CJoueur pJ (p).Vie100 p-gtVie100 p-gtMange(
)
16Constructeur destructeur
- Initialisation des données on veut quà la
création de la variable notre joueur soit vivant
sans avoir besoin de le dire ! - Constructeur fonction appelée à la création de
lobjet (pour linitialisation) - Destructeur fonction appelée à la destruction
de lobjet
17Constructeur destructeur
class CJoueur public CJoueur() Vie100
EnvieManger0 Mortfalse CJoueur()
18new et delete, création dynamique dobjets
- malloc et free (du C) ne peuvent être utilisés
car on a besoin dappeler le constructeur et le
destructeur de lobjet - new T retourne un pointeur vers une zone de
donnée allouée par lOS pour stocker un objet de
type T. - delete p informe lOS que la mémoire
préalablement allouée par un new nest plus utile.
Toujours autant de new que de delete ! (règle
sans aucune exception !)
19Membres privés, publics
- Cacher des membres et des propriétés à
lextérieur - Assurer que les données ne seront pas modifiées
par lextérieur - Indiquer à lutilisateur les membres et méthodes
dont il aura besoin - Conseil mettre les membres en privé, avec au
besoin des méthodes Get-Set
20Membres privés, publics
class CJoueur public CJoueur() CJoueur()
void AttaqueDe(CJoueur J) void Mange() bool
IsDead() private int Vie, EnvieManger bool
Mort
21Dérivation
- Créer un nouvel objet, plus spécifique, à partir
dun objet de base - CJoueur -gt CJoueurHumain, CJoueurZerg,
CJoueurProtoss - (CJoueur)CJoueurHumain
- (CJoueurHumain)CJoueur
22Dérivation
class CJoueurZerg public CJoueur public voi
d SayGrrrgg()
CJoueurZerg Zergling CJoueur J Zergling.Mange()
J.AttaqueDe(Zergling) Zergling.SayGrrrgg() CJ
oueur pZergling p-gtSayGrrrgg() //Error
23Fonctions virtuelles
- CJoueurHumain, CJoueurProtoss et CJoueurZerg ne
mangent pas de la même façon. Pourtant on veut
que tout CJoueur puisse manger.
24Fonctions virtuelles
class CJoueur public virtual void
Mange() EnvieManger0
class CJoueurZerg public CJoueur public void
Mange() SayGrrrgg() CJoueurMange()
25Fonctions virtuelles
CJoueurZerg Over CJoueur J CJoueur
POver J.Mange() Over.Mange() P-gtMange()
26Fonctions virtuelles pures
- On ne sait pas définir CJoueurMange, on veut
que les classes dérivées soient contraintes
dimplémenter Mange()
class CJoueur public virtual void
Mange()0
27Fonctions virtuelles pures
class CJoueurZerg public CJoueur public void
Mange() SayGrrrgg() EnvieManger0
CJoueurZerg Hydra Hydra.Mange() CJoueur
J //Erreur CJoueur PHydra P-gtMange() //OK
28Fonctions virtuelles pures
class CJoueurHumain public CJoueur class
CCapitaine public CJoueurHumain public void
Mange() / /
CJoueur J //Erreur CJoueurHumain J
//Erreur CCapitaine Capitaine CJoueur
PCapitaine P-gtMange() //OK
29class CMatrix public CMatrix()
CMatrix(const CMatrix m) double
operator()(int i,int j) return
Datasij CMatrix operator(CMatrix
m) CMatrix operator(double d) CMatrix
operator(CNmatrix m) CMatrix
operator(CMatrix m) CMatrix
operator-() friend CMatrix operator(double
r,CMatrix m) private double Datas33
30CMatrixCMatrix(const CMatrix m) thism
CMatrix CMatrixoperator(CMatrix
m) for(int i0ilt3i) for(int
j0jlt3j) (this)(i,j)m(i,j) return
this
31CMatrix CMatrixoperator(double d) for(int
i0ilt3i) for(int j0jlt3j) (this)(i,j
)d return this CMatrix
CMatrixoperator(double r,CMatrix
m) CNmatrix R(m) return Rr
32CMatrix CMatrixoperator(CNmatrix
m) for(int i0ilt3i) for(int
j0jlt3j) (this)(i,j)m(i,j) return
this CMatrix CMatrixoperator(CMatrix
m) CMatrix R(this) return Rm CMatrix
CMatrixoperator-() return -1(this)
33Analyse dune opération
CMatrix a,b,c //Initialisation de a et
b c2ab c.operator(operator(2,a).operator(
b)) CMatrix dc CMatrix d(c)
34La STL
- Standard Template Library
- Bibliothèque standard (elle fait partie de la
norme C) qui offre des types de variables et
des fonctions utiles - Toutes les noms sont précédées de std
- stdstring, stdvector, stdlist, stdsort
35stdstring (ltstringgt)
- Chaîne de caractères
- stdstring MonNomVincent
- MonNom.size()7
- MonNom Lascaux
- MonNomVincent Lascaux
- MonNom0V MonNom3c
36stdvector (ltvectorgt)
- Container standard tableau (acces rapide au n
élément (O(1)), insertion lente (O(n)) ) - stdvectorltintgt Tableau
- Tableau.resize(20)
- Tableau012 Tableau142
- for(int i2ilt20i) Tableauiii
- Tableau.reserve(40)
- for(int i0ilt20i)
- Tableau.push_back(12)
37stdlist (ltlistgt)
- Une liste chaînée (acces lent au n élément
(O(n)), insertion rapide (O(1)) ) - stdlistltstdstringgt Liste
- Liste.push_back(CNedra)
- Liste.push_back(rulez)
- Liste.push_front(See how )
- //Liste See how, CNedra, rulez
38Itérateurs
- Permet de parcourir un container
- Unifie la syntaxe (tous les containers se
parcourent de la même façon, que ce soient
tableau, liste, arbre ou autre) - Sutilise comme un pointeur (le container pointe
sur un objet du container).
39Itérateurs
int Somme0 for(stdvectorltintgtiterator
itTableau.begin() it!Tableau.end()it) Somme
it
int Somme0 for(stdlistltintgtiterator
itListe.begin() it!Liste.end()it) Sommei
t
40Les avantages de la STL
- Ne pas réinventer la roue
- Eviter des bugs(memory leaks la STL ne bug
pas) - Se simplifier la vieOpérateurs usuels (, , lt,
gt) - Efficacité
- Décriture du code
- Du code
41Tutoriaux
- Thinking in C
- STL aide de tout bon compilo, tutoriaux sur le
net, MSDN - Google est ton ami
42Un peu de C
43Les variables
- int a
- int a,b
- int a2
- int a2, b3
int Puissance4(int x) int carre carrexxre
turn carrecarre
44Quelques exemples
Types entiers char, int, short, long Types
réels float, double Evite dutiliser le
préfixe std avec la ligne using namespace std
include ltiostreamgt int main() stdcout ltlt
Hello World\n return 0
//Retourne le double de x int Double(int
x) return 2x
45Pointeurs
- Un type de variable stockant ladresse dune zone
en mémoire - Une valeur particulière NULL
int a int p pa p2 //a2 a3 //p3
Surtout utile pour les structures classiques
(listes chaînées, arbres binaires)
46Contrôle du flux
- Condition
- if else
- Boucles do-while, while
- Boucle for
47Condition
- Le type dune condition est bool, il peut prendre
les valeurs true ou false. Les nombres entiers
peuvent être testée - 0 ? false, autre nombre ? true
- lt, lt, gt, gt, , !
- , , !
- A3 B2 ? A((3 B)2)
- (A3) (B2)
48if - else
int sign(int x) if(xlt0) return -1
else return 1
int sign(int x) if(xlt0) return -1 else
return 1
49Boucles do-while et while
int Age do coutltlt"Quel est votre age
?ltltendl cin gtgt Age while(Agelt0)
while(OnmEcoute()) Dit_un_mot()
50Boucle for
int i for(i0ilt10i) cout ltlt 10 fois
for(int i0ilt10i) cout ltlt 10 fois
for(Init Condition Step) Code Init
while(Condition) Code Step
51Transtypage (cast)
- Changer le type dune expression
- double a (int)a
- int a (double)a
- Transtypage implicite
- double Carre(double a) return aa
- Carre(2) //Carre((double)2), Carre(2.)
52const
- Problème des références on ne sait plus si
largument sera ou non modifié - const permet dindiquer que largument ne pourra
être modifié - Erreur à la compilation si une fonction modifie
un argument const (par une affectation, ou
lappel dune méthode non const)