Heim  >  Artikel  >  Backend-Entwicklung  >  Können Sie einem R-Wert vom Klassentyp in C zuweisen?

Können Sie einem R-Wert vom Klassentyp in C zuweisen?

DDD
DDDOriginal
2024-10-28 09:26:29665Durchsuche

 Can You Assign to an Rvalue of Class Type in C  ?

Zuweisung zu Klassentyp-R-Werten

Übersicht

In der Programmiersprache C können R-Werte (rechte Werte) normalerweise nicht als L-Werte verwendet werden ( (linke Werte). Es gibt jedoch Ausnahmen von dieser Regel, wie der folgende Code zeigt:

<code class="cpp">class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}</code>

Überraschenderweise wird dieser Code erfolgreich kompiliert, obwohl das vom Konstruktor Y(1) zurückgegebene Objekt ein R-Wert ist. In diesem Artikel werden die Gründe für dieses unerwartete Verhalten untersucht.

Zuweisung zu Klassentyp-R-Werten

Der Schlüssel zum Verständnis, warum dieser Code gültig ist, liegt im Konzept synthetisierter Mitgliedsfunktionen. Für Klassen, die keinen expliziten Zuweisungsoperator definieren, generiert der Compiler einen Standardzuweisungsoperator. Dieser Standardoperator ist eine Mitgliedsfunktion, die als Parameter einen Verweis auf ein Objekt derselben Klasse akzeptiert.

Im obigen Beispiel wird der Zuweisungsoperator für Klasse Y wie folgt synthetisiert:

<code class="cpp">Y& Y::operator=(const Y& other);</code>

Bemerkenswert ist, dass dieser synthetisierte Zuweisungsoperator eine nicht konstante Memberfunktion ist. Dies bedeutet, dass es sowohl auf L-Werte (referenzierte Objekte) als auch auf R-Werte (nicht referenzierte Objekte) angewendet werden kann.

Konstruktor-Rückgabewerte

Wenn ein Objekt mit einem Konstruktor erstellt wird, der einen R-Wert zurückgibt, wird der Der Compiler generiert ein temporäres Objekt im Speicher. Dieses temporäre Objekt wird am Ende der Anweisung, in der es erstellt wurde, automatisch zerstört. Wenn der Konstruktor jedoch einen R-Wert vom Klassentyp zurückgibt, kann der synthetisierte Zuweisungsoperator die Lebensdauer des temporären Objekts verlängern.

Zuweisungssyntax

Die Zuweisungsanweisung Y(1) = Y(0); ist syntaktischer Zucker für den folgenden Code:

<code class="cpp">Y(1).operator=(Y(0));</code>

Wie wir festgestellt haben, ist der synthetisierte Zuweisungsoperator „operator=“ für Klasse Y eine nicht konstante Memberfunktion, was bedeutet, dass er auf einen R-Wert angewendet werden kann. Daher kann der Compiler die Zuweisungsanweisung als Zuweisung an das vom Konstruktor Y(1) erstellte temporäre Objekt interpretieren.

Schlussfolgerung

Im Gegensatz zu dem, was normalerweise erwartet wird, ist eine Zuweisung möglich zu einem R-Wert des Klassentyps in C, da der Compiler nicht konstante Zuweisungsoperatoren für Klassen ohne explizit definierten Zuweisungsoperator synthetisiert. Diese synthetisierten Zuweisungsoperatoren verlängern die Lebensdauer temporärer Objekte, die von Konstruktoren erstellt wurden, und ermöglichen Zuweisungen an R-Werte.

Das obige ist der detaillierte Inhalt vonKönnen Sie einem R-Wert vom Klassentyp in C zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn