Simon_CB_Zhao 2019-01-15 03:11 采纳率: 75%
浏览 484
已采纳

C++ const 引用捕获异常为什么是正确的?

C++ 使用const引用捕获异常 没有问题吗?如图所示,函数抛出临时对象应该是放在栈上的,捕获的时候使用的是const 引用,引用本质上就是指针,那么在使用引用的时候,对应的临时对象在栈上已经释放了呀?所以...

void MyFunc(int i)
{
    try
    {
        func(i);
    }
    catch(int i)
    {
        switch(i)
        {
            case -1:
                throw Exception(-1, "Invalid Parameter");
                break;
            case -2:
                throw Exception(-2, "Runtime Exception");
                break;
            case -3:
                throw Exception(-3, "Timeout Exception");
                break;
        }
    }
}

int main(int argc, char *argv[])
{
    try
    {
        MyFunc(11);
    }
    catch(const Exception& e)
    {
        cout << "Exception Info: " << endl;
        cout << "   ID: " << e.id() << endl;
        cout << "   Description: " << e.description() << endl;
    }
    catch(const Base& e)
    {
        cout << "catch(const Base& e)" << endl;
    }

    return 0;
}

展开全部

  • 写回答

2条回答 默认 最新

  • json_001 2019-01-15 06:31
    关注

    throw 表达式初始化一个称为异常对象的特殊对象,由编译器管理并驻留在catch可访问的空间。
    而&标号,只不过说可以直接操作这个对象而不是从新copy它。
    详细可参考 C++ prime 第17章。

    补充一下
    throw的时候其实创建两个对象,一个本对象,一个根据本地对象拷贝构造的特殊对象
    你的那个引用只不过指向了那个特殊对象。不用引用的话,也会再拷贝构造一个对象的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    洛水鱼 2023-08-03 07:19

    那请问一下,为什么”拷贝构造的特殊对象“,难道不用构造函数了吗,我重写了复制构造函数,复制运算来让静态变量加1,但运行结果告诉我就只运行了一次构造函数,没有使用复制构造函数和复制运算。怎么去用代码来捕获这个构造的过程

    回复
查看更多回答(1条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部