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 :

Passage de paramètre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2013
    Messages : 11
    Par défaut Passage de paramètre
    Bonjour,
    Je débute en C++.
    Je ne comprends pas pourquoi ce code affiche 1. Il me semble que le passage de paramètre créer une copie qui est utilisée dans la fonction. Mais dans ce cas, il s'agit d'une classe qui n'a pas de méthode copie. Comment la copie est-elle effectuée alors? Ou alors, je n'ai rien compris...
    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
    18
    19
    20
    21
    22
    23
    24
    #include <iostream>
     
    using namespace std;
     
    class A{
        public:
        int i;
    };
     
    void f(A a){
        a.i = 5;
        A b;
        b.i = 6;
        a = b;
    }
     
    int main()
    {
        A x;
        x.i = 1;
        f(x);
        cout << x.i << endl; 
        return 0;
    }
    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Les classes se voient affectée, par défaut, de 4 opérations :

    - constructeur par défaut
    - constructeur par copie
    - opérateur d'affectation
    - destructeur

    Toutefois, si tu définis un constructeur personnalisé, le constructeur par défaut ne sera pas généré.

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Une classe comporte un opérateur de copie par défaut, qui copie simplement les variables membres. (attention aux pointeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f(A a){ //Effectue une copie du paramètre
        a.i = 5;
        A b;
        b.i = 6;
        a = b; //est égale à "a.i = b.i"
    }
    Si la fonction f est destinée à modifier son paramètre, il faut le passer par référence(ou pointeur)
    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
    18
    19
    20
    #include <iostream>
     
    using namespace std;
     
    class A {
    public:
        int i;
    };
     
    void f(A& a) {//Le passage par référence n’effectue pas de copie
        a.i = 5;
    }
     
    int main() {
        A x;
        x.i = 1;
        f(x);
        cout << x.i << endl; //x.i == 5
        return 0;
    }
    Aussi, l'utilisation des classes est fait pour empêcher un accès directe aux variables membres. Normalement ces variables sont déclarées "private".

  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,
    Citation Envoyé par PilloBuenaGente Voir le message
    Aussi, l'utilisation des classes est fait pour empêcher un accès directe aux variables membres. Normalement ces variables sont déclarées "private".
    En fait, en C++ (contrairement à C#, par exemple), il n'y a strictement aucune différence sémantique entre une classe et une structure.

    La seule différence qui existe est la visibilité par défaut de ces dernière : publique (y compris pour l'héritage) pour les structures et privée pour les classes.

    Bien sur, le fait que la visibilité par défaut des classes soit privée devrait, effectivement, nous inciter à encapsuler les données.

    Mais cela doit alors être fait avec bon sens : l'encapsulation a pour but de permettre à la classe de présenter les services que l'on est en droit d'attendre de sa part.

    Le fait de s'amuser à placer un membre en accessibilité privée n'aurait, par exemple, aucun sens si c'est pour en venir à fournir un accesseur ("getter") et un mutateur ("setter").

    Le fait de fournir un accesseur sur une donnée membre peut, bien sur, correspondre à un service que l'on est en droit d'attendre de la part de la classe, mais le fait de fournir un accesseur est rarement la "meilleure solution": il est souvent préférable de fournir d'autres fonctions, correspondant à des services clairement identifiés, qui modifieront les valeurs de manière internes de sorte que l'utilisateur n'ait pas besoin de calculer la valeur finale par lui même

    Tout cela pour dire que, oui, bien sur, la classe utilise par défaut une accessibilité privée dont il serait sans doute dommage de ne pas profiter (quoi que, par habitude, on mettra de toutes manières les fonctions publiques en premier ), mais qu'il n'est absolument pas interdit de placer des variables membres dans l'accessibilité publique, même si l'on peut alors se poser la question du recours à la structure
    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 émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    C'est tout à fait clair maintenant ! Merci !

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

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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