Différentes méthodes pour instancier un objet en C++
Quelle est la différence entre ceci:
Myclass *object = new Myclass();
Et
Myclass object = new Myclass();
J'ai vu que beaucoup de bibliothèques C++ comme wxWidgets, OGRE etc utilisent la première méthode... Pourquoi?
7 réponses
Myclass *object = new Myclass(); //object is on the heap
Myclass object; //object is on the stack
Vous créez des objets sur le tas si vous prévoyez de les utiliser pendant une longue période et que vous créez des objets sur la pile pour une courte durée de vie (ou portée).
Votre première ligne est 100% correcte. Malheureusement, vous ne pouvez pas créer d'objet avec votre deuxième ligne en C++. Il y a deux façons de créer/créer un objet en C++.
Le premier est:
MyClass myclass; // if you only need to call the default constructor
MyClass myclass(12); // if you need to call constructor with parameters*
Le Second est:
MyClass *myclass = new MyClass();// if you only need to call the default constructor
MyClass *myclass = new MyClass(12);// if you need to call constructor with parameters
En C++ si vous utilisez le mot clé new
, l'objet sera stocké dans le tas. C'est très utile si vous utilisez cet objet pendant une longue période Et si vous utilisez la première méthode, il sera stocké dans la pile. il peut être utilisé seulement courte période de temps.
Avis: si vous utilisez new
mot-clé, rappelez-vous qu'il retournera la valeur du pointeur. Vous devez déclarer le nom avec *
.
Si vous utilisez une deuxième méthode, elle ne supprime pas l'objet dans le tas. Vous devez supprimer par vous-même en utilisant delete
mot-clé:
delete myclass;
Le new
opérateur renvoie un pointeur vers l'objet qu'il crée, donc l'expression Myclass object = new Myclass();
est invalide.
Les autres langages n'ont pas de pointeurs explicites comme C++, donc vous pouvez écrire des instructions comme Myclass object = new Myclass();
, mais en C++ ce n'est tout simplement pas possible. Le type de retour de new Myclass();
est un pointeur vers un Myclass
objet, c - Myclass *
.
Le premier exemple crée un pointeur sur MyClass et l'initialise pour pointer vers le résultat du nouvel opérateur.
Le second ne compilera probablement pas, car il essaie de créer un objet MyClass et de l'affecter à un pointeur MyClass. Cela pourrait fonctionner dans le cas improbable où vous avez un constructeur MyClass qui accepte un pointeur MyClass.
Votre première ligne de code est correcte tandis que la deuxième ligne de code est incorrecte.
Myclass object=new Myclass(); //Incorrect code
Le code ci-dessus est incorrect car new Myclass(); renvoie le pointeur vers la classe et objet Myclass; déclare l'objet de la classe et vous essayez d'attribuer un pointeur à la classe à l'objet de la classe, ce qui est incorrect.
Votre première ligne de code est correcte. Mais cela déclare le pointeur à la classe pas l'objet de la classe.
Myclass *object = new Myclass(); //declares pointer to class.
Pour déclarer un objet de classe, vous devez écrire ce qui suit code.
Myclass object; //declares object of class Myclass
Mais vous devriez noter que la façon d'accéder au membre de la classe en utilisant le pointeur vers la classe et en utilisant l'objet de la classe est différente. voici le code pour accéder aux membres de la classe.
pointer_to_class->member; // accessing class member using pointer to class
object.member; //accessing class member using object of class
Le premier est correct.
La seconde ne compile généralement pas. Et si elle compile, la classe fait des choses compliquées dans un opérateur constructeur / affectation. Et c'est probablement une fuite de mémoire.