IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Définition et déclaration


Sujet :

C++

  1. #1
    Membre habitué Avatar de J_Lennon
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Points : 172
    Points
    172
    Par défaut Définition et déclaration
    Bonsoir,

    une question me trotte dans la tête, et en cherchant, je n'arrives pas à en trouver la solution. Quelle est la différence entre défintion et déclaration?
    J'ai lu qu'une déclaration pouvait être une définition ou pas, mais je ne sais pas pourquoi. Est-ce que quelqu'un peut m'éclairer?

    Merci.
    Dans le doute reboot ou path ton chemin.

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    La déclaration ca peut être court.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A;
    int f(int a, char c);
    int i;
    // ...
    Mais en C++, on peut soit donner déclaration puis implémentation (class A; puis class A { // ... }; plus loin), soit déclarer tout d'un coup (directement class A { // ... }; ).

    Donc une déclaration peut définir aussi ce dont il s'agit.

    Pendant la rédaction de ce message, j'ai trouvé ceci.

    Tu fais mieux la différence ?

  3. #3
    Membre habitué Avatar de J_Lennon
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Points : 172
    Points
    172
    Par défaut
    Merci pour ta réponse. Je penses avoir saisie le "concept".

    En visitant le site que tu as fournis dans ta réponse, j'ai pus observé ce ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exemples de définitions (+déclarations):
    int i;
    Or il semble pour toi, que c'est une simple déclaration sans définition, et pour moi également d'ailleur... Est-ce une faute de l'auteur ou un manque de compréhension de ma part?
    Dans le doute reboot ou path ton chemin.

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Hé bien pour un int, tout est dit dans cette ligne :
    Alors que pour une classe par exemple :
    On ne dit rien à propos de son futur contenu. Il en faut plus.
    Pour "int i;" on instancie un int, tout ce qu'on pourrait faire de plus sur une ligne similaire serait de lui donner une valeur.

    Donc c'est bien une définition

  5. #5
    Membre habitué Avatar de J_Lennon
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Points : 172
    Points
    172
    Par défaut
    Ok merci beaucoup tout est devenu clair! ^^
    Dans le doute reboot ou path ton chemin.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 671
    Points
    30 671
    Par défaut
    Salut,

    Si l'on devait (tres fortement) schématiser, on pourrait dire que la déclaration permet de dire que quelque chose (une variable, une fonction, ou une classe) existe, alors que la définition permet de fournir des valeurs concretes et cohérentes à quelque chose (variable, fonction ou classe).

    Une définition peut tres bien etre une déclaration, du fait que le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class MaClass
    {
        public:
            MaClass();
            ~MaClass();
            /*...*/
    };
    dit, non seulement, que la classe MaClass existe, mais lui donne aussi une série d'informations qui lui sont propres (toutes les méthodes et tous les membres de la classe) alors qu'une déclaration aura plutot pour but de dire que "quelque chose existe, mais, ne t'en fais pas, tu trouveras plus tard sa définition"...

    En effet, le compilateur ne peux travailler que sur ce qu'il connait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #ifndef MON_FICHIER_H
    #define MON_FICHIER_H
    class MaClass
    {
        public: 
            MaClass();
            ~MaClass();
            MonAutreClass& LaFonction();
    };
    class MonAutreClass
    {
       /*...*/
    };
    /*...*/
    posera problème du fait que, quand le compilateur devra gérer LaFonction, il n'a pas encore rencontré le type MonAutreClass, et qu'il ne sait donc pas qu'il existe

    Par contre, le simple fait de fournir une déclaration pour MonAutreClass avant que l'on en aie besoin pour MaClass permettra au compilateur de savoir que MonAutreClass existe, et qu'il peut attendre de trouver sa définition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #ifndef MON_FICHIER_H
    #define MON_FICHIER_H
    class MonAutreClass; /* déclaration (anticipée) de MonAutreClass */
    class MaClass /* déclaration de MaClass ET définition dans la foulée */
    {
        public: 
            MaClass();
            ~MaClass();
            MonAutreClass& LaFonction();
    };
    class MonAutreClass /* Définition (le compilateur sait déjà qu'elle existe) de
                          * MonAutreClass 
                          */
    {
       /*...*/
    };
    /*...*/
    pour les variables, on fera plutot la distinction entre définition et assignation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int MaVariable; /* définit une variable de type int nommée MaVariable */
    • va Déclarer MaVariable (dire qu'elle existe) et
    • va fournir les informations nécessaires à son utilisation (adresse mémoire mémoire, taille en mémoire, nom...)

    alors que
    va assigner la valeur 3 à la variable connue sous le nom de MaVariable
    Enfin, pour les fonctions, on fera plus volontier la distinction entre déclaration (dire qu'elles existent) et implémentation (fournir les instructions qu'elle doit effectuer):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MaFonction();/* déclare MaFonction */
     
    void MaFonctin()/* Definis (fournit les informations relatives) ou implémente
                     * la fonction */
    {
       /*...*/
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    En gros une définition est forcément une déclaration, mais l'inverse n'est pas toujours vrai.

  8. #8
    Membre habitué Avatar de J_Lennon
    Inscrit en
    Mars 2007
    Messages
    168
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2007
    Messages : 168
    Points : 172
    Points
    172
    Par défaut
    Merci beaucoup koala01.
    Dans le doute reboot ou path ton chemin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Méthode template : déclaration/définition et appel ?
    Par kidpaddle2 dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2007, 14h09
  2. Réponses: 9
    Dernier message: 18/01/2007, 08h55
  3. Réponses: 1
    Dernier message: 23/09/2006, 00h41
  4. Séparer la définition et la déclaration d'une classe
    Par prgasp77 dans le forum Langage
    Réponses: 5
    Dernier message: 24/08/2005, 21h37
  5. Déclaration et définition dans un .cpp
    Par SteelBox dans le forum C++
    Réponses: 15
    Dernier message: 26/06/2005, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo