Frage

Seit ich von C# auf C++ umgestiegen bin, sieht für mich in C++ alles verrückt aus.Ich frage mich nur, ob mir jemand erklären könnte, warum wir in C++ diese Art der Instanziierung haben:Methode 1:

ClassA obj1; // this is going to stack

Methode 2:

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

wohingegen wir in C++ nicht über die übliche Instanziierung in C# verfügen:

ClassA  obj2 = new obj2();

und noch eine Frage in Methode 1: Ich bekomme eine Instanz von ClassA, aber ohne () und das ist genau die Stelle, an der ich verwirrt bin. Warum müssen wir so etwas instatiieren?unsere ClassA hat einen Konstruktor, aber Instanziierung ohne Klammern???Wie kommt es, dass wir seinen Konstruktor nennen?

p.s.:Ich habe diese Themen gelesen:

Verschiedene Methoden zum Instanziieren eines Objekts in C++

Stack, Static und Heap in C++

Was und wo sind der Stapel und der Heap?

War es hilfreich?

Lösung

In der Tat kann ich auch entmutigend sein, wenn ich von einer Sprache wie Java oder C# zu C ++ wechselt, ich habe es auch durchgemacht.

Der erste Unterschied besteht darin, dass Sie in C ++ fast immer Ihr eigenes Gedächtnis verwalten. Beim Erstellen eines Objekts auf dem Heap sind Sie für das Löschen verantwortlich, damit es keinen Speicher läuft. Dies bedeutet, dass Sie es bei der Passform löschen können. Beim Erstellen eines Objekts auf dem Stapel wird es automatisch gelöscht, wenn es aus dem Umfang ausgeht.

Beispiel:

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!)

gegen

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

Davon abgesehen unterscheiden sich die beiden Methoden in einem Aspekt auch erheblich: Der erste erstellt ein Objekt. Der zweite erstellt einen Zeiger auf ein Objekt. Das Schöne an Zeigern ist, dass Sie sie als Parameter weitergeben können, wobei nur minimaler Speicher auf den Stapel kopiert wird (der Zeiger wird anstelle des gesamten Objekts kopiert). Natürlich können Sie immer die Adresse eines Objekts erhalten, das auf dem Stapel zugewiesen wurde, indem Sie "&" verwenden oder sie als Referenz herumgeben - wenn Sie jedoch Objekte verwenden, die auf dem Stapel zugewiesen wurden, sind Sie besonders vorsichtig mit ihrem Bereich.

Ich habe diese Website eine großartige Ressource gefunden, als ich von Java zu C ++ übergegangen bin: http://www.parashift.com/c+-faq-lite/ - Sie werden es wahrscheinlich auch finden, es bietet viele gute Erklärungen

Andere Tipps

In C++ müssen Sie entscheiden, wo sich Ihr Objekt befinden soll.Mit „wo“ meine ich den Speicher, den Stapel oder den Heap.

Das Instanziieren eines Objekts erfolgt in zwei Schritten.Zuerst benötigen Sie Speicher, und Sie nehmen ihn entweder auf den Stapel oder weisen ihn vom Heap zu.Zweitens initialisieren Sie den Speicher mit den gewünschten Werten, d. h.Sie konstruieren das Objekt, indem Sie seine Konstruktorfunktion aufrufen.

Diese beiden Syntaxen gelten für diese beiden möglichen unterschiedlichen Speicherorte:der Stapel und der Heap.

In Bezug auf die Syntax und die scheinbar fehlende Klammer für das dem Stapel zugewiesene Objekt soll zwischen der Definition und Konstruktion eines Objekts und der Deklaration einer Funktion unterschieden werden.In der Tat, ClassA obj(); deklariert eine Funktion, die keinen Parameter annimmt und ein ClassA-Objekt zurückgibt.

C ++ Syntax ist einfach so. Wenn Sie den Standardkonstruktor verwenden möchten, nennen Sie ihn einfach so:

ClassA obj1;

Wenn Sie einen Konstruktor mit einem Parameter hätten, würden Sie ihn so nennen:

ClassA obj1(5);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top