Write a program illustrating that member object destructors are called for only those member objects that were constructed before an exception occurred. 定义类Item,并包含整型成员变量value,并在Item的构造函数中定义条件判断语句以抛出异常,例如: if ( value == 3 ) throw runtime_error( "An exception was thrown" ); main函数中构建若干Item对象,并在合适位置打印测试语句。
时间: 2024-02-13 12:04:16 浏览: 81
An extensive and dynamic trans-omic network illustrating promi
根据C++的异常处理机制,当在一个对象的构造函数中抛出异常时,该对象的析构函数不会被调用,因为该对象并没有完全构造成功。如果一个对象的构造函数中抛出了异常,那么该对象会被释放,而已经构造成功的成员对象会被析构。
下面是一个示例程序,演示了成员对象析构函数的调用情况。程序定义了一个Item类,它包含一个整型成员变量value。在Item的构造函数中,程序会对value进行条件判断,如果value等于3,则抛出一个runtime_error异常。在main函数中,程序构建了多个Item对象,并在合适的位置打印测试语句。程序执行过程中,如果某个Item对象的构造函数抛出了异常,则该对象会被释放,而已经构造成功的成员对象会被析构。
```c++
#include <iostream>
#include <stdexcept>
using namespace std;
class Item
{
public:
Item(int v) : value(v)
{
cout << "Constructing Item " << value << endl;
if (value == 3)
throw runtime_error("An exception was thrown");
}
~Item()
{
cout << "Destructing Item " << value << endl;
}
private:
int value;
};
int main()
{
try
{
Item item1(1);
Item item2(2);
Item item3(3);
Item item4(4);
}
catch (const exception& e)
{
cerr << "Exception caught: " << e.what() << endl;
}
return 0;
}
```
运行上述程序,可以看到程序先输出了构造Item对象的信息,然后在第三个对象的构造函数中抛出了异常。由于该对象没有构造成功,因此它的析构函数也没有被调用。而已经构造成功的对象的析构函数会被调用,依次输出析构Item对象的信息。最终输出异常信息,程序终止。
阅读全文