当前位置: 首页 > news >正文

【直击招聘C++】2.6 对象之间的复制

2.6 对象之间的复制

  • 一、要点归纳
    • 1. 对象之间的复制操作
      • 1.1 =运算符
      • 1.2 拷贝构造函数
    • 2. 对象之间的浅复制和深复制
      • 2.1 对象的浅复制
      • 2.2 对象的深复制
  • 二、面试真题解析
    • 面试题1
    • 面试题2

一、要点归纳

1. 对象之间的复制操作

  同一个类的对象之间可以进行复制操作,即将一个对象数据成员复制给另一个对象的相应的数据成员。

1.1 =运算符

  当已经定义了同一个类的多个对象时,可以在这些对象之间进行赋值运算,通常采用=运算符来实现,例如:

MyClass s1,s2;
s1=s2;

  上述对象复制语句的功能只是将s2的所有数据成员赋值给s1相应的数据成员。如果程序员在类中没有定义=运算符,编译器会相建立默认构造函数那样建立一个默认的=运算符。实际上,=运算符对应operator=成员函数,所谓定义=运算符就是重载operator=成员函数。

1.2 拷贝构造函数

  如果创建新对象并赋值,调用拷贝构造函数。在定义新对象并初始化时,形如A x=y的语句是通过调用拷贝构造函数创建对象x,通常将对象y的数据成员赋值给对象x相应的数据成员,例如有以下程序:

class A
{int m;public:A(){m = 0;std::cout << "默认构造函数" << std::endl;}~A(){std::cout << "析构函数" << std::endl;}A(int n){m = n;std::cout << "重载构造函数" << std::endl;}A(const A &b){std::cout << "拷贝构造函数" << std::endl;}A &operator=(const A &b){std::cout << "operator=" << std::endl;return *this;}
};void test01()
{A a(2), b(a), c;c = a;A d = a;
}

输出结果如下:

重载构造函数
拷贝构造函数
默认构造函数
operator=
拷贝构造函数
析构函数
析构函数
析构函数
析构函数

  建立A a(2)调用重载构造函数,执行b(a)调用拷贝构造函数,执行A c调用默认构造函数。执行c=a调用operator=成员函数,执行A d=a调用拷贝构造函数。依次销毁d\c\b\a调用析构函数。

2. 对象之间的浅复制和深复制

  无论是拷贝构造函数还是=运算符,都可春实现对象复制。对象复制又分为浅复制和深复制。

2.1 对象的浅复制

  当两个对象之间进行复制时,若复制完成后她们还共享某些资源(内存空间),其中一个对象的销毁会影响另一个对象,这种对象之间的复制称为浅复制。例如有以下程序:

class Student
{int no;char *pname;public:Student() {}            // 默认构造函数Student(int n, char *p) // 重载构造函数{no = n;pname = new char[10]; // 用new分配内存空间strcpy(pname, p);}Student(Student &s) // 拷贝构造函数{no = s.no;pname = s.pname;}void display(){std::cout << "no:" << no << ",name:" << pname << std::endl;std::cout << "pname:" << (int *)pname << std::endl; // 输出pname地址}
};
void test02()
{Student s(10, (char *)"Mary"), t(s);std::cout << "s:";s.display();std::cout << "t:";t.display();
}

输出如下:

s:no:10,name:Mary
pname:0x55d1366c22c0
t:no:10,name:Mary
pname:0x55d1366c22c0

在上述程序中先声明了一个类Student,其中有一个拷贝构造函数。在main函数中建立了一个对象s,通过拷贝构造函数由s建立t对象。由Student类的拷贝构造函数可以看到s到t的复制是浅复制,如下图所示,因为这两个对象的pname数据成员均指向相同的内存空间。

2.2 对象的深复制

  当两个对象之间进行复制时,若复制完成后她们不会共享任何资源(内存空间),其中一个对象的销毁不会影响到另一个对象,这种对象之间的复制称为深复制。例如将上述程序修改如下:

