007抛出类对象的时候使用new接收时候使用引用

#include<iostream>
using namespace std;

//抛出类对象的时候使用new接收时候使用引用
//throw int类型异常 进行字符串的复制
void my_strcpy1(char*to,char*from)
{
	if (from==NULL)
	{
		throw 1;
	}
	if (to==NULL)
	{
		throw 2;
	}
	//copy场景的检查
	if (*from=='a')
	{
		throw 3;//copy时候出错
	}
	while (*from!='\0')
	{
		*to = *from;
		to++;
		from++;
	}
	*to = '\0';
}
//throw char*类型异常 进行字符串的复制
void my_strcpy2(char*to, char*from)
{
	if (from == NULL)
	{
		throw "源地址出错";
	}
	if (to == NULL)
	{
		throw "目的地址出错";
	}
	//copy场景的检查
	if (*from == 'a')
	{
		throw "copy时候出错";//copy时候出错
	}
	while (*from != '\0')
	{
		*to = *from;
		to++;
		from++;
	}
	*to = '\0';
}
//抛出对象类型-
class BadSrcType{};
class BadDestType{};
class BadProcessType
{
public:
	BadProcessType()
	{
		cout << "BadProcessType构造函数do \n";
	}


	BadProcessType(const BadProcessType &obj)
	{
		cout << "BadProcessType copy构造函数do \n";
	}

	~BadProcessType()
	{
		cout << "BadProcessType析构函数do \n";
	}
};

void my_strcpy3(char*to, char*from)
{
	if (from == NULL)
	{
		throw BadSrcType();//调用无参数构造函数
	}
	if (to == NULL)
	{
		throw BadDestType();
	}
	//copy场景的检查
	if (*from == 'a')
	{
		throw BadProcessType();//copy时候出错,是否会产生一个无名对象???
		//会调用构造函数产生一个新对象
	}
	if (*from=='b')
	{
		throw &(BadProcessType());//会不会产生一个匿名对象??
	}
	if (*from=='c')
	{
		throw new BadProcessType();//会不会产生一个匿名对象?使用new来避免野指针
		//调用构造函数产生一个新对象
	}
	while (*from != '\0')
	{
		*to = *from;
		to++;
		from++;
	}
	*to = '\0';
}
int main(void)
{
	int ret = 0;
	char buf1[] = "aisuanjizuchengyuanli";
	char buf2[1024] = { 0 };
	try
	{
		//my_strcpy1(buf2, buf1);
		//my_strcpy2(buf2,buf1);
		my_strcpy3(buf2, buf1);

	}
	catch (int e)
	{
		cout << "抛出int类型异常----" << e << endl;

	}
	catch (char*e)
	{
		cout << "抛出字符串类型异常----" << e << endl;
	}
	catch (BadSrcType e)
	{
		cout << "BadSrcType类型异常" << endl;
	}
	catch (BadDestType e)
	{
		cout << " BadDestType 类型异常" << endl;
	}
	//结论1: 如果 接受异常的时候 使用一个异常变量,则copy构造异常变量.  
	/*
	catch( BadProcessType e) //是把匿名对象copy给e 还是e还是那个匿名对象
	{
	cout << " BadProcessType 类型异常" << endl;
	}
	*/
	//结论2: 使用引用的话 会使用throw时候的那个对象
	//catch( BadProcessType &e) //是把匿名对象copy给e 还是e还是那个匿名对象
	//{
	//	cout << " BadProcessType 类型异常" << endl;
	//}

	//结论3: 指针可以和引用/元素写在一块 但是引用/元素不能写在一块
	catch (BadProcessType *e) //是把匿名对象copy给e 还是e还是那个匿名对象
	{
		cout << " BadProcessType 类型异常" << endl;
		delete e;
	}
	//结论4: 类对象时, 使用引用比较合适 

	// --
	catch (...)
	{
		cout << "未知 类型异常" << endl;
	}

	cout << buf2 << endl;

	system("pause");
	return 0;
}


/*
1)throw的异常是有类型的,可以使,数字、字符串、类对象。
2)throw的异常是有类型的,catch严格按照类型进行匹配。
3)注意 异常对象的内存模型  。
结论:接受类异常的时候使用引用最好,throw的地方使用new。
*/

猜你喜欢

转载自blog.csdn.net/baixiaolong1993/article/details/89501095