# Cour 3 -- Language Orienté Objet avancé (C++)
###### tags `cour` `M1 S1` `cpp`
[Somaire](/V1WXmN9oTdauw8pTXPhqrQ)\
[Precedent](fKuIq0FAQaCvXKklO6Xgew)
> [time= 21 sept 2020]
[TOC]
## les Class
décalaration
```cpp
class MaClass
{
//...
};
```
La class défini est un nouveau type.
Dans une class on a:
- des attribut (des champs)
- des methodes
En C++ on a des:
- **déclaration** \
on déclarre juste la forme de notre objet (le .hpp)
- **définition** (dans le .cpp)\
on défini le code des méthodes (.cpp)
```cpp
//définition de la méthode deposer de l'objet CompteEnBanque
void CompteEnBanque::deposer(int s)
{
solde += s;
}
// définition d'une fonction déposer
void deposer(int s)
{
solde += s;
}
```
## initialisation et construction
Pour initialiser une utilise les constructeurs. (ctors)
Définition du constructeur:
- porte le nom est une méthode qui va porter le nom de la class
- n'a pas de type de retour
- plusieur constructeur peuvent etre défini
```cpp=
class CompteEnBanque
{
private:
int solde;
public:
CompteEnBanque(); //contructeur
}
CompteEnBanque::CompteEnBanque()
{
solde = 0;
}
int main()
{
CompteEnBanque mon_premier_compte;
}
```
Si on crée une class avec un constructeur avec un parametre on a le droit d'utiliser l'initialisation comme un type primitif.
```cpp
MyClass o(3); //initialisation habituel
MyClass o = 3; //initialisation comme type primitif
MyClass o{3}; //initialisation c++11
MyClass o = {3}; // l’initialisation C++11 (verbose style)
```
Attention le compilateur fait des optimisation a l'initialisation.
Si on fveut éviter ccela on utilise: `gcc -fno-elide-constructors`.
## Destructeur
Le destructeur supprime l'objet (d-tor).
On défini le destructeur *~*.\
ajouter virtual devant le destructeur.
## constructeur de copy
Un destucteur (dtor) est défini par:
- une méthode préfixé par **~**
- sans type de renvoie
- la califier de `virtual`
```cpp
class MayClass
{
//constructeur
MyClass();
/*
* constructeur de copy
* (notemement utiliser par les passage par valeur)
*/
MyClass(const MyClass &);
// destructeur
virtual ~MyClass();
}
```
## Objet constant
utile pour:
- prog concurente
- meilleur optimisations
Pour cela on ajoute **const** a la fin de la méthode.\
On peut donc utiliser sur l'objet const que les fonction nomé const.\
On ne peut pas changer les attribut de la class dans cette méthode.
```cpp
class Nombre
{
public:
Nombre(...);
long to_long() const;
int to_int() const;
void set(long v);
void set(int v);
}
int main()
{
Nombre n(...);
n.set(45L);
long l = n.toLong();
const Nombre zero(...);
l = zero.toLong();
//zero.set(23); //interdit
}
```
### mutable
Pour changer un attribut dans une méthod const on la note **mutable**
```cpp=
class Compte {
private:
int position;
mutable int nbTransactions; //objet mutable dans les méthode const
public:
int getPosition() const {
nbTransactions++; // on change la valteur de notre objet mutable
return position;
}
};
```
### attribut constant
On a un attribut qui peut que etre initialisé.
Et ne peut etre changer par la suite.
```cpp=
class Individu{
private:
int numeroSecu;
public:
Individu(...);
};
Individu::Individu(...)
: numeroSecu{...}
{}
```
## Objets volatiles
Permet d’empêcher toute optimisation de compilation (en particulier tout mécanisme de cache de valeur) sur une variable donnée.
- Une telle variable peut être modifiée à l’insu du programme lui-même
- modifiée par un autre thread
Peut etre en **const** pour ne pas pouvoir modifié la valeur.
```cpp
int main()
{
volatile const int * const mouseButtonState =
reinterpret_cast<int *>(0xDEADBABE);
// peut etre modifié mais pas par ce pointeur
}
```
## moi je..
L'objet pour parler de lui meme utilise **this**.
Ce qui permet:
- lever une certaine ambiguité
- absoluement néssaire lorsqu'un objet veuut agir de son propre chef et s’inscrire dans un scénario
[suivant](/xWa96-AGQI6G__rHTzd0Tg)