11
votes

Que retourne un constructeur?

Ma question est ce qu'est un constructeur? Cette question n'est pas très différente de "quel est le type de retour d'un constructeur?" J'ai lu quelque part qu'un constructeur renvoie un objet complet implicitement fort> (c'est-à-dire que le type de retour implicite est le nom de la classe), mais il ne doit pas être spécifié explicitement.

struct empty{};

int main(){
   empty(); //creates a temporary and implicitly a constructor is called
}


3 commentaires

Eh bien, lorsque vous appelez nouvelle classe (); , il renvoie un pointeur à l'emplacement de cette instance de la classe. Est-ce ce que vous faites référence?


Connexes: Stackoverflow.com/Questtions/3598833/...


Supprimé de la balise C ++ - FAQ . S'il vous plaît Discutez si vous n'êtes pas d'accord.


6 Réponses :


34
votes

Un constructeur ne renvoie rien. Un constructeur est appelé à initialiser un objet. Un constructeur ne peut être utilisé que pour initialiser un objet; Vous ne pouvez pas réellement appeler un constructeur explicitement (pour une chose, les constructeurs n'ont pas de noms).

Dans l'exemple que vous donnez, vide () n'est pas une expression d'appel de fonction, c'est l'initialisation de la valeur. Il crée un objet temporaire initialisé de valeur de type vide .


11 commentaires

Voir Alf P. Steinbach's Publier ici: VelocityReviews.com/ Forums / ... . Il a dit un constructeur n'a pas de type de retour, et oui, c'est un sens_ l'objet lui-même, que le constructeur construit .


Je faisais référence à la dernière partie de sa déclaration.


@Visible: La partie importante de cette déclaration est "dans un sens:" Ce n'est pas exactement ce qui se passe et ce n'est pas strictement correct, mais c'est un bon moyen de penser aux constructeurs et à l'initialisation.


Ajout à "Vous ne pouvez pas vraiment appeler un constructeur" - parfois, il y a une raison de vouloir construire un objet dans la mémoire déjà allouée. L'idée d'un appel explicite à un constructeur peut être convaincante - mais même même cela ne fonctionne pas. La syntaxe "de placement nouvelle" est utilisée à la place. Bien que dans une légère asymétrie, l'action de nettoyage qui complète ceci (détruit l'objet mais ne libère pas la mémoire) est un appel explicitement destructeur - pas un "plafond de placement".


Une pensée supplémentaire - dans le constructeur (comme avec n'importe quelle méthode), l'objet est référencé via le paramètre implicite . Le pointeur sur l'instance (ou une mémoire plutôt inintitualisée) est transmis, non renvoyé. Bien entendu, les références via ceci sont généralement aussi implicites que le paramètre lui-même.


Vous pouvez également mentionner qu'il n'existe pas de pointeur au constructeur (par opposition à un pointeur à la fonction membre, que fait existe).


@James, vous pourrait appeler un constructeur explicitement en disant vide :: vide () . C'est interdit, mais le nom vide :: vide dans le constructeur (en traduisant le nom de la classe injecté d'une référence à un type à une référence au constructeur - c'est une torsion spéciale dans la spécification ).


Qu'en est-il de Terminator (). Dites (); . On dirait une référence pour me créer un objet. Sorte de...


@Doc: Oui. Il construit un objet Terminator temporaire, Terminator des appels :: Dites () sur cet objet temporaire, puis détruit cet objet temporaire. Les objets temporaires ne sont pas détruits jusqu'à la fin de l'expression complète dans laquelle ils ont été construits.


Ou sauf si vous utilisez une référence constante pour prolonger une vie d'objet temporaire. Coliru.stacked-crooked.com/a/4A3672eA05D2A10D


Alors, pourrions-nous dire que le constructeur ne renvoie rien, mais il a revenu par la valeur sémantique? : P J'imagine si le type de retour a été spécifié une signature ressemblerait à Terminator Terminator :: Terminator () plutôt que Terminator :: Terminator () .



0
votes

en C ++, si je me souviens bien, votre code allouera suffisamment de place pour un "vide" sur la pile, puis appelle le constructeur par défaut de vide - comme spécifié par () - le transmettait implicitement une présente référence. Il n'y a pas de retour. Et dans votre cas, il n'y a pas de constructeur.


2 commentaires

Toutes les classes / structures ont des constructeurs. Dans ce cas, il y a le "constructeur par défaut par défaut" - le constructeur de défaillance de Ne-rien que chaque type obtient à moins d'avoir dit le contraire. IIRC, en C ++ 0X, il s'agira d'un constructeur de défaillance implicite de Zeros.


Comme autre poster, nouveau attribue la mémoire, pas le constructeur.



3
votes

constructeurs ne retourne rien.
Les constructeurs sont appelés implicitement, tandis que la création d'objets pour initialiser l'objet créé.


2 commentaires

Ensuite, comment cette déclaration peut-elle être légitime?: MyClass MyClass = MyClass ();


@hkbattousai Il y a beaucoup de règles spéciales manipulant des initialistes. Malheureusement, cela n'a rien à voir avec la façon de faire ressembler quelque chose d'être retourné d'un constructeur. Puisque un constructeur n'a même pas de nom (le nom de la classe ici est géré par des règles spéciales de déclarateur plutôt que par l'appel de fonctions postfix-expression ), vous n'avez aucun moyen de faire référence à son type de "retour Tapez "(le cas échéant) n'a pas de sens.



9
votes

construire renvoie quelque chose. Il renvoie la référence à l'objet que Ce pointe. Donc, l'instruction de retour implicite d'un constructeur ressemble à xxx

comment est-ce utilisé?

Si vous créez un modèle de classe de quelque chose avec un Type "générique" en tant que membre, vous appelez le constructeur de paramètres zéro par défaut du type générique explicitement (c.-à-d., générique () ) dans le constructeur de votre classe quelque chose et initialise votre Membre générique via l'opérateur d'affectation et l'énoncé d'initialisation du quelque chose constructeur. Constructeur doit retourner quelque chose ou aucune de cette merde que je viens d'écrire fonctionnerait. C'est dans le livre que je lis ... lol.


0 commentaires

-1
votes

Quoi de ce sujet:

int main() {
const empty &er = empty();
empty *ep = const_cast<empty*>(er); //casting away conentness to make changes in the members
cout<<"\n main ends \n";
//dtor get called here
}


1 commentaires

Bon point, mais const références prolongez la durée de vie des temporaires . Ainsi, CTor se comporte comme il est de retour par valeur. S'il est renvoyé Constonne, vous pouvez simplement ELTT_CAST (vide ()) .



2
votes

Un constructeur ne renvoie rien.

source de confusion: xxx

Beaucoup sont confondus par le code ci-dessus, ce qui crée une illusion que le constructeur renvoie un pointeur à l'objet nouvellement créé .

Lorsque vous utilisez un nouveau mot-clé Nouveau , le compilateur attribue la mémoire requise, puis appelle le constructeur pour créer un nouvel objet sur la mémoire allouée. Ensuite, Nouveau renvoie le pointeur sur ce bloc de mémoire. Le constructeur ne crée que l'objet et ne renvoie jamais rien.


0 commentaires