87 lines
2.0 KiB
Markdown
87 lines
2.0 KiB
Markdown
# 17. Construction et destruction
|
|
|
|
## 17.1 Constructeur unique — V1 REQUIS — FIGÉ
|
|
|
|
Une classe ou struct possède au maximum un `construct` effectif explicite ou synthétique.
|
|
|
|
Pas de surcharge de constructeur.
|
|
|
|
## 17.2 Visibilité de `construct` — V1 REQUIS — FIGÉ
|
|
|
|
Classe :
|
|
|
|
```text
|
|
private
|
|
protected
|
|
module
|
|
package
|
|
public
|
|
```
|
|
|
|
Struct :
|
|
|
|
```text
|
|
private
|
|
module
|
|
package
|
|
public
|
|
```
|
|
|
|
`unsafe construct` est autorisé si l'appelant doit garantir des invariants que le compilateur ne peut pas vérifier.
|
|
|
|
## 17.3 Construction dérivée — V1 REQUIS — FIGÉ
|
|
|
|
Chaque classe possède son propre constructeur effectif ; les constructeurs ne sont pas hérités comme des méthodes.
|
|
|
|
Le compilateur peut synthétiser un constructeur à partir :
|
|
|
|
- du constructeur effectif du parent immédiat ;
|
|
- des nouveaux champs qui nécessitent une initialisation.
|
|
|
|
Chaîne :
|
|
|
|
```text
|
|
C -> B -> A
|
|
```
|
|
|
|
Jamais `C -> A` directement.
|
|
|
|
## 17.4 `super::construct(...)` — V1 REQUIS — FIGÉ
|
|
|
|
Il doit être exécuté exactement une fois sur chaque chemin de construction valide avant toute utilisation de l'état parent via `this`/`super`.
|
|
|
|
Il n'a pas besoin d'être textuellement la première instruction : des calculs locaux indépendants peuvent le précéder.
|
|
|
|
Le compilateur doit prouver la definite construction.
|
|
|
|
Avant construction du parent, sont notamment interdits :
|
|
|
|
```text
|
|
this::field
|
|
this::method()
|
|
super::method()
|
|
escape/capture/pass de this
|
|
```
|
|
|
|
## 17.5 Destructeur — V1 REQUIS — FIGÉ EN PRINCIPE
|
|
|
|
Au maximum un `destruct` effectif.
|
|
|
|
Le destructeur est un hook de lifecycle automatiquement invoqué.
|
|
|
|
Il n'est pas appelable directement par le programmeur et ne possède donc pas de visibilité utilisateur normale.
|
|
|
|
```text
|
|
destruct() {
|
|
...
|
|
}
|
|
```
|
|
|
|
S'il doit effectuer des opérations unsafe, il utilise un bloc `unsafe` interne.
|
|
|
|
## 17.6 Fallibilité de `construct`/`destruct` — V1 REQUIS — À FINALISER
|
|
|
|
Le lien exact avec `Result`, exceptions, construction partielle et cleanup doit être fermé avec le modèle mémoire et les exceptions.
|
|
|
|
---
|