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
}
6 Réponses :
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). P>
Dans l'exemple que vous donnez, vide () code> 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 code>. P>
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 code>.
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 code> implicite code>. 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 code> 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 i> existe).
@James, vous pourrait i> appeler un constructeur explicitement en disant vide :: vide () code>. C'est interdit, mais le nom vide :: vide code> 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 () Code> plutôt que Terminator :: Terminator () Code>.
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. p>
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 code> attribue la mémoire, pas le constructeur.
constructeurs ne retourne rien.
Les constructeurs sont appelés implicitement, tandis que la création d'objets pour initialiser l'objet créé. P>
Ensuite, comment cette déclaration peut-elle être légitime?: MyClass MyClass = MyClass (); Code>
@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 i>), vous n'avez aucun moyen de faire référence à son type de "retour Tapez "(le cas échéant) n'a pas de sens.
construire renvoie quelque chose. Il renvoie la référence à l'objet que comment est-ce utilisé? p> Si vous créez un modèle de classe de Ce code> pointe. Donc, l'instruction de retour implicite d'un constructeur ressemble à quelque chose code> 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 () code>) dans le constructeur de votre classe quelque chose code> et initialise votre Membre générique via l'opérateur d'affectation et l'énoncé d'initialisation du quelque chose code> 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. p> p>
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
}
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
Un constructeur ne renvoie rien. P>
source de confusion: strong> p> xxx pré> Beaucoup sont confondus par le code ci-dessus, ce qui crée une illusion que le constructeur renvoie un pointeur à l'objet nouvellement créé em>. P>
Lorsque vous utilisez un nouveau mot-clé code> Nouveau code>, 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 code> renvoie le pointeur sur ce bloc de mémoire. Le constructeur ne crée que l'objet et ne renvoie jamais rien. P> blockquote>
Eh bien, lorsque vous appelez
nouvelle classe (); code>, 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 code>. S'il vous plaît Discutez si vous n'êtes pas d'accord.