#include <iostream>
#include <exception>
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
};
int main()
{
try
{
myexception myex;
printf("addr1:%x\n",&myex);
throw myex;
}
catch (exception& e)
{
printf("addr2:%x\n",&e);
cout << e.what() << endl;
}
return 0;
}
Ausgabe dieses Programms:
addr1:6d78c020
addr2:20a1080
My exception happened
Frage: Sehen Sie addr1 und addr2 verschieden sind, eine Idee, warum?C++ - Ausnahmebehandlung durch Verweis übergeben: geworfene Adresse unterscheidet sich von abgefangener Adresse?
Kopie wird nur im Falle von Pass-by-Wert richtig gemacht? , aber hier habe ich den Code eingefügt, der Pass-by-Reference verwendet. –
Der 'throw' macht die Kopie aus. Sie fangen eine Referenz, aber es ist ein Verweis auf die Kopie, die von 'throw' gemacht wurde. –
in C++ - Objekten werden erstellt, indem der entsprechende Konstruktor entweder als Standard oder als Kopierkonstruktor aufgerufen wird. Stimmst du mir zu? Im obigen Beispiel ist addr2 ein neues Objekt, das durch den Aufruf des Kopierkonstruktors erstellt wurde. Meine Frage ist, Kopierkonstruktor wird nur für den Vorübergehender-Wert nicht für den Vorübergehender-Verweis aufgerufen. –