一直对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()被多执行了一次。非常的奇怪