class Student
{int no;char *pname;public:Student() {}            // 默认构造函数Student(int n, char *p) // 重载构造函数{no = n;pname = new char[10]; // 用new分配内存空间strcpy(pname, p);}Student(Student &s) // 拷贝构造函数{no = s.no;// pname = s.pname;pname = new char[strlen(s.pname + 1)];strcpy(pname, s.pname);}void display(){std::cout << "no:" << no << ",name:" << pname << std::endl;std::cout << "pname:" << (int *)pname << std::endl; // 输出pname地址}~Student() { delete pname; } // 析构函数
};void test03()
{Student s(10, (char *)"Mary"), t(s);std::cout << "s:";s.display();std::cout << "t:";t.display();
}
s:no:10,name:Mary
pname:0x55acd2a8b2c0
t:no:10,name:Mary
pname:0x55acd2a8b2e0

修改后类Student的亏被构造函数在复制数据成员pname时另外开辟内存空间,从而当执行Student s(10, (char *)“Mary”), t(s);的时候由对象s复制产生对象t时,这两队对象的pname成员分别指向不同的内存单元,如图?

二、面试真题解析

面试题1

【面试题】什么时候必须重写拷贝构造函数?
【答】当构造函数涉及动态存储分配空间时要自己写拷贝构造函数,并且要深复制。

面试题2

【面试题】不考虑任何编译器优化,下面代码的第8行会发生(一次拷贝构造、一次析构函数、一次operator=)

#include <iostream>
class B
{
};
B func(const B & rhs)
{return rhs;
}
void main()
{B b1,b2;b2=func(b1);
}

【答】首先调用一次拷贝构造函数将b1复制给形参rhs,返回rhs并赋值给b2调用一次operator=,func函数执行完毕销毁rhs调用一次析构函数。

相关文章:

【直击招聘C++】2.6 对象之间的复制

2.6 对象之间的复制一、要点归纳1. 对象之间的复制操作1.1 运算符1.2 拷贝构造函数2. 对象之间的浅复制和深复制2.1 对象的浅复制2.2 对象的深复制二、面试真题解析面试题1面试题2一、要点归纳 1. 对象之间的复制操作 同一个类的对象之间可以进行复制操作&#xff0c;即将一个…...

学了这么久python,不会连自己啥python版本都不知道吧?

人生苦短&#xff0c;我用Python 源码资料电子书:点击此处跳转文末名片获取 查看 Python 版本 我们可以在命令窗口(Windows 使用 winR 调出 cmd 运行框)使用以下命令查看我们使用的 Python 版本&#xff1a; python -V 或 python --version 以上命令执行结果如下&#xff1a; …...

Revive:从间谍软件进化成银行木马

2022 年 6 月&#xff0c;Cleafy 研究人员发现了一个新的安卓银行木马 Revive。之所以选择 Revive 这个名称&#xff0c;是因为恶意软件为防止停止工作启用的一项功能名为 revive。 Revive 属于持续潜伏的那一类恶意软件&#xff0c;因为它是为特定目标开发和定制的。这种类型…...

Python 之 NumPy 简介和创建数组

文章目录一、NumPy 简介1. 为什么要使用 NumPy2. NumPy 数据类型3. NumPy 数组属性4. NumPy 的 ndarray 对象二、numpy.array() 创建数组1. 基础理论2. 基础操作演示3. numpy.array() 参数详解三、numpy.arange() 生成区间数组四、numpy.linspace() 创建等差数列五、numpy.logs…...

与六年测试工程师促膝长谈,他分享的这些让我对软件测试工作有了全新的认知~

不知不觉已经从事软件测试六年了&#xff0c;2016年毕业到进入外包公司外包给微软做软件测试&#xff0c; 到现在加入著名的外企。六年的时间过得真快。长期的测试工作也让我对软件测试有了比较深入的认识。但是我至今还是一个底层的测试人员&#xff0c;我的看法都比较狭隘&am…...

裕太微在科创板上市:市值约186亿元,哈勃科技和小米基金为股东

2月10日&#xff0c;裕太微电子股份有限公司&#xff08;下称“裕太微”&#xff0c;SH:688515&#xff09;在上海证券交易所上市。本次上市&#xff0c;裕太微的发行价为92元/股&#xff0c;发行2000万股&#xff0c;发行市盈率不适用&#xff0c;发行后总股本8000万股。 根据…...

毕业后5年,我终于变成了月薪13000的软件测试工程师

我用了近2个月的时间转行&#xff0c;在今年1月底顺利入职了一家北京的互联网公司&#xff0c;从事的是软件测试的工作。 和大家看到的一样&#xff0c;我求职的时间花费的比较短&#xff0c;求职过程非常顺利&#xff0c;面试了一周就拿到了3家offer&#xff0c;3家offer的薪…...

