Question

depuis que je suis venu de c # à c ++ tout semble fou pour moi c ++. Je me demandais si quelqu'un pouvait me expliquer pourquoi nous avons ce genre d'instancier en c ++: Méthode 1:

ClassA obj1; // this is going to stack

Méthode 2:

ClassA *obj1 = new ClassA(); //this is going to heap

alors que nous n'avons pas le instanciation commun de manière C # sur c ++:

ClassA  obj2 = new obj2();

et une autre question method1 je reçois une instance de la ClassA mais sans le pourquoi (), ce qui est l'endroit exact de la AVONS I est embrouillé, ne nous devons instatiating comme ça? notre ClassA a un constructeur, mais instanciation sans parenthèses ???  comment se fait que nous appelons son constructeur?

p.s: J'ai lu ces sujets:

Différents procédés pour l'instanciation d'un objet en C ++

Stack, statique, et Heap en C ++

quoi et où? Sont la pile et tas

Était-ce utile?

La solution

En effet, le déplacement à C ++ d'un langage comme Java ou C # peut être intimidant, je suis allé à travers elle aussi.

La différence abord et avant tout est que dans C ++ vous gérez presque toujours votre propre mémoire. Lors de la création d'un objet sur le tas, vous êtes responsable de le supprimer de sorte qu'il ne fuit pas la mémoire - ce qui signifie que vous pouvez le supprimer quand bon vous semble. Lors de la création d'un objet sur la pile, il est automatiquement supprimé quand il est hors de portée -. Vous devez faire attention à ne pas l'utiliser après sa mise hors de portée

Exemple:

void do_queue(B& queue)
{
    Evt *e = new Evt;
    queue.queueEvent(e); 
} // all well, e can be popped and used (also must be deleted by someone else!)

contre

void do_queue(B& queue)
{
    Evt e;
    queue.queueEvent(&e); 
} // e is out of scope here, popping it from the queue and using it will most likely cause a sigseg

Cela étant dit, les deux méthodes sont également très différentes dans un aspect: le premier crée un objet. Le second crée un pointeur vers un objet. La bonne chose d'avoir des pointeurs est que vous pouvez les passer autour comme paramètres avec seulement la mémoire minimale copiée sur la pile (le pointeur est copié, au lieu de l'objet entier). Bien sûr, vous pouvez toujours obtenir l'adresse d'un objet alloué sur la pile en utilisant « & », ou passer autour comme référence - cependant, lors de l'utilisation des objets alloués sur la pile vous beaucoup être particulièrement prudent avec leur champ d'application

J'ai trouvé ce site une grande ressource quand je suis passé de Java en C ++: http : //www.parashift.com/c++-faq-lite/ - vous probablement aussi, il offre beaucoup de bonnes explications

Autres conseils

En C ++, vous devez décider où vous voulez que votre objet de résider. Par où je veux dire dans laquelle la mémoire, la pile ou le tas.

instanciation d'un objet est un procédé en deux étapes. D'abord, vous avez besoin de mémoire et soit vous prenez sur la pile, ou vous la renvoyer dans le tas. Deuxièmement, vous Initialise la mémoire avec les valeurs que vous voulez, à savoir que vous construisez l'objet, en appelant sa fonction constructeur.

Ces deux syntaxe sont possibles pour ces deux différents emplacements de mémoire:. La pile et le tas

En ce qui concerne la syntaxe et la parenthèse manquante apparemment l'objet de pile alloué, il est entre la définition désambiguïser et la construction d'un objet, et la déclaration d'une fonction. En effet, ClassA obj(); déclare une fonction qui prend aucun paramètre et retourner un objet ClassA.

La syntaxe C est de comme ça. Si vous souhaitez utiliser le constructeur par défaut, vous appelez simplement comme ça:

ClassA obj1;

Si vous avez un constructeur avec un paramètre, vous appelleriez comme ceci:

ClassA obj1(5);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top