Übergabe als Wert



  • Wenn ich einer Funktion ein Objekt als Wert übergebe dann wird doch innerhalb dieser Funktion mit einer Kopie dieses Objektes gearbeitet und nicht mit dem Original. Das heißt nach dem verlassen der Funktion wird dieses Objekt doch auch wieder zerstört (der Destruktor aufgerufen). Mal angenommen die Funktion hat einen Rückgabetyp vom Typ des übergebenen Objektes und ich gebe das gleiche Objekt auch wieder zurück. Warum kann ich ein Objekt was doch eigentlich beim verlassen der Funktion zerstört wird trotzdem zurückgeben und im Aufrufer damit weiterarbeiten?



  • der rückgabewert ist wieder eine Kopie!



  • wird diese Kopie dann zerstört wenn der Aufrufer beendet wird?



  • Das Objekt wird mit Hilfe des Copy-Constructors kopiert - einmal beim Übergeben an die Funktion und einmal beim Zurückgeben. Sehr deutlich wird das mit solchen Tests:

    class Test
    {
        static int num;
        int myNum;
    
        public:
            Test ()
                :
            myNum(++num)
            {
                cout << "Construction of " << myNum << endl;
            }
            Test (const Test& rhs)
            {
                myNum = ++num;
                cout << "Copy of " << rhs.myNum << " to " << myNum << endl;
            }
            ~Test ()
            {
                cout << "Destruction of " << myNum << endl;
            }
    };
    
    int Test::num = 0;
    
    Test myFunc (Test obj)
    {
        obj.doSomething();
        return obj;
    }
    
    ...
    
    {
        Test a;
        Test b = myFunc(a);
    }
    

    MfG SideWinder



  • Wernus schrieb:

    wird diese Kopie dann zerstört wenn der Aufrufer beendet wird?

    Ja, wenn sein Scope zu Ende ist.

    {
        Test a; 
        Test b = myFunc(a);
    }// Hier werden a und b zerstört
    

    MfG SideWinder



  • in diesem Fall müssten insgesamt 4 Objekte erstellt werden:

    1)a
    2)b
    3)der parameter von Func (wird beim Verlassen von Func zerstört)
    4)ein Temporäres Objekt als Rückgabewert von Func (Wird nach der Übergabe an b zerstört)



  • pumuckl schrieb:

    in diesem Fall müssten insgesamt 4 Objekte erstellt werden:

    4)ein Temporäres Objekt als Rückgabewert von Func (Wird nach der Übergabe an b zerstört)

    Wird das Temponäre Objekt nun nach der Übergabe an b zerstört oder nach dem Funktionsende?



  • Hi,

    nach der übergabe an b sonst würden rückgabewerte by-value keinen sinn machen, weil man sie eh nicht zuweisen könnte.


Anmelden zum Antworten