construction et operator=

Le
Korchkidu
Bonjour,

les 2 méthodes suivantes ne sont pas identiques :

A a;
B b;
a = b;
Ici, on appelle d'abord les constructeurs puis l'opérateur=

et
B b;
A a = b;
Ici, on appelle directement le constructeur (non ?). Ma question est
donc: pourquoi ? Quel est l'intérêt ?

Merci pour vos explications.
K.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #16744511
On Sun, 7 Sep 2008 04:47:25 -0700 (PDT), Korchkidu

A a;
B b;
a = b;
Ici, on appelle d'abord les constructeurs puis l'opérateur


On appelle A::A(), puis B::B(), puis :

- soit "A::operator= (B const&)", si elle existe

- soit un opérateur de conversion de B en A, puis l'opérateur de
copie.


B b;
A a = b;
Ici, on appelle directement le constructeur



C'est plus tordu que ça, si A et B sont deux types différents. Cette
expression est équivalente à :

A a (A (b));

En d'autres termes, deux fonctions sont appelées successivement :
A::A (B const&) (ou "B::operator A()", du moins je crois)
A::A (A const&)

donc: pourquoi ? Quel est l'intérêt ?



A n'a pas forcément un opérateur =.

Mais le cas le plus fréquent, c'est que A n'a pas de constructeur sans
argument, et tu ne peux pas écrire "A a;".

class B {};

class A
{
public:
A (B const&);
//...
};

B b;
A a1 (b); // OK
A a2= b; // OK aussi ; ça donne le même résultat que la ligne
précédente, en plus compliqué.
A a3; // Erreur : A::A() n'existe pas !
a3= b;
Fabien LE LEZ
Le #16744501
J'ai écrit :

- soit un opérateur de conversion de B en A,



Une fonction, en fait. Ce n'est pas forcément un opérateur.

En d'autres termes, deux fonctions sont appelées successivement :



À noter que le compilateur peut optimiser : les fonctions en question
ne sont pas forcément toutes appelées, mais elles doivent être
appelables, i.e. exister et être accessibles.
Sylvain SF
Le #16745091
Fabien LE LEZ wrote on 07/09/2008 14:36:
J'ai écrit :

- soit un opérateur de conversion de B en A,



Une fonction, en fait. Ce n'est pas forcément un opérateur.



je pense que la 1ière assertion était correcte: il doit exister
un operateur de cast vers A défini par B.

s'il existe une fonction comme:

A transformIt(B const&) {}

le compilo n'a aucune raison de l'utiliser.

Sylvain.
Fabien LE LEZ
Le #16745591
On Sun, 07 Sep 2008 16:33:29 +0200, Sylvain SF

- soit un opérateur de conversion de B en A,



Une fonction, en fait. Ce n'est pas forcément un opérateur.



je pense que la 1ière assertion était correcte: il doit exister
un operateur de cast vers A défini par B.



A::A (B const&);
Sylvain SF
Le #16745831
Fabien LE LEZ wrote on 07/09/2008 17:27:
On Sun, 07 Sep 2008 16:33:29 +0200, Sylvain SF

- soit un opérateur de conversion de B en A,


Une fonction, en fait. Ce n'est pas forcément un opérateur.


je pense que la 1ière assertion était correcte: il doit exister
un operateur de cast vers A défini par B.



A::A (B const&);



certes mais entre

struct B {
};
struct A {
A() {}
A(B const &) {}
};

qui impose à A de connaitre B et/ou a B d'exposer en public ses données.

et

struct A {
};
struct B {
operator A () const;
};

je préfère cette seconde où B utilisera (pourra utiliser) un
constructeur public de A.

Sylvain.
Fabien LE LEZ
Le #16746251
On Sun, 07 Sep 2008 18:16:42 +0200, Sylvain SF

je préfère



C'est possible. Mais ce n'est pas la question. Étant données deux
classes, si tu veux énumérer les possibilités de conversions de l'une
à l'autre, il faut bien évoquer le constructeur.
Korchkidu
Le #16751841
Merci à tous pour vos réponses très instructives !

Bonne journée.
K.
nicolas reulier
Le #16773471
peu t'ont construire efficacement une niche pour un chien dont ont ne
connait pas la taille.
soit
a)le chien est trop gros, il y aura un routage et un partitionnement faisant
perdre de la valeur et de efficacité au
transport.
b)il est trop petit et la il y aura une perte.

réponse déclaration de fin de data.
mais le tableau ne sera pas unie-forme et la rechercher ralentie.
réponse Ou une déclaration de taille post opératoire.

plus on est flou plus on en scie..

si maintenant je dis :

3=a je connais l'objet je rencontre égale et je sais ou sont les boites
ou
a=3 ou je prend un ti prépare et je lui fourgue un 3 et merci compilateur
magique...

est-il possible utiliser une classe inversable.
de type SOE ou SEO référence au soleil....

en polissant votre compréhension.

signez :
OPOSSUM de la zone 51.
(sous devcpp)
Publicité
Poster une réponse
Anonyme