拷贝构造函数调用总结

2023-11-18

拷贝构造函数主要在以下三种情况下起初始化作用:

1. 在声明语句中用一个对象初始化另一个对象;

2. 将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本;

3. 生成一个临时对象作为函数的返回结果。

那么接着就看一下在这三种情况下拷贝构造函数分别在什么时候调用,以及如果有临时对象的话,在什么时候析构。先假定有一个类FOO,在构造函数中会输出“Constructing.”,在拷贝构造函数中会输出“Copy constructing.”,在析构函数中会输出“Destructing.”。输出结果中的注释是说明之用。

在声明语句中用一个对象初始化另一个对象

在声明语句中用一个对象初始化另一个对象时,不存在临时对象的问题,新的对象直接调用拷贝构造函数,进行对象的初始化,也没有什么调用顺序的问题了,例如:

  • FOO obj1;
  • FOO obj2=obj1;

如果类FOO有拷贝构造函数,那么在定义时就会调用拷贝构造函数,在对象的生存周期结束时,调用对象的析构函数。上面这段程序的输出结果就是:

  • Constructing.    // constructing obj1
  • Copy constructing.    // constructing obj2
  • Destructing.    // destructing obj2
  • Destructing.    // destructing obj2

将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本

将对象按值调用作为函数的参数时,在函数的开始将生成一个临时对象,如果对象有拷贝构造函数,就使用拷贝构造函数对临时对象进行初始化,然后在函数结事调用临时对象的析构函数,例如:

  • void get_object(pobj) {
  •     FOO obj;
  •     return;
  • }

在上面这段代码中,先执行的是参数pobj的初始化,然后再进行局部对象变量obj的初始化。以上代码输出结果如下:

  • Copy constructing.    // copy constructing pobj
  • Constructing.    // constructing obj
  • Destructing.    // destructing obj
  • Destructing.    // destructing pobj

生成一个临时对象作为函数的返回结果

生成一个临时对象作为函数的返回结果时,如果返回结果有拷贝构造函数就会调用返回结果的拷贝构造函数进行初始化,而且是在return语句执行时进行,并且在return完成时调用析构函数,例如:

  • FOO get_object() {
  •     FOO obj;
  •     return obj;
  • }
  • FOO myobj;
  • myobj=get_object();

在函数get_object()内部,先进行obj的初始化,在执行到return语句时,创建一个临时对象,调用拷贝构造函数用obj作为参数对临时对象进行初始化,而之后则是先进行函数内部对象变量的析构,再进行临时变量的析构,因为临时变量要在函数外部对可能接收返回值的变量进行赋值。以上代码的输出结果如下:

  • Constructing.    // constructing myobj
  • Constructing.    // constructing obj
  • Copy constructing.    // copy constructing temp obj
  • Destructing.    // destructing obj
  • Destructing.    // destructing temp obj
  • Destructing.    // destructing myobj

就这样,在VC调试了3个例子就可以差不多弄清拷贝构造函数的调用时间了。

