Wird geladen...

Operatorüberladung in C++

Lernen Sie Operatorüberladung in C++, um Operatoren für eigene Klassen anzupassen und effizient zu nutzen.

In C++ ermöglicht das Operator-Overloading (Operatorüberladung) die Neudefinition von Standardoperatoren (+, ==, <, << usw.) für benutzerdefinierte Klassentypen. Dadurch können Klassenobjekte wie eingebaute Typen (int, double usw.) verwendet werden. In diesem Artikel werden wir anhand der Book-Klasse arithmetische, Vergleichs- und Stream-Operatoren praxisnah untersuchen.


1. Was ist Operatorüberladung?

Mit Operatorüberladung kann man einem Operator ein spezielles Verhalten für eine Klasse geben. Zum Beispiel können zwei Book-Objekte mit + kombiniert oder mit == verglichen werden.

Operatorfunktionen werden wie normale Memberfunktionen definiert:


class KlassenName {
public:
    Rückgabewert operator<Operator>(Parameter) {
        // spezielles Verhalten
    }
};

Zum Beispiel bedeutet Book operator+(const Book& other), dass zwei Book-Objekte den +-Operator unterstützen.


2. Grundlegende Book-Klasse

Die folgende Klasse repräsentiert ein Buch mit Titel, Preis und Seitenzahl. Auf dieser Basis werden wir verschiedene Operatoren definieren.


#include <iostream>
#include <string>
using namespace std;

class Book {
private:
    string title;
    double price;
    int pages;

public:
    Book(string t = "", double p = 0.0, int pg = 0)
        : title(t), price(p), pages(pg) {}

    void Show() const {
        cout << "Buch: " << title
             << " | Seiten: " << pages
             << " | Preis: " << price << " €" << endl;
    }

    double GetPrice() const { return price; }
    int GetPages() const { return pages; }
    string GetTitle() const { return title; }
};

3. Der + Operator (Bücher kombinieren)

Wenn wir zwei Bücher mit + kombinieren, soll ein neues „Paket“-Buch entstehen. Der Preis ist die Summe der beiden Preise, und die Seitenzahl die Summe der Seiten.


Book operator+(const Book &other) const {
    string combinedTitle = title + " & " + other.title;
    double combinedPrice = price + other.price;
    int combinedPages = pages + other.pages;
    return Book(combinedTitle, combinedPrice, combinedPages);
}

Verwendung:


Book b1("C++ Primer", 180.0, 980);
Book b2("Effective C++", 150.0, 400);

Book combo = b1 + b2;
combo.Show();

Ausgabe:


Buch: C++ Primer & Effective C++
| Seiten: 1380 | Preis: 330 €

4. Der == Operator (Gleichheitsvergleich)

Um zu prüfen, ob zwei Bücher gleich sind, kann der ==-Operator überladen werden. Wenn Titel, Preis und Seitenzahl übereinstimmen, gelten sie als gleich.


bool operator==(const Book &other) const {
    return (title == other.title &&
            pages == other.pages &&
            price == other.price);
}

Verwendung:


Book a("1984", 99.9, 328);
Book b("1984", 99.9, 328);

if (a == b)
    cout << "Bücher sind gleich." << endl;
else
    cout << "Bücher sind unterschiedlich." << endl;

Ausgabe:


Bücher sind gleich.

5. Der < Operator (Vergleich)

Um Bücher nach Preis zu vergleichen, kann der <-Operator überladen werden. Dieser Operator wird z. B. von std::sort() oder std::set verwendet.


bool operator<(const Book &other) const {
    return price < other.price;
}

Verwendung:


Book b1("C++ Primer", 180, 900);
Book b2("Clean Code", 220, 500);

if (b1 < b2)
    cout << b1.GetTitle() << " ist günstiger." << endl;

Ausgabe:


C++ Primer ist günstiger.

6. Der ++ Operator (Seitenzahl erhöhen)

Der ++-Operator kann als Präfix oder Postfix definiert werden. In diesem Beispiel erhöht er die Seitenzahl eines Buchs.


// Präfix (++buch)
Book& operator++() {
    ++pages;
    return *this;
}

// Postfix (buch++)
Book operator++(int) {
    Book temp = *this;
    pages++;
    return temp;
}

Verwendung:


Book b("C++ 101", 120.0, 250);
++b;  // Präfix
b++;  // Postfix
b.Show(); // 252 Seiten

7. Der << Operator (Ausgabe mit ostream)

Wenn man ein Objekt direkt mit cout << b; ausgeben möchte, muss der <<-Operator global überladen werden. Er gibt in der Regel eine Referenz auf ostream zurück.


friend ostream& operator<<(ostream &os, const Book &b) {
    os << "[Buch: " << b.title
       << ", Seiten: " << b.pages
       << ", Preis: " << b.price << " €]";
    return os;
}

Verwendung:


Book b("Clean Architecture", 175.0, 350);
cout << b << endl;

Ausgabe:


[Buch: Clean Architecture, Seiten: 350, Preis: 175 €]

8. Vollständiges Beispiel: Alle Operatoren kombiniert


#include <iostream>
#include <string>
using namespace std;

class Book {
private:
    string title;
    double price;
    int pages;

public:
    Book(string t = "", double p = 0, int pg = 0)
        : title(t), price(p), pages(pg) {}

    Book operator+(const Book &other) const {
        return Book(title + " & " + other.title,
                    price + other.price,
                    pages + other.pages);
    }

    bool operator==(const Book &other) const {
        return (title == other.title && price == other.price);
    }

    bool operator<(const Book &other) const {
        return price < other.price;
    }

    Book& operator++() {
        ++pages;
        return *this;
    }

    Book operator++(int) {
        Book temp = *this;
        pages++;
        return temp;
    }

    friend ostream& operator<<(ostream &os, const Book &b) {
        os << b.title << " - " << b.price << " € (" << b.pages << " Seiten)";
        return os;
    }
};

int main() {
    Book b1("C++ Primer", 180.0, 900);
    Book b2("Effective C++", 150.0, 400);

    Book combo = b1 + b2;
    cout << combo << endl;

    ++combo;
    combo++;

    cout << "Nach Erhöhung: " << combo << endl;

    cout << (b1 < b2 ? "b1 ist günstiger" : "b2 ist günstiger") << endl;

    if (b1 == b2)
        cout << "Bücher sind gleich." << endl;
    else
        cout << "Bücher sind unterschiedlich." << endl;
}

Ausgabe:


C++ Primer & Effective C++ - 330 € (1300 Seiten)
Nach Erhöhung: C++ Primer & Effective C++ - 330 € (1302 Seiten)
b1 ist günstiger
Bücher sind unterschiedlich.

9. TL;DR

  • operator+ → Zum Kombinieren zweier Objekte.
  • operator== → Zum Überprüfen der Gleichheit.
  • operator< → Zum Vergleichen oder Sortieren.
  • operator++ → Für Inkrement-Operationen (Präfix/Postfix).
  • operator<< → Für die einfache Ausgabe mit cout (benötigt friend).
  • Operatorüberladung macht Klassen so benutzbar wie eingebaute Typen.
  • Alle Beispiele können in Visual Studio 2022 oder GCC 11+ kompiliert und ausgeführt werden.

Ähnliche Artikel