constructor direkt aufrufen?



  • Hallo,
    ich will in einer Funtion ein Objekt zurückgeben.

    class A{
      public:
      A(B b, C c);
    };
    
    A f(){
      C c;
      B b;
      A a(b,c);
      return a;
    }
    

    soweit so schlecht! A's zuerstellen ist schon teuer ( bei mir hier, im Beispiel nicht, ist klar!) und kopieren ist noch teurer.
    Spricht was dagegen gleich

    return A::A(b,c);
    

    zu machen. Haltet mich nicht für bekloppt aber ich habe noch NIE nen Konstruktor direkt aufgerufen und das füht sich sehr ungewohnt an! Daher die Frage!
    Funktionieren tut es ja erst mal...

    Schon mal danke!

    Peanut



  • das geht so.



  • Wobei hier sogar der Compiler evtl. noch mehr hilft. In Deinem Fall:

    // Aufruf
    A a1;
    A a2 = a1.f();
    

    Man könnte annehmen, daß hier im return innerhalb von f der Konstruktor (B,C) aufgerufen wird, und bei a2 = der Copycon von A. Das muß nicht sein, es ist dem Compiler nämlich erlaubt das Objekt a2 direkt in der Form a2(b,c) zu konstruieren, wodurch ein Konstruktor wegfällt.

    Nennt sich inplace construction.



  • Haltet mich nicht für bekloppt aber ich habe noch NIE nen Konstruktor direkt aufgerufen

    Und das wird sich wohl auch NIE ändern (es sein den das Standard-Komitee beschließt die Sprache zu verändern), da ein Konstruktor *niemals* direkt aufgerufen werden kann.



  • Original erstellt von Marc++us:
    Nennt sich inplace construction.

    mhm...
    ist das nur ein spezialwort fuer '(named) return value optimization' oder ist das ganze konzept anders?



  • ist das nur ein spezialwort fuer '(named) return value optimization' oder ist das ganze konzept anders?

    Also in letzter Zeit habe ich "inplace construction" nur noch im Zusammenhang mit placement-new gelesen. Das hier würde ich auf jeden Fall als RVO bezeichnen.



  • warum nicht gleich
    return A(B(),C());

    [ Dieser Beitrag wurde am 14.06.2003 um 13:08 Uhr von PeterTheMaster editiert. ]



  • @PeterTheMaster
    Ich würde mal behaupten, dass es sich hier um eine vereinfachte Darstellung des Problems handelte. Ansonsten wäre auch deine Lösung noch zu kompliziert, da man sich den Funktionsaufruf und damit das return schlicht und einfach sparen könnte.



  • naja, den funktionsaufruf braucht man ja vielleicht als abstraktion.
    natuerlich beziehe ich mich nur auf das konkrete beispiel und peanut muss selbst sehen, ob das in seinem kontext immer noch geht oder nicht.


Anmelden zum Antworten