转载于:https://www.cnblogs.com/howareyou586/archive/2008/11/21/1338273.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拷贝构造函数调用总结 的相关文章

  • vue猜数字游戏

    div p msg p div
  • node.js JSON对象和string的相互转化

    JSON stringify obj 将JSON转为字符串 var json aa sdddssd bb 892394829342394792399 23894723984729374932874 cc 11111111111111 gt
  • html5期末知识点归纳总结,web期末考试知识点

    题型及知识点 一 知识点 上课内容全覆盖 除补充的html5和css3的内容 常用的html标记及属性 弄清楚哪些是块元素 哪些是行内元素 特殊字符标记 p40 Css属性 i 字体 font size font family font w
  • 蓝桥杯JAVA B组 2020(1)第五题 排序

    一 题目描述 小蓝最近学习了一些排序算法 其中冒泡排序让他印象深刻 在冒泡排序中 每次只能交换相邻的两个元素 小蓝发现 如果对一个字符串中的字符排序 只允许交换相邻的两个字符 则在所有可能的排序方案中 冒泡排序的总交换次数是最少的 例如 对
  • SQLCipher核心思想

    加密原理 page data iv hmac iv是一段随机数 可以保证每一页的iv值都不一样 和page data一起作用 用于生成hmac值 sizeof page data p
  • kubeasz 二进制安装k8s高可用集群

    一 kubeasz介绍 项目致力于提供快速部署高可用k8s集群的工具 同时也努力成为k8s实践 使用的参考书 基于二进制方式部署和利用ansible playbook实现自动化 既提供一键安装脚本 也可以根据安装指南分步执行安装各个组件 二
  • Maven2部署构件到Nexus时出现的Failed to transfer file错误

    原文出处 http www javatang com archives 2010 01 23 4518375 html 作者 Jet Mah from Java堂 声明 可以非商业性任意转载 转载时请务必以超链接形式标明文章原始出处 作者信
  • jni基础

    JNI相关 静态注册 java代码需要和C 代码相符通讯就需要通过JNI来进行注册 java public native String stringFromJNI 代表该函数的实现在so so Java com first firstndk
  • 内存管理方案

    内存管理方案 Memory Management System Author Owen 目 录 内存管理方案 1 目 录 1 1 概述 2 2 理论依据 2 2 1 不对内存进行管理 2 2 2 对内存进行内部管理 2 3 实现方案 2 3
  • RMI-Remote Method Invocation远程方法调用的使用

    手动启动服务方式 参考自 https www cnblogs com fanghao p 8918953 html 接口 import java rmi Remote import java rmi RemoteException publ
  • selenium二次封装

    使用到相关技术 selenium testng log4j maven selenium主要生成driver 获取页面元素等 testng主要Run程序 生成测试报告 管理用例执行顺序 断言等 log4j主要用来打印log日志 maven主
  • RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment

    解决方案 输入指令sudo shutdown r now即可重新启动驱动 如果还是无法解决则需要重新安装驱动
  • 【系统】C/C++内存管理之内存分配

    文章目录 0 内存分配方式 从静态存储区域分配 在栈上创建 在堆上分配 程序内存空间 1 C语言内存分配方式 静态与动态内存分配区别 1 1 静态分配方式 1 2 动态分配方式 1 malloc函数 2 calloc 函数 3 reallo
  • java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'content' at row 1

    使用Mysql服务器的utf8字符编码 在存入移动端emoji表情时会报异常 Caused by java sql SQLException Incorrect string value xF0 x9F x98 x84 for column
  • 深度学习:实现mnist手写数字识别

    本文为 365天深度学习训练营 中的学习记录博客 原作者 K同学啊 接辅导 项目定制 我的环境 1 语言环境 Python 3 7 2 编译器 Pycharm 3 深度学习环境 TensorFlow2 5 一 前期工作 1 设置GPU 若使
  • Ubuntu20.04开机后,弹出检测到系统程序出现问题解决方法

    打开配置文件 sudo gedit etc default apport 然后 将其中的enable选项改成0 即可解决此问题
  • C++ *,&

    文章目录 语法 1 取地址运算符 2 间接寻址运算符 示例 1 可以累计使用间接寻址运算符来取消引用指向指针的指针 2 静态成员的地址 3 引用类型的地址 4 函数地址作为参数 4 示例 references 语法 1 取地址运算符 又称
  • c#量化交易_我用1天时间搭建自主量化交易(程序化交易)平台

    VirtualApi目前支持上海期货交易所的CTP回测 http www virtualapi cn 实盘期货 支持CTP http www kaihucn cn Simnow 上期CTP接口官方网站和模拟账户注册 http www sim
  • 【KITTI】KITTI数据集简介(一) — 激光雷达数据

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 KITTI数据集的详
  • C++基础——new和delete动态开辟

    目录 前言 一 new关键字 格式2 动态开辟多个数据的堆区空间 数组 总结 二 自定义类型的开辟 1 区别 2 匹配错误讲解 错误示范例1 delete 的执行原理 错误示范2 三 malloc new失败的区别 1 malloc失败 2

