拷贝构造函数的调用
拷贝构造函数会在以下三中情况下被调用
(1)当类的一个对象去初始化该类的另一个对象时
int main(){
  Point a(1,2);
  Point b(a);//用对象a初始化对象b,拷贝构造被调用
  Point c=a;//用对象a初始化对象c,拷贝构造被调用
  return 0;
}
细节:上面两种只是写法形式上不一样,执行的操作完全一样
(2)如果函数的形参是类的对象,调用函数时,进行形参和实参的结合
void(Point p){
  cout<<p.getX()<<endl;
}
int main(){
  Point a(1,2);
  f(a);//函数的形参为类的对象,当调用函数时,拷贝构造函数被调用
  return 0;
}
细节:只有对象用值传递时,才会调用拷贝构造,就像上面的那样。如果用传递引用,则不会调用拷贝构造,即Point &p就不会拷贝构造,这样也会减少时间的调用,效率也会比较高,多采用这种形式。
(3)如果函数的返回值是类的对象,函数执行完成返回调用者时
Point g(){
  Point a(1,2);
  return a;//函数的返回值是类的对象,返回一个对象时会调拷贝构造
}
int main(){
  Point b;
  b=g();
  return 0;
}
细节:表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立它的函数g以后就消亡了,不可能在返回主函数后继续生存。所以在处理这种情况时编译系统在主函数中创建一个无名临时对象,该临时对象的生存期只在函数调用处的表达式中。也就是表达式“b=g()”中,执行语句"return a;时,实际上是调用拷贝构造将a的值复制到临时对象中。函数g运行结束时对象a消失,但临时对象会存在于表达式"b=g()”中。计算完这个表达式后,临时对象的使命也就完成了,该临时对象便自动消失。

这里第三种情况有点特别会生成临时对象,接下来就是throw和return这里的相似的特性。

throw可以抛出的类型是 int、float、bool 等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型。

看一个习题
#include<iostream>
using namespace std;

class Base
{
  public: Base() { cout<<1; }
    Base(Base&b){ cout<<2; }
    ~Base() { cout<<3; } };
int f(int a,int b)
{
  if(b==0)
  {
    Base b; throw b;
  }
  else return a/b;
}
int main()
{
  try { cout<<f(9,0); }
  catch(Base b) { cout<<4; }
}
//VC下运行结果1223433
//CB下运行结果1232433

主要说一下在CB下的那种情况,编译器不一样那在这种创建临时对象的情况下优化的也就不一样。
主函数里try去调用函数f然后在f中b==0,创建一个对象b,调构造函数输出1,throw b,与return很相似,创建临时对象,调拷贝构造输出2,然后离开函数f,调析构函数,f里的b析构了输出3,到catch 把临时对象初始化形参b,调拷贝构造输出2,然后输出4,主函数结束,临时对象和形参b都析构输出两次2,即1232433。
小结:在对于返回和抛出一个对象的时候其实throw和return的相似度很高,内部的操作也十分相似。

return和throw某些特性相似的更多相关文章

  1. 错误处理之try、catch、finally中的return、throw执行顺序。

    今天遇到一个让人无语的代码块 try { bilSheetService.syncUser(bilWebseviceLog, userId, optType); }catch (Exception e ...

  2. java异常处理-finally中使用return和throw语句

    java异常语句中的finally块通常用来做资源释放操作,如关闭文件.关闭网络连接.关闭数据库连接等.正常情况下finally语句中不应该使用return语句也不应该抛出异常,以下讨论仅限于java ...

  3. java 異常抛出 throw 與 return

    package 異常;    public class TestException {      public TestException() {      }        boolean test ...

  4. node中的流程控制中,co,thunkify为什么return callback()可以做到流程控制?

    前言 我在学习generator ,yield ,co,thunkify的时候,有许多费解的地方,经过了许多的实践,也慢慢学会用,慢慢的理解,前一阵子有个其他项目的同事过来我们项目组学习node,发现 ...

  5. C++的优秀特性6:智能指针

    (转载请注明原创于潘多拉盒子) 智能指针(Smart Pointer)是C++非常重要的特性.考虑如下一段使用简单指针(Plain Pointer)的代码: A* a = new A(); B* b ...

  6. .NET面向对象特性之封装

    .NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...

  7. [干货来袭]C#7.0新特性(VS2017可用)

    前言 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下其实2016年12月就已经公布了的C#7 ...

  8. 轻松学会ES6新特性之生成器

    生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...

  9. C#7.0新特性

    前言 微软昨天发布了新的VS 2017 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下其实2016年12月就已经公布了的C#7 ...

随机推荐

  1. selenium启动报错“ incorrect JSON status mapping for 'unknown error' (500 expected)”

    前面讲了工程启动报错“selenium启动报错Unable to read VR Path Registry from C:\Users\clinva\AppData\Local\openvr\ope ...

  2. C语言--第0份作业

        对网络专业的了解 •网络专业是现如今比较难学的科目,要学习利用计算机对网络进行管理开发. •网络专业对于思维的要求比较高,需要我们有一定的数学思维. •网络专业的人才比较缺失,只要我们学的足够 ...

  3. set操作

    Set操作,Set集合就是不允许重复的列表 sadd(name,values) # name对应的集合中添加元素 scard(name) 获取name对应的集合中元素个数 sdiff(keys, *a ...

  4. L1-046 整除光棍 大数除法

    L1-046 整除光棍(20 分) 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整 ...

  5. ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)

    1.之前搭建的kafka,过了好久,去启动kafka,发现报如下下面的错误,有错误就要解决了. 然后参考:https://blog.csdn.net/hello_world_qwp/article/d ...

  6. Explanation About Initilizing A DirextX3D Class 关于初始化Direct3D类的解释

    目录 DirectX11 Study Note Create a DirectX graphics interface factory.创建一个DirectX图形界面工厂 CreateDXGIFact ...

  7. Ubuntu 备份系统为ISO镜像 & 解决ISO限制4GB大小 & Clone当前系统到其他电脑

    看标题,标题涵盖了3个部分,Ubuntu 备份系统为ISO镜像,  解决ISO限制4GB大小 ,  Clone当前系统到其他电脑  我们就从三个部分说起. Ubuntu 备份系统为ISO镜像 在Win ...

  8. 在.Net Core WebAPI下给Swagger增加导出离线文档功能

    一丶前言 最近刚接触到Swagger,在github上下载了它的源码和demo学习了一遍,发现这个组件非常好用,不过不足的是它没有导出离线文档的功能,于是乎我就想给它加一个导出功能 Swagger G ...

  9. 小程序-canvas在IOS手机层级最高无法展示问题

    要求的效果: 正面: 背面: 在开发者工具 利用css 和定位实现了一个版本 .topBox.on { transform:rotateY(180deg); } .topBox { position: ...

  10. SpringBoot热部署

    SpringBoot的热部署方式分为两种  1.SpringLoader 方式一:以maven插件方式使用SpringLoader <!-- Springloader插件 --> 1.1 ...