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 :

[debutant]Portée d'un objet et creation avec new


Sujet :

C++

  1. #1
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut [debutant]Portée d'un objet et creation avec new
    Bonjour,

    Une confusion atroce m assaille

    Y a t il une difference entre

    TypeObjet nomObjet (param);

    et

    TypeObjet nomObjet = new TypeObjet (param);

    Si oui, la portee de la seconde ligne depasse t elle le bloc auquelle elle appartient (mes souvenir me disent ke le new met l objet dans le tas donc lui accorde une vie en dehors du bloc...)?

    Si non, comment creer un objet dans une fonction et renvoyer sa reference sans utiliser de pointeur?

    Vaut il mieux retourner une reference sur un objet créé dans une fonction ou alors l'objet lui meme (et surtout pkoi)?

    Merci
    Avant de poser une question, lire la Avant de répondre, lire la question

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    La première est une instance d'un élément.

    La seconde, tu alloues une zone mémoire pour accueillir une instance d'une nouvelle classe et tu as un pointeur pointant sur cette instance.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  3. #3
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Y a t il une difference entre
    TypeObjet nomObjet (param);
    et
    TypeObjet nomObjet = new TypeObjet (param);
    Oui, la première déclaration crée un objet local, c'est-à-dire qu'à la sortie de la fonction cet objet sera détruit. La seconde déclaration crée un objet dynamique, cet objet ne sera détruit que lors d'un "delete nomObjet".

    Si non, comment creer un objet dans une fonction et renvoyer sa reference sans utiliser de pointeur?

    Vaut il mieux retourner une reference sur un objet créé dans une fonction ou alors l'objet lui meme (et surtout pkoi)?
    Bien que le compilateur permette de retourner l'adresse d'un objet local dans une fonction, cela est une erreur de le faire, puisque l'objet sera détruit aussitôt après le "return", et l'adresse sera donc invalide.
    .:: WOTC_MasterMind | Never Surrender | Warriors of The Cross ::.
    Il n'y a qu'une façon d'échouer, c'est d'abandonner avant d'avoir réussi.

  4. #4
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Merci pour vos reponses.

    Quand je parle de retourner un objet creé dans une fonction, je parle a ce momment la d'un objet dont l'espace viens d'etre alloué dynamiquement dans le tas par un new, donc non detruit a la sortie de la fonction.

    Est il preferable de retourner l'objet ou sa reference, y at il rellement une difference entre:

    typeObjet mafonction ()
    {
    typeObjet monObjet = new typeObjet ();
    return monObjet;
    }

    et

    typeObjet & mafonction ()
    {
    typeObjet monObjet = new typeObjet ();
    return monObjet;
    }

    Dans les deux cas, la fonction ne retourne t elle pas une adresse? ou alors dans le premier cas, une copie est elle crée?
    Avant de poser une question, lire la Avant de répondre, lire la question

  5. #5
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Avec le & tu t'évite une copie virtuelle de ton objet car tu retournes une référence, ce qui sauve des ressources. Sans le & tu retourne une copie de l'objet.

    N'oublie pas cependant que tout ce qui est créer avec un new nécessite une destruction explicite avec delete (ou delete [] si c'étais un array)


  6. #6
    Membre habitué Avatar de harsh
    Inscrit en
    Février 2005
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 229
    Points : 193
    Points
    193
    Par défaut
    Merci,

    juste une precision avant de marquer le sujet resolu:

    Si je retourne une copie virtuelle, je perd la main sur l'objet créé donc g une fuite memoire, on est d'accord?
    Avant de poser une question, lire la Avant de répondre, lire la question

  7. #7
    Membre averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    Par défaut
    Tu auras exactement le même objet puisqu'il s'agit d'une copie conforme de l'objet.

    Si tu retournes par référence, le fait de modifier l'objet obtenu par référence modifiera également l'objet que tu as alloué avec new.

    Ce ne sera parcontre pas le cas avec une copie (sans le &)


    Si c'est un objet d'une taille asser considérable il est beaucoup mieux d'utiliser le & (car supposons une fonction qui retourne un objet énorme par copie qui est appelée 7000 fois dans un programme? -> lenteur!)

    Si tu ne veux pas modifier l'objet tu peux retourner un const & au lieu de simplement &, ce qui te préviendras de modifier l'objet.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeObjet mafonction ()
    {
    typeObjet monObjet = new typeObjet ();
    return monObjet;
    }
    Je ne pense pas que ce code soit correct : monObjet doit être un type typeObjet * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeObjet * mafonction ()
    {
    typeObjet * monObjet = new typeObjet ();
    return monObjet;
    }
    Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeObjet  mafonction ()
    {
    typeObjet * monObjet = new typeObjet ();
    return *monObjet;
    }
    retourne une copie ce qui ne permettra pas la destruction de l'objet créé par new.
    ce code n'est pas correct non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeObjet & mafonction ()
    {
    typeObjet monObjet = new typeObjet ();
    return monObjet;
    }
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeObjet & mafonction ()
    {
    typeObjet *monObjet = new typeObjet ();
    return *monObjet;
    }
    Dans ce cas, l'appel devra se faire par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typeObjet & obj=mafonction();
    ....
    delete &obj;
    et non pas par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeObjet  obj=mafonction();
    car une copie sera faite dans obj et l'objet créé par new ne peut plus être détruit
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/12/2008, 18h54
  2. Réponses: 10
    Dernier message: 23/11/2004, 18h14
  3. [debutant][Port COM]
    Par Shooter dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/07/2004, 09h43
  4. [debutant][Portée] Déclaration de variable .....
    Par Slein dans le forum Langage
    Réponses: 4
    Dernier message: 07/05/2004, 10h43
  5. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 01h28

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