web-dev-qa-db-fra.com

Différentes méthodes pour instancier un objet en C ++

Quelle est la différence entre cela:

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?

43
RaouL

Le second est faux!

Vous pouvez utiliser

MyClass object;

Ça marchera.

Maintenant, concernant la façon de choisir entre ces deux possibilités, cela dépend principalement de la durée de vie de votre objet. Voir pour une réponse complète.

41
Benoît
Myclass *object = new Myclass(); //object has dynamic storage duration (usually is on the heap)
Myclass object; //object has automatic storage duration (usually is on the stack)

Vous créez des objets avec une durée de stockage dynamique (généralement sur le tas) si vous prévoyez de les utiliser sur une longue période et vous créez des objets avec une durée de stockage automatique (généralement sur la pile) pour une courte durée de vie (ou étendue).

69
Joe Phillips

Votre première ligne est 100% correcte. Malheureusement, vous ne pouvez pas créer d'objet avec votre deuxième ligne en c ++. Il existe 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 deuxième 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. Il 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 ne peut être utilisé que pendant une courte période. Remarque: si vous utilisez le mot clé new, n'oubliez pas qu'il renverra la valeur du pointeur. Vous devez déclarer le nom avec *. Si vous utilisez la deuxième méthode, elle ne supprime pas d'objet dans le tas. Vous devez supprimer vous-même à l'aide du mot clé delete:

delete myclass;
23
Vishva Rodrigo

L'opérateur new renvoie un pointeur sur l'objet qu'il crée, donc l'expression Myclass object = new Myclass(); n'est pas valide.

D'autres langages n'ont pas de pointeurs explicites comme C++, vous pouvez donc é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 objet Myclass, c'est-à-dire Myclass *.

13
Welbog

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 sera probablement pas compilé, car il essaie de créer un objet MyClass et de l'affecter à un pointeur MyClass. Cela pourrait fonctionner dans le cas peu probable où vous disposez d'un constructeur MyClass qui accepte un pointeur MyClass.

8
Fred Larson

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 (); retourne le pointeur à la classe et Myclass object; déclare l'objet de la classe et vous essayez d'affecter le pointeur de la classe à l'objet de la classe , ce qui est incorrect.

Votre première ligne de code est correcte. Mais cela déclare que le pointeur vers la classe n'est pas l'objet de la classe.

Myclass *object = new Myclass();  //declares pointer to class.

Pour déclarer un objet de classe, vous devez écrire le code suivant.

Myclass object;   //declares object of class Myclass

Mais vous devez noter que la façon d'accéder aux membres de la classe en utilisant le pointeur vers la classe et en utilisant l'objet de classe est différente. Voici le code d'accès 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 
7
Deepak Gautam

Le premier est correct.

La seconde ne compilera généralement pas. Et s'il compile, la classe fait des choses compliquées dans un opérateur constructeur/affectation. Et c'est probablement une fuite de mémoire.

4
Douglas Leeder