实践指南|如何在 Jina 中使用 OpenTelemetry 进行应用程序的监控和跟踪

随着软件和云技术的普及&#xff0c;越来越多的企业开始采用微服务架构、容器化、多云部署和持续部署模式&#xff0c;这增加了因系统失败而给运维/ SRE / DevOps 团队带来的压力&#xff0c;从而增加了开发团队和他们之间的摩擦&#xff0c;因为开发团队总是想尽快部署新功能&…...

MySQL 创建数据表

在创建数据库之后&#xff0c;接下来就要在数据库中创建数据表。所谓创建数据表&#xff0c;指的是在已经创建的数据库中建立新表。 创建数据表的过程是规定数据列的属性的过程&#xff0c;同时也是实施数据完整性&#xff08;包括实体完整性、引用完整性和域完整性&#xff09…...

一文详解网络安全事件的防护与响应

网络安全事件的发生&#xff0c;往往意味着一家企业的生产经营活动受到影响&#xff0c;甚至数据资产遭到泄露。日益复杂的威胁形势使现代企业面临更大的网络安全风险。因此&#xff0c;企业必须提前准备好响应网络安全事件的措施&#xff0c;并制定流程清晰、目标明确的事件响…...

vue directive 注册局部指令

注册局部指令 vue directive 在注册局部指令时&#xff0c;是通过在组件 options 选项中设置 directives 属性。如下&#xff1a; directives: {focus: {// 指令的定义inserted: function (el) {el.focus()}} }在模板中的任何元素上都可以使用新的 v-focus property&#xff…...

LC-70-爬楼梯

原题链接&#xff1a;爬楼梯 个人解法 思路&#xff1a; 动态规划 状态表示&#xff1a;f[i]表示走到第n阶台阶有几种方法 状态转移&#xff1a;f[i] f[i -1] f[i - 2] 这实际上就是斐波那契数列&#xff0c;通过转移可以看到&#xff0c;我们只用了三个变量&#xff0c;故…...

Scratch少儿编程案例-可爱的简约贪吃蛇

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

编译 Android 时如何指定输出目录?

文章目录0. 导读1. 指定 Android 编译输出目录2. 指定 Android dist 编译输出目录3. 指定 Android 模块编译输出目录4. Android 源码中编译相关的文档0. 导读 偶尔会有朋友问编译 Android 时如何指定输出目录? 这里有两种情况&#xff1a; 一是如何将 Android 默认的输出目…...

CF1574C Slay the Dragon 题解

CF1574C Slay the Dragon 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示代码实现题目 链接 https://www.luogu.com.cn/problem/CF1574C 字面描述 题面翻译 给定长度为 nnn 的序列 aaa&#xff0c;mmm 次询问&#xff0c;每次询…...

创建Django项目

创建Django项目 步骤 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中&#xff0c;项目工程目录可以借助django提供…...

CUDA中的统一内存

文章目录1. Unified Memory Introduction1.1. System Requirements1.2. Simplifying GPU Programming1.3. Data Migration and Coherency1.4. GPU Memory Oversubscription1.5. Multi-GPU1.6. System Allocator1.7. Hardware Coherency1.8. Access Counters2. Programming Mode…...

利用机器学习(mediapipe)进行人脸468点的3D坐标检测--视频实时检测

上期文章,我们分享了人脸468点的3D坐标检测的图片检测代码实现过程,我们我们介绍一下如何在实时视频中,进行人脸468点的坐标检测。 import cv2 import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_face_mesh = mp.solutions.face_mesh face_mesh = mp_fac…...

事务基础知识与执行计划

事务基础知识 数据库事务的概念 数据库事务是什么&#xff1f; 事务是一组原子性的SQL操作。事务由事务开始与事务结束之间执行的全部数据库操作组成。A&#xff08;原子性&#xff09;、&#xff08;C一致性&#xff09;、I&#xff08;隔离性&#xff09;、D&#xff08;持久…...

数据库实践LAB大纲 06 INDEX

索引 索引是一个列表 —— 若干列集合和这些值的记录在数据表存储位置的物理地址 作用 加快检索速度唯一性索引 —— 保障数据唯一性加速表的连接分组和排序进行检索的时候 —— 减少时间消耗 一般建立原则 经常查询的数据主键外键连接字段排序字段少涉及、重复值多的字段…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...