2016-08-20 2 views
3

Ich habe vor kurzem aktualisiert meine C++ Kenntnisse in Operatorüberladung. Wie empfohlen, gebe ich einen Verweis auf *this für die operator overload of '=' zurück. Aber dann fand ich ein Problem: -Überladen von = Operator für eine Klasse

#include <iostream> 
using namespace std; 

class MyClass 
{ 
    int num = 4; 
    public: 
     MyClass() = default; 
     MyClass(int x) : num(x) {} 
     void getnum(int x) 
     { 
      num = x; 
     } 
     void shownum() 
     { 
      cout << num << '\n'; 
     } 
     MyClass& operator = (const MyClass& obj) // works even without const 
     { 
      this->num = obj.num; 
      return *this; 
     } 
     ~MyClass() = default; 
}; 

int main() 
{ 
    MyClass x, y(5), z(7); 

    z = MyClass(8) = y; // temporary object return reference 

    x.shownum(); 
    y.shownum(); 
    z.shownum(); 
} 

Dieser Code doesnt Ergebnis in ein UB obwohl ein temporäres Objekt MyClass(8) zwischen denen beteiligt ist, wird mit y (fein kein Problem) gleichgesetzt werden, aber dann ist es Bezug wird gesendet mit z gleichzusetzen. Warum tritt das Problem dangling reference hier nicht auf? Warum funktioniert die Überlastfunktion ohne const MyClass&' on the temporary object 'MyClass(8)?

+1

Es ist einer der impliziten Konvertierungen. Es ist vollkommen legitim, ein Objekt const flüchtiger zu machen – Incomputable

+0

Warum erwägen Sie, schreiben Sie solchen Code –

+0

Experiment @EdHeal :-P –

Antwort

4

Provisorien leben, bis der vollständige Ausdruck endet. Am Ende geht das Provisorium weg, aber bis dahin sind die Aufgaben erledigt und da Sie die Referenz nirgendwo speichern, ist es in Ordnung, dass das Provisorium verschwindet.

+0

@OlzhasZhumabek sie tun –

+0

@Joachim 'MyClass (8)' gibt einen Verweis auf sich selbst zurück, aber meine Frage ist, wenn es zerstört wird, sobald es ist used isn; t Die Referenz, die zur Gleichsetzung mit "z" gesendet wird, ist jetzt ungültig, weil das Temporäre zerstört wurde. –

+0

@JoachimPileborg, vergiss es. Ich habe alle Antworten von [Gotw] (https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/) :) – Incomputable

4

Die erste Zuweisung MyClass(8) = y; gibt eine MyClass& zurück, die nichts über eine temporäre sein wird. Und so stimmt es mit dem Parameter des nächsten operator= überein, ob dieser einen konstanten oder nicht konstanten Parameter erwartet.

Wenn Sie versuchen, nur einen temporären z = MyClass(8); zuzuweisen, werden Sie feststellen, dass der Parameter jetzt eine konstante Referenz sein muss.

Außerdem gibt es hier keine freien Referenzen, da temporäre Objekte bis zum Ende des vollständigen Ausdrucks (normalerweise ;) existieren und keine Zeiger oder Referenzen gespeichert werden. Nur Kopien der num Werte.

+0

Ok, das beantwortet die zweite Frage. Was ist mit dem ersten? –

+0

Richtig, zwei Fragen zum Preis von einem. :-) –

Verwandte Themen