C++异常中生命周期回顾

来源:互联网 发布:js 公式编辑器 编辑:程序博客网 时间:2024/05/20 10:56

#include<iostream>using namespace std;class BadSrcType{public:BadSrcType(){cout << "BadSrcType构造函数\n";}BadSrcType(const BadSrcType &obj){cout << "BadSrcType拷贝构造函数\n";}~BadSrcType(){cout << "BadSrcType析构函数\n";}};class BadDestType{public:BadDestType(){cout << "BadDestTypee构造函数\n";}BadDestType(const BadDestType &obj){cout << "BadDestType拷贝构造函数\n";}~BadDestType(){cout << "BadDestType析构函数\n";}};class BadProcessType{public:BadProcessType(){cout << "BadProcessType构造函数\n";}BadProcessType(const BadProcessType &obj){cout << "BadProcessType拷贝构造函数\n";}~BadProcessType(){cout << "BadProcessType析构函数\n";}};//throw 类对象 类型异常void my_strcpy(char *to, char *from){if (from == nullptr){//抛异常时会不会产生匿名对象?throw BadSrcType();}if (to == nullptr){throw BadDestType();}if (*from == 'c'){cout << "开始BadProcessType类型异常\n";throw new BadProcessType;}while (*from != '\0'){*to = *from;to++;from++;}*to = '\0';return;}void main(){int ret = 0;char buf1[] = "cbcdef";char buf2[1024] = { 0 };try{my_strcpy(buf2, buf1);}catch (BadSrcType e)//结论1:抛出的时候不管产生的是否是匿名对象,//这里都是调用拷贝构造函数,将匿名对象拷贝给了e,也就是仍然遵循函数调用的规则{cout << "BadSrcType类型异常" << endl;}catch (BadDestType e){cout << "BadDestType类型异常" << endl;}//结论2:使用引用来接的话,会使throw抛出时产生的那个对象,不会调用拷贝构造函数/*catch (BadProcessType &e){   cout << "BadProcessType类型异常" << endl;}*///结论3:指针可以和元素或者引用写在一块,但是元素不能和引用写在一块catch (BadProcessType *e){//如果抛出的时候是&(BadProcessType()),虽然可以接受到//但是会出现野指针现象,因为原来的已经被释放了//抛出的是new BadProcessType这种则因为是动态管理//内存,而不会出现野指针现象cout << "BadProcessType类型异常" << endl;delete e;}catch (...){cout << "未知类型异常" << endl;}cout << buf2;getchar();return;}
这里引用和元素写在一起可能会出错,而指针则可以分别和二者写在一起,因为指针和二者的类型是不一样的,而引用和元素则不然。

0 0