# 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. ---