Unterschied zwischen Konstruktoren und (get und set)-Methoden in C++?

5 Antworten

Konstruktoren dienen dazu, schon bei der Erstellung des Objekts die nötigen Attribute entgegenzunehmen und zu speichern.

Getter und Setter hingegen dienen dazu, die Attribute von einem bestehenden Objekt zu bekommen oder zu verändern

Also beide erfüllen ja theoretisch den gleichen Zweck in einer Klasse.

Nein. Der Konstruktor dient dem Setup eines Objekts. Er wird nur einmal bei Erstellen des Objekts ausgeführt. Ein Getter gibt den aktuellen Zustand eines Objekts zurück (bspw. den Wert eines Attributs) und ein Setter verändert ihn (ebenso kann es natürlich auch statische Getter/Setter geben, die also den Zustand aller Instanzen einer Klasse ändern/zurückgeben). Methoden können mehrmals aufgerufen werden. Entweder über die Lebenszeit der Klasse hinweg (objektungebundene/statische Methoden) oder nur während der Lebenszeit eines konkreten Objekts (objektgebundene/Instanz-Methoden).

Bezüglich des Einsatzgebiets sind Setter und Getter häufig eher außerhalb der Klasse aufzufinden, wenn mit den nichtsichtbaren Attributen eines Objekts (/) der Klasse gearbeitet werden soll. Innerhalb der Klasse macht es Sinn, wenn bspw. wirklich sichergestellt werden soll, dass sich ein Attribut nur auf bestimmte Art und Weise ändert oder der Wert stets entsprechend (durch dessen Getter) gefiltert werden soll.

Nur kann man mit einem Konstruktor mehrere Variablen bedienen.

Das kann man mit einem Setter ebenso. Es ist zwar meist üblich, für jedes Attribut, welches nach außen hin veränderbar sein soll, auch einen konkreten Setter zu definieren, doch was sollte dagegen sprechen, einen für mehr als nur ein Attribut anzulegen, wenn es Sinn ergibt?

Einfaches Beispiel (Anmerkung: Ich lasse der Einfachheit halber mal const correctness, Zeiger, Namespaces, etc. außen vor):

class Person {
  public:
    void setName(string firstName, string lastName);
    
    // maybe further methods ...

  private:
    string _firstName;
    string _lastName;
};

// implementation
void Person::setName(string firstName, string lastName) {
  _firstName = firstName;
  _lastName = lastName;
}

Zusätzlich könnten natürlich dennoch einzelne Setter für die beiden jeweiligen Attribute definiert werden.

Also warum sollte ich Methoden Konstruktoren vorziehen?

Das solltest du so nicht betrachten. Richte dich eher danach, was für deinen konkreten Fall am ehesten Sinn ergibt. Soll es möglich sein, ein Attribut bereits zu Beginn zu setzen und wenn ja, ist es später noch von außen veränderbar? Oder ist es eher sinnvoll, es setzen zu lassen, wenn das Objekt schon lange existiert?

Ein Beispiel für letzteren Fall fällt mir spontan bspw. bei Java Swing-Komponenten wie JButton ein (ein Frame ist hier als ein . Dessen Zustand kann in zahlreicher Hinsicht geändert werden - Breite, Höhe, Sichtbarkeit, Ausrichtung, usw. ... Aufgrund dieser Vielzahl hat man nun aber nicht für jeden Fall einen Konstruktor definiert, sondern mit Erstellen des JButton-Objekts werden einfach intern Standardwerte für die Komponenten-Eigenschaften gesetzt und die kann man via Setter nach und nach wieder überschreiben.

Unterschied zwischen Konstruktoren und (get und set)-Methoden in C++?

Weitere Unterschiede:

  • Methoden können einen Rückgabetyp definieren. Ein Konstruktor kann dies nicht.
  • Methoden sind freier in ihrer Benennung und können überschrieben werden. Bei Getter- und Setter-Methoden wird der Name nach Maßregelung von Konventionen festgelegt.
  • Jedes Objekt hat mindestens einen Konstruktor, aber n Methoden, wobei n auch 0 sein kann.
  • Getter und Setter sind ein Erzeugnis eines zusätzlichen / ergänzenden Konzepts / einer Konvention (Data-Hiding). Sie sind, wie schon im vorherigen Punkt angedeutet, technisch betrachtet nicht zwingend notwendig für ein Objekt. Der Konstruktor selbst jedoch ist ein fester Bestandteil der Sprache.

Einen konstruktiv rufst du nur einmal am Anfang auf. Get und set Methoden später, wenn das Objekt schon erzeugt wurde und benutzt wird.

Ein Konstruktor erstellt eine neue Instanz eines Objektes, möglicherweise mit Objekten, die ihm als Argumente übergeben wurden. Getter und Setter hingegen ermöglichen es, von außen einen Wert des erstellten Objektes abzurufen (get) und/oder einen Wert des Objektes zu ändern (set). Das sind zwei grundverschiedene Dinge!

getter und setter verwendest du normalerweise nicht in der Klasse, in der sie definiert sind, sondern in der Klasse die ein Objekt der Klasse mit den gettern und settern baut. Es kann sein, dass du z.B. den Namen eines Objektes wissen willst, der aber zufällig erzeugt wird. Dann könntest du nach der Erzeugung die passende get() Methode verwenden. Hast du Objekte, deren Namen zufällig erzeugt wird, willst aber ein Objekt mit einem bestimmten Namen haben, so kannst du set() verwenden. Ich hoffe das war einigermaßen verständlich erklärt und ich habe deine Frage richtig verstanden.

mfg Dwayne

Woher ich das weiß:Hobby