Das ist eine sehr einfache Frage, ich habe sie durchsucht, aber ich möchte nur diese Community fragen, dass wir sowohl constructors
als auch methods
haben. Aber normalerweise verwenden wir Konstruktor, um die Variablen anstelle der Methoden zu initialisieren. Ich denke, dass beide verwendet werden können, um Variablen zu initialisieren. Was ist der grundlegende Unterschied zwischen beiden? Gibt es einen guten Grund?
Dies ist eine sehr grundlegende Frage, also ertragen Sie es wegen des Niveaus des Anfängers.
Danke im Voraus ..
Der wichtigste Unterschied: Wenn Sie ein Objekt instanziieren, wird sein Konstruktor aufgerufen, während das Aufrufen einer Methode immer optional ist. Sie könnten daher vergessen, Ihre Initialisierungsmethode aufzurufen und nicht alles korrekt zu initialisieren.
Zum Beispiel rufen all diese normalen Möglichkeiten zum Instanziieren eines Objekts den Konstruktor
auf %Vor%Oder wenn Sie obligatorische Argumente haben, definieren Sie keinen Standardkonstruktor und erfordern stattdessen eine Konstruktion mit Parametern:
%Vor%Dies hat den Vorteil, dass Sie die Argumente benötigen, bevor Sie die Klasse sogar instanziieren. Sie müssen also Folgendes tun:
%Vor%und Fehler beim Konstruieren mit gültigen Argumenten werden zu einem Compilerfehler:
%Vor%Also wann immer möglich, immer Fehler auf der Seite der Initialisierung in einem Konstruktor. In einigen Fällen ist ein Konstruktor möglicherweise nicht funktionsfähig. Die einzige Möglichkeit zum Scheitern eines Konstruktors besteht beispielsweise darin, eine Ausnahme zu verwenden. Das Scheitern zu konstruieren kann "Routine" und nicht wirklich außergewöhnlich sein. Auch Ausnahmen können auf manchen Architekturen teuer sein. Ein anderer Fall könnte sein, wenn Sie sicherstellen möchten, dass virtuelle Methoden vollständig gebunden sind, was nur nach der Konstruktion garantiert ist.
Sie können nicht beide zum Initialisieren von Elementvariablen verwendet werden. Es ist die Aufgabe des Konstruktors, Mitglieder zu initialisieren, und er wird automatisch aufgerufen, wenn Sie eine neue Instanz erstellen.
Betrachten Sie Folgendes:
%Vor% Ohne den Konstruktor wäre es nicht möglich, das Mitglied x
zu initialisieren.
Konstruktoren werden automatisch aufgerufen, sodass Sie sich keine Sorgen machen müssen, ob der Benutzer noch eine Initialisierungsmethode aufgerufen hat. Der Google-Style-Guide hat jedoch etwas zu Konstruktoren zu sagen :
Die Empfehlung von Google besteht darin, eine direkte Initiierung in einem Konstruktor und eine nicht-triviale Initiierung in einer separaten Methode zu ermöglichen.
Stellen Sie sich vor, Sie haben eine Member-Variable, die keinen leeren Konstruktor hat. Dann haben Sie keine andere Möglichkeit, als sie in der Initialisierungsliste Ihres Konstruktors zu initialisieren.
Auch der Konstruktor wird aufgerufen, wenn Sie ein Array mit dem neuen Operator zuweisen, während die Initialisierung mit Methoden den Code komplizierter macht.
Im Allgemeinen ist eine komplexe Logik im Konstruktor keine sehr gute Idee, aber eine einfache Initialisierung sollte dort vorgenommen werden (die Dinge, die Sie tun müssen, um sicherzustellen, dass Ihr Objekt in einem gültigen Zustand ist).
Die Initialisierung von Variablen ist zweifellos eine sehr wichtige Programmierpraxis. Wenn Sie Klassen verwenden, besteht die Option darin, sie innerhalb von Methoden zu initialisieren. Daher haben wir zwei Schritte: -
Aber wenn der Aufruf der Methode vergessen wird, haben die Variablen am Ende Junk-Werte. Um dem Programmierer das Leben zu erleichtern, wurde das Konzept einer Konstruktormethode eingeführt.
Mit Konstruktoren haben wir nur einen Schritt: -
Der 'aufrufende Teil' wird automatisch ausgeführt, wenn ein neues Objekt der Klasse erstellt wird.
Konstruktoren können für eine effiziente Speicherverwaltung verwendet werden, was mit Funktionen nicht möglich ist.
Destructor kann verwendet werden, um die Konstruktoren zu zerstören, wenn sie nicht benötigt werden.
Außerdem ist bekannt, dass die Verwendung von Kopierkonstruktoren Schwierigkeiten oder Fehler aufgrund von Speicherfehlern verhindert.
Tags und Links c++ constructor function