Block- und Typkonvertierung in C++ abfangen

Block- und Typkonvertierung in C++ abfangen

Sagen Sie die Ausgabe des folgenden C++-Programms voraus.




#include <iostream> using namespace std; int main() {      try      {          throw 'x' ;      }      catch ( int x)      {          cout << " Caught int " << x;      }      catch (...)      {          cout << "Default catch block" ;      } }

 

 

Ausgabe:

 Default catch block

Im obigen Programm wird ein Zeichen „x“ geworfen und es gibt einen Catch-Block, um ein int zu fangen. Man könnte meinen, dass der int catch-Block abgeglichen werden könnte, indem der ASCII-Wert „x“ berücksichtigt wird. Aber solche Konvertierungen werden nicht für Catch-Blöcke durchgeführt. Betrachten Sie das folgende Programm als weiteres Beispiel, bei dem der Konvertierungskonstruktor nicht für das ausgelöste Objekt aufgerufen wird.




#include <iostream> using namespace std; class MyExcept1 {}; class MyExcept2 { public :      // Conversion constructor      MyExcept2 ( const MyExcept1 &e )      {          cout << "Conversion constructor called" ;      } }; int main() {      try      {          MyExcept1 myexp1;          throw myexp1;      }      catch (MyExcept2 e2)      {          cout << "Caught MyExcept2 " << endl;      }      catch (...)      {          cout << " Default catch block " << endl;      }      return 0; }

 

 

Ausgabe:

Default catch block

Als Nebenbemerkung werden die abgeleiteten Typobjekte in den Basistyp konvertiert, wenn ein abgeleitetes Objekt ausgelöst wird und es einen Catch-Block gibt, um den Basistyp abzufangen. Weitere Einzelheiten finden Sie in diesem GFact.
Bitte schreiben Sie Kommentare, wenn Sie etwas Falsches finden oder weitere Informationen zu dem oben diskutierten Thema teilen möchten.