C++ 异常捕获与普通函数的对象传递区别

引用自:《More Effective C++》

第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象做为参数传递给函数时不一定需要被拷贝。
注:异常对象抛出时一定会进行一次拷贝,捕获时使用引用传递就不需要拷贝了。作为参数被传递给函数时,函数处可能是引用参数,就不需要复制对象。

第二、对象做为异常被抛出与做为参数传递给函数相比,前者类型转换比后者要少(前者只有两种转换形式)。
注:前者智能转换继承类为基类、指针到空指针;后者可以各种隐式转换。

第三、catch 子句进行异常类型匹配的顺序是它们在源代码中出现的顺序,第一个类型匹配成功的 catch 将被用来执行。当一个对象调用一个虚拟函数时,被选择的函数位于与对象类型匹配最佳的类里,即使该类不是在源代码的最前头。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda函数C++11引入的一种新特性,是一种可以在运行时定义函数对象的方式,它可以在需要的地方直接使用,而无需事先定义一个命名函数。Lambda函数可以作为参数传递给其他函数,并可以在函数内部定义,从而提高代码的可读性和可维护性。 Lambda函数的语法如下: ``` [capture list] (parameter list) -> return type { function body } ``` 其中,方括号内的“capture list”用于捕获Lambda函数的上下文中的变量,可以为空。括号内的“parameter list”和箭头符号(->)后面的“return type”与普通函数参数和返回值类型类似。而花括号内的“function body”则是Lambda函数的具体实现。 例如,下面的Lambda函数将两个整数相加并返回结果: ``` auto add = [](int a, int b) -> int { return a + b; }; int result = add(1, 2); // result = 3 ``` 在Lambda函数中,我们使用了“[]”对变量进行捕获,这里为空表示不捕获任何变量。而括号内的“int a, int b”则表示Lambda函数参数列表,箭头符号后面的“int”表示返回值类型,花括号内的代码则是Lambda函数的具体实现。 Lambda函数还支持自动类型推导,例如: ``` auto add = [](auto a, auto b) { return a + b; }; int result1 = add(1, 2); // result1 = 3 double result2 = add(1.5, 2.5); // result2 = 4.0 ``` 这里,Lambda函数参数类型和返回值类型都使用了“auto”关键字,表示编译器可以自动推导类型。 Lambda函数还可以作为其他函数参数进行传递,例如: ``` void runFunction(std::function<int(int, int)> func) { int result = func(1, 2); std::cout << "Result: " << result << std::endl; } runFunction([](int a, int b) -> int { return a + b; }); // 输出 "Result: 3" ``` 这里,我们定义了一个名为“runFunction”的函数,它的参数为一个返回值类型为“int”的Lambda函数。在调用“runFunction”时,我们将一个Lambda函数作为参数传递给它。在函数内部,我们使用入的Lambda函数计算结果,并输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值