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