Copy

  • Your native language: with Chrome, right-click on the page and select « Translate into … »

  • English version:

La première question à se poser

Que se passe-t-il lorsqu’on écrit : A = B ?

Pour les types fondamentaux (int, double…) et pour la plupart des objets :

  • A = B copie le contenu de B vers A.

  • Ensuite, les deux variables évoluent indépendamment : modifier l’une ne change pas l’autre.

Note

Il existe une situation particulière lorsque les objets A et B vont partager des ressources comme un fichier ou un segment de mémoire. Dans cette configuration, l’indépendance entre ces deux objets est compromise. A notre niveau, nous éviterons cette situation car elle est source de complications.

Nous allons dans la suite tester ces différents scénarios.

Comportement pour les affectations

Pour les types fondamentaux

Veuillez exécuter le code suivant dans votre environnement préféré, puis analysez les affichages.

#include <iostream>

int main()
{
        // int type
        int x = 10;
        int y = x;
        y++;
        std::cout << x << " " << y << std::endl;

        // double type
        double d1 = 5;
        double d2 = d1;
        d2++;
        std::cout << d1 << " " << d2 << std::endl;

        // bool type
        bool flag1 = true;
        bool flag2 = flag1;
        flag2 = !flag2;
        std::cout << flag1 << " " << flag2 << std::endl;
}

Pour chaque type testé, indiquez si l’affirmation correspondante est vraie ou fausse :

L’affectation sur des variables de type entier produit une copie.

L’affectation sur des variables de type double produit une copie.

L’affectation sur des variables de type booléen produit une copie.

Pour les structures

Examinons maintenant le type structure. Veuillez exécuter le code suivant dans votre environnement préféré, analysez ensuite les affichages.

#include <iostream>

struct Vec
{
    int x;
    int y;
};

int main()
{
        // struct type
        Vec B;
        B.x = 10;
        B.y = 20;

        Vec A;
        A = B;   // the case we are interested in

        A.x += 5;
        A.y += 5;

        // output
        std::cout << B.x << " " << B.y << std::endl;
        std::cout << A.x << " " << A.y << std::endl;
}

Indiquez si l’affirmation suivante est vraie ou fausse :

L’affectation sur des variables de type structure produit une copie.

Passage d’arguments par valeur

REGLE : En C++, le passage d’arguments par valeur déclenche une copie de cet argument vers le paramètre de la fonction comme si l’on écrivait :

paramètre = argument

Ce comportement est valable pour les types fondamentaux (int, double) comme pour les structures.

Ainsi, comme pour l’écriture de A=B :

  • On copie le contenu de l’argument vers le paramètre de la fonction.

  • Ensuite, le paramètre de la fonction évolue indépendamment de l’argument d’origine ; modifier le paramètre ne change pas l’argument.

Nous allons dans la suite tester ces différents scénarios.

Cas des types fondamentaux

Nous allons vérifier ce qu’il se passe en exécutant le code suivant et en analysant les résultats.

#include <iostream>

void F(int a, double b, bool c)
{
        std::cout << "Function entry : " << a << " " << b << " " << c << std::endl;
        a += 1;
        b += 1;
        c = !c;
        std::cout << "Function exit  : " << a << " " << b << " " << c << std::endl;
}

int main()
{
        // integer, double, bool types
        int    x = 10;
        double y = 20.0;
        bool   flag = true;

        std::cout << "Before call    : " << x << " " << y << " " << flag << std::endl;
        F(x, y, flag);
        std::cout << "After call     : " << x << " " << y << " " << flag << std::endl;
}

Pour chaque type testé, indiquez si l’affirmation correspondante est vraie ou fausse :

Le passage de paramètres avec un type entier produit une copie.

Le passage de paramètres avec un type double produit une copie.

Le passage de paramètres avec un type booléen produit une copie.

Cas des structures

Veuillez exécuter le code suivant, puis analysez les résultats.

#include <iostream>

struct Vec
{
    int x;
    int y;
};

void F(Vec v)
{
    std::cout << "Function entry : " << v.x << " " << v.y << std::endl;
        v.x += 1;
        v.y += 2;
    std::cout << "Function exit  : " << v.x << " " << v.y << std::endl;
}

int main()
{
        // struct type
        Vec data;
        data.x = 10;
        data.y = 20;

        std::cout << "Before call    : " << data.x << " " << data.y << std::endl;
        F(data);
        std::cout << "After call     : " << data.x << " " << data.y << std::endl;
}

Indiquez si l’affirmation suivante est vraie ou fausse :

Le passage de paramètres avec un type structure produit une copie des informations contenues dans la structure.