构造函数中可不可以抛出异常?当然可以。从语法上来说,是可以的;从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常。
那么,如果构造函数中抛出异常,会发生什么情况呢?
一、构造函数中抛出异常将导致对象的析构函数不被执行。
C++仅能 delete 被完全构造的对象(fully constructed objects),只有一个对象的构造函数完全运行完毕,这个对象才被完全地构造。所以如果在构造函数中抛出一个异常,这个异常将传递到创建对象的地方(程序控制权也会随之转移),这样对象就只是部分被构造,它的析构函数将不会被执行。
看下面的示例:
#pragma once
#include <iostream>
#include <string>
using namespace std;
/******************类定义**********************/
class person {
public:
person(const string& str):name(str)
{
//throw exception("测试:在构造函数中抛出一个异常");
cout << "构造一个对象!" << endl;
};
~person()
{
cout << "销毁一个对象!" << endl;
};
private:
string name;
};
/******************测试类**********************/
int main()
{
try
{
person me("songlee");
}
catch(exception e)
{
cout << e.what() << endl;
};
getchar();
return 0;
}