Frage

Ich schrieb vor kurzem ein Stück Code, das tat

SomeClass someObject;
mysqlpp::StoreQueryResult result = someObject.getResult();

wo Someclass :: getResult () wie folgt aussieht:

mysqlpp::StoreQueryResult SomeClass::getResult()
{
mysqlpp::StoreQueryResult res = ...<something>...;
return res;
}

Nun, das Beispiel in dem ersten Codeausschnitt verwenden, wenn ich kompilierte und lief, stürzte das Programm mit einem ABORT-Signal. Ich änderte dann das erste Snippet:

SomeClass someObject;
mysqlpp::StoreQueryResult result(someObject.getResult());

, die gut funktioniert. Auch, um zu versuchen, es aus, habe ich es wieder:

SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();

, die auch funktionierte gut.

Nun, ich kann einfach nicht herausfinden, warum das erste Beispiel nicht, und die nächsten beiden gelungen. Wie ich verstehe, im ersten Beispiel wird der Copykonstruktor verwendet Ergebnis zu initialisieren. Aber ist das nicht auch der Fall, in dem zweiten Beispiel? Also, warum gelingt das zweite Beispiel? Das dritte Beispiel macht ein wenig mehr Sinn -., Da die Kopie const nicht verwendet wird, weisen wir nur nach dem Bau

Kurz gesagt, was ist der Unterschied zwischen:

FooClass a = someObject.someMethodReturningFooClassInstance();

und

FooClass a(someObject.someMethodReturningFooClassInstance());?

Muchos Dank!

War es hilfreich?

Lösung

Ich glaube nicht, dass es ein Unterschied in den beiden Fällen. Das gleiche Copykonstruktor wird beide Male genannt.

Sind Sie sicher, dass die genau , was Sie in Ihrem Code geschrieben haben?

Andere Tipps

Strictly im ersten Fall spricht der Standardkonstruktor wird durch den Zuweisungsoperator und im zweiten Fall gefolgt nennt es verwendet nur den Kopierkonstruktor.

Okay, meine ursprüngliche Annahme falsch war, und offenbar in beiden Fällen nur der Copykonstruktor würde (auch ein zusätzlicher „Umwandlung“ Konstruktor in dem Zuordnungs Fall kann auch genannt werden) aufgerufen. Ich werde den Compiler nach etwas Schlaf anwerfen und überprüfen dies in meiner Entwicklungsumgebung.

Sie haben soeben einen Haltepunkt setzen könnte (oder sogar eine printf-Anweisung) innerhalb des Copykonstruktor, und Sie würden genau wissen, wann es genannt wurde, wissen Sie. SO kann nicht grundlegende Debuggen ersetzen. ;)

Aber ja, sollte der Copykonstruktor in den beiden ersten Fällen aufgerufen werden. Der dritte Fall verwendet die Zuweisung anstelle.

Haben Sie versucht, es im Debugger läuft? Es sollte auf ein Abbruchsignal brechen.

Nun, eigentlich die erste wird mit Operator = eine Zwischenkopie tun, während der zweite eine direkte Kopie Konstrukt tun.

ich denke, erster Fall wird der Wert (rechts Wert) zugeordnet object.It des Sendewert zu object.In 2,3 exmple ist Implizite Objekt und Explicit Objekt concept.You sollte von zugewiesenen Wert auf direktes Objekt nicht schreiben Code.

In der reinste Theorie, der Copykonstruktor sollte in beiden Fällen aufgerufen werden. Allerdings ist es etwas Rückgabewert Optimization (RVO) aufgerufen, die der Compiler darf in diesen Fällen verwenden. Wenn RVO verwendet wird, wird der Kopierkonstruktor nicht aufgerufen werden. Vielleicht ist Ihr Compiler verwendet RVO in einem Fall und nicht die anderen?

Edit: Dies gilt nur für den Fall

SomeClass someObject;
mysqlpp::StoreQueryResult result;
result = someObject.getResult();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top