← SEARCHABLE ARCHIVE
C / C++ · 2026-06-03

C++ von den Grundlagen bis zum Profi — Folge 7

Der Unterschied zwischen const, Referenzen und Zeigern

INTERACTIVE READING MODE →

Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.

Wenn Sie ein Objekt an eine Funktion übergeben, müssen Sie entscheiden, ob Sie einen Wert, eine Referenz oder einen Zeiger verwenden möchten. Obwohl sie oberflächlich betrachtet ähnlich sind, gibt es einen großen Unterschied in der Möglichkeit, sie zu kopieren und zu ändern.

Werte und Referenzen

void PrintItem(Item item);              //Wertvorbeigehen
void UpgradeItem(Item& item);           //als Referenz übergeben
void PrintItem(const Item& item);       //Übergabe konstanter Referenzen

Wenn Sie es als Wert übergeben, kann die Funktion eine separate Kopie erhalten. Wenn es sich um eine kleine Ganzzahl handelt, gibt es kein Problem, aber wenn es sich um eine Zeichenfolge und ein Objekt mit mehreren Mitgliedern handelt, ist das Kopieren möglicherweise nicht erforderlich.

Item&ist ein Alias ​​für das Original. Wenn Sie es innerhalb der Funktion ändern, wird auch das Original geändert. const Item&Vermeidet das Kopieren und verhindert die Änderung des Originals. Dieses Formular wird häufig verwendet, wenn ein Objekt übergeben wird, das nur gelesen werden soll.

class Monster
{
public:
    int GetHealth() const
    {
        return health;
    }

    const std::string& GetName() const
    {
        return name;
    }

private:
    int health = 100;
    std::string name = "Slime";
};

Die Konstante nach der Funktion bedeutet, dass diese Mitgliedsfunktion den Status des Objekts nicht ändert. const MonsterHier gibt es einen Unterschied zwischen aufrufbaren und nicht aufrufbaren Funktionen.

Zeichenfolgeconst std::string&Sie können das Kopieren der Zeichenfolge vermeiden, indem Sie zurückgeben. Es ist jedoch wichtig zu bedenken, dass es gefährlich wird, wenn das Originalobjekt vor der zurückgegebenen Referenz zerstört wird.

Zeiger

Ein Zeiger speichert die Adresse eines Objekts.

Monster monster;
Monster* target = &monster;

if (target != nullptr)
{
    std::cout << target->GetHealth() << '\n';
}

Ein normales Objekt ist.und das Objekt, auf das der Zeiger zeigt, ist->Ansatz. Ein Zeiger darf auf nichts zeigennullptrEine Inspektion ist erforderlich.

Der wichtige Punkt hierbei ist, dass die Tatsache, dass ein Zeiger auf ein Objekt zeigt, nicht unbedingt bedeutet, dass er Eigentümer dieses Objekts ist. Rohzeiger, bei denen nicht festgelegt ist, wer das Objekt zerstört, werden mit zunehmendem Code immer gefährlicher.

Monster* target = nullptr;

{
    Monster monster;
    target = &monster;
}

//Das Ziel enthält die Adresse eines Monsters, das bereits zerstört wurde.

Diese Art von Zeiger wird als baumelnder Zeiger bezeichnet. Selbst wenn die Adresse selbst bestehen bleibt, hat das Objekt an dieser Adresse bereits das Ende seiner Lebensdauer erreicht.

Referenzen eignen sich gut für Situationen, in denen sie auf ein gültiges Objekt verweisen müssen. Zeiger eignen sich für Situationen, in denen das Objekt möglicherweise nicht vorhanden ist oder auf ein anderes Objekt zeigt.

Und wenn der Zeiger das Objekt besitzen muss, ist es besser, intelligente Zeiger vor rohen Zeigern in Betracht zu ziehen.