“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”

Posted joker D888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”相关的知识,希望对你有一定的参考价值。

“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”

主题

  • 讨论异常中对象的生命周期,以及最优的异常接受方式
#include<iostream>
using namespace std;
class Maker 
public:
	Maker() 
		cout << "Maker的构造" << endl;
	
	Maker(const Maker& m) 
		cout << "Maker的拷贝构造" << endl;
	
	~Maker() 
		cout << "~Maker的析构" << endl;
	
;
//-----------------------------------------------------------------------------------
//产生三个对象
void func1() 
	Maker m;	//第一个对象,在异常接受前被释放
	throw m;	//第二个对象,是第一个对象拷贝过来的


void test01() 
	try 
		func1();
	
	catch(Maker m1)	//第三个对象,是第二个对象拷贝过来的
		cout << "接受一个Maker类型的异常" << endl;
		//第二个和第三个对象在catch结束时释放
	

//输出:
//Maker的构造
//Maker的拷贝构造
//Maker的拷贝构造
//~Maker的析构
//接受一个Maker类型的异常
//~Maker的析构
//~Maker的析构

//----------------------------------------------------------------------------------
//产生两个对象
void func2() 
	//第一个对象
	throw Maker();
	//匿名对象,虽然通常说匿名对象的结束在当前行,但通过输出语句可看到,此匿名对象的释放并不在当前行,
	//此时的匿名对象被throw返回,暗地里实际已有名字了,有名则存

void test02() 
	try 
		func2();
	

	catch (Maker m1) 		//第二个对象,从第一个对象拷贝而来
		cout << "接受一个Maker类型的异常" << endl;
		//第1个和第2个对象在catch结束时释放了
	

//输出
//Maker的构造
//Maker的拷贝构造
//接受一个Maker类型的异常
//~Maker的析构
//~Maker的析构

//---------------------------------------------------------------------------------------------
//以上操作比较耗费内存,常用这一个,只生成一个对象
void func3() 
	throw Maker();//匿名对象

void test03() 
	try 
		func3();
	
	catch (Maker& m1) 	
		//引用接收,不能用指针接受,会宕掉,因为编译器不允许对栈中的匿名对象取地址操作
		//但编译器允许对堆区中的匿名对象取地址操作,见test04()
		cout << "接受一个Maker类型的异常" << endl;
		//对象释放
	

//输出:
//Maker的构造
//接受一个Maker类型的异常
//~Maker的析构

//---------------------------------------------------------------------
void func4() 
//    throw Maker();	//错误,若非要用指针接受,需要在堆区开辟一个对象
	throw new Maker();//匿名对象

void test04() 
	try 
		func4();
	
	catch (Maker* m1) 
		cout << "接受一个Maker类型的异常" << endl;
		//对象释放
		delete m1;
	

//输出:
//Maker的构造
//接受一个Maker类型的异常
//~Maker的析构
//--------------------------------------------------------------------------
//总上所述,最适合用匿名对象和引用来抛出接受
int main(void)

	test04();
	return 0;


总结

  • 通过以上代码,可以看出,通过匿名对象和引用来抛出异常进行接收是比较适当的。

以上是关于“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”的主要内容,如果未能解决你的问题,请参考以下文章

编程语言的发展趋势及未来方向

文件系统基础及ext文件系统创建及管理详解文件系统的使用及卸载fstab文件格式及自动挂载系统的

c#面试问题及答案

Docker运行MongoDB及Redis及ssh端口映射远程连接

关于面试题目及答案

Redis的消息订阅及发布及事务机制