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?

36
demandé sur Robert S. 2009-03-24 17:25:15

7 réponses

Le second est faux !

Vous pouvez utiliser

MyClass object;

Ça va marcher.

Maintenant, en ce qui concerne 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.

39
répondu Benoît 2017-05-23 12:02:56
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).

60
répondu Joe Phillips 2009-03-24 14:34:59

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;
17
répondu Vishva Rodrigo 2018-01-14 22:19:50

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 *.

9
répondu Welbog 2009-03-24 14:28:29

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.

7
répondu Fred Larson 2009-03-24 14:36:56

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 
6
répondu Deepak Gautam 2016-07-08 06:19:38

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.

3
répondu Douglas Leeder 2009-03-24 14:33:02