随机推荐

  • 如何在WPS、MathType中输入傅立叶变换的符号

    这里写自定义目录标题 在MathType中 先输入大写F 选择上 然后在 mathtype 的 style Other 选择 Palace Script MT字体 如果没有该字体 选择Lucida Calligraphy字体 如果使用的是E
  • 设计模式-装饰模式

    装饰模式指的是在不必改变原类文件和使用继承的情况下 动态地扩展一个对象的功能 它是通过创建一个包装对象 也就是装饰来包裹真实的对象 在装饰模式中的各个角色有 抽象构件 Component 角色 给出一个抽象接口 以规范准备接收附加责任的对象
  • 启明智显分享

    据数据显示 全球新能源汽车销量正大幅度增长 全球汽车电动化渗透率也由0 8 增长到7 74 这不仅意味着汽车产业电动化浪潮的来临 也证实了我国新能源汽车行业正处于高速发展状态 随着电动汽车销售量与保有量的迅速增长 充电需求也持续攀升 在新基
  • php连接mysql代码

    php连接mysql的代码网上有很多 这里分享一个简单配置就能用的代码模板仅供参考
  • Ubuntu18中NVIDIA,cuda,cudnn,pytorch安装

    注意 nvidia驱动和cuda cudnn pytroch python的对应关系 linux安装pytorch 包括cuda与cudnn linux清华园按照pytorch1 12 BryceRui的博客 CSDN博客 安装流程 安装c
  • R手册(Visualise)--gganimate(ggplot2 extensions)

    文章目录 gganimate Create easy animations with ggplot2 返回ggplot2扩展主目录 gganimate Create easy animations with ggplot2 GitHub链接
  • SpringCloudAlibaba集成Sentinel

    什么是 Sentinel 随着微服务的流行 服务和服务之间的稳定性变得越来越重要 Sentinel 以流量为切入点 从流量控制 熔断降级 系统负载保护等多个维度保护服务的稳定性 Sentinel 的特征 丰富的应用场景 Sentinel 承
  • 游戏服务器稳定ping值,网友玩游戏时Ping值超过了2亿!

    经常玩网络游戏的朋友肯定都经历过延迟 太高的Ping值会使游戏体验惨不忍睹 但你见过超过2亿的Ping吗 这里简单介绍一下Ping 它是玩家客户端和游戏服务器之间的网络延迟 一般以毫秒 ms 作为单位 Ping越低 延迟越低 严重的延迟通常
  • 微信小程序项目使用npm安装vant-weapp的正确步骤及错误处理方法

    微信小程序项目使用npm安装vant weapp的正确步骤及错误处理方法 1 搭建小程序 1 1 项目 新建项目 如下图所示 1 2点击图中 新建 即可创建成功小程序项目 2 安装vant weapp库 2 0 在安装vant weapp之
  • ORA-01950: 对表空间 ‘SYSTEM‘ 无权限

    对表空间 SYSTEM 无权限 问题 对表空间 SYSTEM 无权限 处理 alter user test 用户名 quota unlimited on users 问题 对表空间 SYSTEM 无权限 出现ORA 01950 对表空间 S
  • QML-消息提示框

    QML 消息提示框 前言 一 提示框 二 警告提示框 三 错误提示框 四 属性介绍 前言 介绍常用的消息提示框 包括提示 错误 报警等 一 提示框 import QtQuick 2 12 import QtQuick Window 2 12
  • Qt creator出现mainwindow.ui does not exist,导致无法编译通过

    遇到这个问题 首先是之前做过删除ui mainwindow h的操作步骤 导致出现这样的问题 参考博客 https blog csdn net mhw828 article details 104143881 解决的方法就如这位博主说的 需
  • redis集群模式

    redis单机版 出现单机故障后 导致redis无法使用 如果程序使用redis 间接导致程序出错 redis的集群模式 主从复制模式 哨兵模式 集群化模式 1 主从复制模式 一主多从模式 一个主节点 多个从节点 那么主节点可以负责 读操作
  • MySQL拾遗之数据类型的默认值-default

    MySQL 中 所有的数据类型 都可以显式或隐式的拥有默认值 我们可以使用 DEFAULT 约束显式的为列指定一个默认值 比如 CREATE TABLE t1 i INT DEFAULT 1 c VARCHAR 10 DEFAULT pri
  • 正则,JS:this,同步异步,原型链笔记整理

    一 正则表达式 正则表达式 regular expression 是一种表达文本模式 即字符串结构 的方法 有点像字符串的模板 常常用来按照 给定模式 匹配文本 正则表达式可以用于以下常见操作 匹配 判断一个字符串是否符合某个模式 搜索 在
  • DCA和DTS关系

    On the consumer level DTS is the oft used shorthand for the DTS Coherent Acoustics DCA codec transportable through S PDI
  • 深信服C++开发岗笔试记录

    如果大家也在找面试笔试题目内容 可以看我的总结文章 正在更新之中 有没涉及到的内容 欢迎大家指出 附链接 数据库 C C HTML OS 计网面试准备 更新中 笔试共有三部分 不定项选择 8道 填空 7道 编程 3道 选择和填空的部分内容涉
  • Mybatis left join 一对多及多对多查询配置

    一对一查询配置
  • 90-50-010-源码-hbase的rowkey设计

    1 视界 1 rowKey编码概述 注 Kylin源码分析系列基于Kylin的2 6 0版本的源码 其他版本可以类比 2 相关概念 前面介绍了Kylin中Cube构建的流程 但Cube数据具体是以什么样的形式存在 可能还不是特别清晰明了 这
  • 拷贝构造函数调用总结

    拷贝构造函数主要在以下三种情况下起初始化作用 1 在声明语句中用一个对象初始化另一个对象 2 将一个对象作为参数按值调用方式传递给另一个对象时生成对象副本 3 生成一个临时对象作为函数的返回结果 那么接着就看一下在这三种情况下拷贝构造函数分