一直对C++中的try catch结构非常的疑惑。
编写了如下代码来查看被throw的对象,怎样被catch到的。
// test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cstdlib> #include <new> #include <iostream> #include <string> using namespace std; class object { static int i; int locali; public: ~object() { cout<<"~object()"<<locali<<endl; } object():locali(0) { i++; locali=i; cout<<"object(): "<<locali<<endl; } friend ostream& operator<<(ostream& io,object obj) { return io<<"object: "<<obj.locali; } protected: private: }; int object::i=0; int f() { throw object(); cout<<"throwed"<<endl; return 1; } int main() { try{ f(); cout<<"end f()"<<endl; } catch(object& obj) { cout<<obj<<endl; } getchar(); }
该程序的结果为:
object(): 1
~object()1
object: 1~object()1
~object()1
很是奇怪啊。
析构函数被调用了三次,构造函数只调用了一次。
并且cout<<obj<<endl;中的endl换行没有打出来。
下面这段继承的throw对象程序,输出也有问题:
// test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cstdlib> #include <new> #include <iostream> #include <string> using namespace std; class object { protected: string str; static int i; int locali; public: virtual ~object() { cout<<"~object()"<<locali<<endl; } object():locali(0),str("object") { i++; locali=i; cout<<"object(): "<<locali<<endl; } friend ostream& operator<<(ostream& io,object obj) { return io<<obj.str<<": "<<obj.locali; } protected: private: }; class derived: public object { public: derived():object() { str="derived"; i++; locali=i; cout<<"derived(): "<<locali<<endl; } virtual ~derived() { cout<<"~derived()"<<locali<<endl; } }; int object::i=0; int f() { throw derived(); cout<<"throwed"<<endl; return 1; } int main() { try{ f(); cout<<"end f()"<<endl; } catch(object& obj) { cout<<obj <<endl; } getchar(); }
输出为:
object(): 1
derived(): 2
derived: 2~object()2
~derived()2
~object()2
~object()被多执行了一次。非常的奇怪。