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 :

Construire un objet avec l'opérateur d'assignation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Construire un objet avec l'opérateur d'assignation
    Bonjour,

    Jusqu'à maintenant voilà comment je procédais pour instancié mes objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // sur la pile, statique
    MyObject instanceA;
    MyObject instanceB(42, "cpp_qt_lover");
     
    // sur le tas, dynamique
    MyObject* instanceA = new MyObject();
    MyObject* instanceB = new MyObject(42, "cpp_qt_lover");
    Voilà, comme j'étais un peu fatigué et que je voulais ne plus utilisé d'allocation dynamique, j'ai transformé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject* instanceA = new MyObject();// original
    MyObject instanceA = MyObject();// retiré le new et l'opérateur*
    Et surprise, là ou je m'attendais à une erreur du compilateur, et bien tout fonctionnait... Je voulais savoir si c'était une autre façon de faire ou si sa signifiait autre chose... Merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Abdelite Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject* instanceA = new MyObject();// original
    MyObject instanceA = MyObject();// retiré le new et l'opérateur*
    Et surprise, là ou je m'attendais à une erreur du compilateur, et bien tout fonctionnait... Je voulais savoir si c'était une autre façon de faire ou si sa signifiait autre chose... Merci d'avance pour vos réponses.
    Non non, il n'y a aucuns problèmes... du moment que tu as un constructeur de copie: cela revient alors à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyObject* temp = new MyObject();
    MyObject instanceA(temp);
    delete temp;

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    ce que je ne comprends pas, c'est que ce code ne devrait pas compiler normalement. Il est interdit, en c++, de déclarer deux variables du même nom mais de types différents dans le même scope.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    outre le fait que le compilateur te jetterait normalement du fait de la re déclaration d'une variable, il n'y a strictement aucune raison pour que cela ne fonctionne pas...

    Si tu ne prend pas la précaution de les désactiver explicitement (soit en les déclarant sans les définir dans l'accessibilité privée, soit (merci la nouvelle norme) en les spécifiant delete), toute classe/structure dispose systématiquement d'un constructeur par copie et d'un opérateur d'affectation (en plus du destructeur et du constructeur par défaut si tu ne déclare pas de constructeur perso): cela fait partie des fameux Big Four .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType var = MonType(); //affectation explicite
    est donc presque similaire à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType var // appel implicite du constructeur par défaut
    et, NRVO aidant, il y a même de fortes chances pour que le binaire soit strictement identique
    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

  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    ce que je ne comprends pas, c'est que ce code ne devrait pas compiler normalement. Il est interdit, en c++, de déclarer deux variables du même nom mais de types différents dans le même scope.
    probable que ce soit un copier/coller mal placé

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses. Désolé pour le code présenté, quelques copier/coller qui ont mal tourné... Je remets le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // sur la pile, statique
    MyObject instanceA;
    MyObject instanceB(42, "cpp_qt_lover");
     
    // sur le tas, dynamique
    MyObject* instanceC = new MyObject();
    MyObject* instanceD = new MyObject(42, "cpp_qt_lover");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject* instanceC = new MyObject();// avant de modifier
    MyObject instanceC = MyObject();// retiré le new et l'opérateur*
    Il s'agit bien de 4 instances différentes...

    méphistopheles> Merci, donc c'est bien dans l'exemple que j'avais présenté le constructeur de copie qui est appelé.

    koala01> Pour ce code d'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonType var = MonType();//affectation explicite
    Tu parles d'affectation, mais dans le cas ou var n'est pas déjà déclaré, est-ce que cette ligne qui déclare var est valide ? Je viens de tester, ça fonctionne.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Oui cette ligne est valide.
    En fait, cette ligne fait deux chose distinctes en même temps: une déclaration et une affectation (ou initialisation). Et c'est parfaitement valide en C++, et même conseillé en fait.

    Mais il est tout de même plus propre de faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonType var(/* paramètres éventuels */);

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Citation Envoyé par Abdelite Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject* instanceC = new MyObject();// avant de modifier
    MyObject instanceC = MyObject();// retiré le new et l'opérateur*
    Ceci dit, ces 2 lignes de codes sont différentes puisque tu as la gestion de la libération de la première à faire explicitement (delete) alors que la seconde est libérée dès que la variable sort de sa portée (implémentation tas vs pile). Il n'est donc pas anodin d'enlever * et new, ce n'est pas la même chose.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/09/2008, 10h23
  2. [Struts] pb avec l'opérateur '/'
    Par njac dans le forum Struts 1
    Réponses: 6
    Dernier message: 29/06/2004, 12h19
  3. [Float] pb avec l'opérateur '/'
    Par njac dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2004, 12h10
  4. construire 1 gateway avec 1 carte réseaux sous débian
    Par regular dans le forum Développement
    Réponses: 4
    Dernier message: 28/08/2003, 01h05
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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