OVH Cloud OVH Cloud

cas d'utilisation du constructeur de copie

26 réponses
Avatar
Nicolas Aunai
bonjour,


Quels sont les différents cas dans lequel le c'est le constructeur de
copie de la classe qui est appelé ?

mon cours me dit :

ma_classe c(c1); // instanciation de c a partir de c1

ainsi que

ma_classe c=c1;


mais est- il valide de faire :

ma_classe c;
ma_classe c1;

et plus loin...

c=c1; ? le constructeur par copie est-il appelé ?

que se passe-t-il ? étant donnné que le constructeur a déja été appelé
lors de la déclaration de c....

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3
Avatar
Christophe Lephay
Nicolas Aunai wrote:
ma_classe c;
ma_classe c1;

et plus loin...

cÁ; ? le constructeur par copie est-il appelé ?
que se passe-t-il ? étant donnné que le constructeur a déja été appelé
lors de la déclaration de c....



C'est l'opérateur d'affectation qui est appelé. Un constructeur n'est appelé
qu'une fois par objet (à sa création).

Chris

Avatar
Fabien LE LEZ
On Sat, 11 Oct 2003 16:10:21 +0200, Nicolas Aunai
ç wrote:

ma_classe c(c1); // instanciation de c a partir de c1

ma_classe cÁ;


A noter que si c1 est du même type que c, alors les deux écritures
sont équivalentes.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Nicolas Aunai
"Fabien LE LEZ" avait prétendu :

ma_classe c(c1); // instanciation de c a partir de c1

ma_classe cÁ;


A noter que si c1 est du même type que c, alors les deux écritures
sont équivalentes.


ok, alors si j'avais eu par exemple :

class Entier
{
int i ;
public :
Entier(int j)
{
i=j ;
return ;
}
} ;

et ensuite :

int j=2 ;
Entier e1, e2=j ;
e1=j ;

j'ai du mal a comprendre ce qui se passe au niveau du constructeur,
quelle est la différence dans les cas de e1 et e2 ? quand Entier()
est-il appelé ? comment prend-il son paramètre ?

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Fabien LE LEZ
On Sat, 11 Oct 2003 16:38:25 +0200, Nicolas Aunai
ç wrote:

int j=2 ;
Entier e1, e2=j ;
e1=j ;

j'ai du mal a comprendre ce qui se passe au niveau du constructeur,


Si j'ai bien tout compris, ça correspond à :

int j=2;
Entier e1; // Constructeur par défaut
Entier e2= Entier (j); // Création d'un temporaire, puis appel du
constructeur de copie

e1= Entier(j); // En l'absence d'opérateur "operator=(int)", création
d'un temporaire, puis opérateur de copie ("operator =").

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Spoofix
C'est l'opérateur d'affectation qui est appelé. Un constructeur n'est
appelé

qu'une fois par objet (à sa création).


A ce propos, j'aurais une question : est-il possible, en dehors de la
définition d'un objet, d'appeler explicitement le constructeur ?
(Visiblement, VC++ ne l'accepte pas...)

Ex :

class MyClass
{
MyClass(int x); //constructeur
};

MyClass myCl(5);

// est-il possible de faire :
myCl.MyClass(6);

Merci d'avance....

Avatar
Fabien LE LEZ
On Sat, 11 Oct 2003 17:20:33 +0200, "Spoofix"
<spoofix[ENLEVEZ_CA]@free.fr> wrote:

MyClass myCl(5);

// est-il possible de faire :
myCl.MyClass(6);


Non.
C'est possible dans certains cas, mais c'est à peu près toujours une
très mauvaise idée.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Spoofix
Non.
C'est possible dans certains cas, mais c'est à peu près toujours une
très mauvaise idée.


Ok merci !!!
Et c'est ds quels cas, que c'est possible ?

Avatar
Fabien LE LEZ
On Sat, 11 Oct 2003 18:10:05 +0200, "Spoofix"
<spoofix[ENLEVEZ_CA]@free.fr> wrote:

Et c'est ds quels cas, que c'est possible ?


Quand on a un pointeur sur un objet valide, on peut (je crois) appeler
le destructeur, puis le constructeur. Mais bon, c'est de la sale
bidouille -- je préfère ne jamais essayer ;-)

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Spoofix
Quand on a un pointeur sur un objet valide, on peut (je crois) appeler
le destructeur, puis le constructeur. Mais bon, c'est de la sale
bidouille -- je préfère ne jamais essayer ;-)


Merci pour tes reponses ultra rapides !
Bye

Avatar
Alexandre
"Fabien LE LEZ" a écrit dans le message de
news:
On Sat, 11 Oct 2003 18:10:05 +0200, "Spoofix"
<spoofix[ENLEVEZ_CA]@free.fr> wrote:

Et c'est ds quels cas, que c'est possible ?


Quand on a un pointeur sur un objet valide, on peut (je crois) appeler
le destructeur, puis le constructeur. Mais bon, c'est de la sale
bidouille -- je préfère ne jamais essayer ;-)

--
Comme ça ?


OBJET *ptr;
ptr = new OBJET ; // appel du constructeur
delete ptr; // appel du destructeur
ptr = new OBJET; // appel du constructeur

Vu qu'il s'agit d'un nouvel objet, le constructeur n'est donc appelé qu'une
seule fois par instance. Il est impossible de le rappeler (alors que c'est
faisable avec le destructeur)


1 2 3