le type de retour du constructeur en C++
Je sais qu'il n'y a pas de type de retour de la des constructeurs en C++
Cependant, le code ci-dessous compile droit. Ce qui est retourné par le constructeur dans le code ci-dessous?
class A{
public:
A() {}
}
A a = A(); //what is returned by A() here, why?
Est-il un conflit?
a
est en cours de construction par le constructeur par copie. C'est une copie de l'objet temporaire A()
.OriginalL'auteur skydoor | 2010-03-06
Vous devez vous connecter pour publier un commentaire.
Rien n'est renvoyé par le constructeur. La syntaxe
A()
n'est pas un appel du constructeur, il crée un objet temporaire de typeA
(et appelle le constructeur dans le processus).Vous ne pouvez pas appeler un constructeur directement, les constructeurs sont appelés en tant que partie de l'objet de la construction.
Dans votre code, lors de la construction de la temporaire le constructeur par défaut (celui que vous avez défini) est appelée. Puis, lors de la construction de
a
, le constructeur de copie (généré automatiquement par le compilateur) est appelée avec le temporaire comme un argument.Comme Greg souligne à juste titre, dans certaines circonstances (y compris celui-ci), le compilateur est autorisé afin d'éviter la copie de la construction et de défaut de construire
a
(le constructeur par copie doit être accessible cependant). Je ne connais pas de compilateur de ne pas effectuer une telle optimisation.A a()
. Aussi, votre compilateur probablement convertitA a = A()
enA a()
pour éviter une redondance copie d'objet.A a()
est une déclaration d'une fonction.D'ailleurs, même si
A
avait un autre constructeur, direA(int)
, le codeA a(1)
ne serait pas un appel direct d'un constructeur, pas plus quenew(&a) A(1)
est.Les rares fois où j'ai besoin de "l'appel d'un constructeur", j'ai utilisé quelque chose comme
new(&a) A;
pour utiliser l'exemple actuel. Je considère qu'il est odieux et mon esprit refuse de me souvenir ce que j'ai pensé que j'en avais besoin pour.Non, ce n'est pas "appeler le constructeur directement". Il construit un objet temporaire, qui se trouve juste à faire appel à un constructeur.
OriginalL'auteur avakar
La syntaxe
T()
, oùT
est un certain type, est une fonctionnelle de la fonte de notation, qui crée une valeur initialisée objet de typeT
. Cela n'implique pas nécessairement un constructeur (il peut ou peut ne pas). Par exemple, leint()
est parfaitement valide l'expression et le typeint
n'a pas de constructeurs. En tout cas, même si le typeT
a un constructeur, d'interpréterT()
comme "quelque chose retourné à partir de constructeur" est tout simplement incorrect. Ce n'est pas un appel de constructeur.OriginalL'auteur AnT