c++之浅拷贝和深拷贝

目录

一、浅拷贝:浅拷贝就是对象的数据成员之间的简单赋值

二、深拷贝:源对象与拷贝对象互相独立

三、总结:

1、什么时候必须定义自己的拷贝构造函数呢?

2、出现段错误的原因:

3、浅拷贝和深拷贝的写法

 注意浅拷贝的构造函数

深拷贝的构造函数


一、浅拷贝:浅拷贝就是对象的数据成员之间的简单赋值

形象举例:浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同)。对其中任何一个对象的改动都会影响另外一个对象。举个例子,一个人一开始叫张三,后来改名叫李四了,可是还是同一个人,不管是张三缺胳膊少腿还是李四缺胳膊少腿,都是这个人倒霉。

#include<iostream>
#include<string>
using namespace std;class Student
{
public:/*****************构造函数*********************/Student( string _name, int _age, int _id){string name = _name;int age = _age;int id = _id;cout << name << "今年" << age << "岁了,他的学号是" << id << ",他正在学习" << endl;}/*****************析构函数*********************/~Student(){cout << "析构函数" << endl;}/*****************浅拷贝函数*********************///浅拷贝函数默认是有的,如果想要打印出来浅拷贝,就必须写出来,否则不会打印到终端Student(const Student &s1) {cout << "浅拷贝构造"<<endl;}private:string name[3];int age;int id;
};int main()
{//实例化s1Student s1("jhu", 18, 608);//实例化s2,将s1赋值给s2Student s2(s1);return 0;
}

 由上面的式子可知:

  • 浅拷贝和构造函数互为重载;
  • 浅拷贝默认存在。如果需要打印出拷贝的值,就必须把浅拷贝函数写出来

二、深拷贝:源对象与拷贝对象互相独立

形象举例:一个人名叫张三,后来用他克隆(假设法律允许)了另外一个人,叫李四,不管是张三缺胳膊少腿还是李四缺胳膊少腿都不会影响另外一个人

#include<iostream>
using namespace std;class Demo
{
public:
/****************构造函数****************/Demo(int _num = 0){num = _num;if (0 == num){p = NULL;}else if (num > 0){p = new int[num]();//申请空间,并且都清0}cout << "构造函数" << endl;}
/****************拷贝构造函数--深拷贝****************/Demo(const Demo &demo){this->num = demo.num;this->p = new int[this->num]();//申请空间memcpy(this->p, demo.p, sizeof(int) * num);cout << "拷贝构造函数" << endl;}
/****************输入函数****************/	void input(){if (0 == num){cout << "无值" << endl;}else{int i;for (i = 0; i < num; i++){cin >> p[i];}cout << endl;}}
/****************显示到终端****************/void show(){if (0 == num){cout << "无值" << endl;}else{int i;for (i = 0; i < num; i++){cout << p[i] << "";}cout << endl;}}
/****************析构函数****************/~Demo(){cout << "析构开始" << endl;if (p != NULL){delete[]p;p = NULL;}cout << "析构结束" << endl;}
private:int num;int* p;
};int main()
{Demo demo1(3);demo1.show();demo1.input();demo1.show();cout << "******************************" << endl;Demo demo2 = demo1;//等价于Demo demo2(demo1)demo2.show();return 0;
}

三、总结:

1、什么时候必须定义自己的拷贝构造函数呢?

当系统提供的不能满足我们的要求,在空间开辟时就需要用new来开辟

2、出现段错误的原因:

  • 操作NULL;
  • 野指针;
  • 数组越界;
  • free了又free

3、浅拷贝和深拷贝的写法

 注意浅拷贝的构造函数

    Student(const Student &s1) 
    {
        cout << "浅拷贝构造"<<endl;
    }

深拷贝的构造函数

    Demo(const Demo &demo)
    {
        this->num = demo.num;
        this->p = new int[this->num]();//申请空间
        memcpy(this->p, demo.p, sizeof(int) * num);
        cout << "拷贝构造函数" << endl;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

59.仿简道云公式函数实战-文本函数-RMBCAP

1. RMBCAP函数 RMBCAP 函数可以将金额小写转换为人民币大写金额形式。 2. 函数用法 RMBCAP(数字) 3. 函数示例 如&#xff0c;在财务结算、报销管理、对公付款等场景中&#xff0c;可以利用 RMBCAP 函数将金额转换为大写&#xff0c;避免被篡改产生的负面影响 4. 代码实战…

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…

Java实战:Spring Boot集成AMQP协议的RabbitMQ实现消息队列

随着微服务架构在现代软件开发中的广泛应用&#xff0c;异步处理和解耦通信成为了提升系统性能与稳定性的关键。作为AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的优秀实现&#xff0c;RabbitMQ以其高性能、易用性以及丰富的功能赢得了开发者们的青睐。…

SpringBoot之自定义注解及Java反射机制实现对实体类某些字段记录日志的功能

SpringBoot之自定义注解及Java反射机制实现对实体类某些字段记录日志的功能 文章目录 SpringBoot之自定义注解及Java反射机制实现对实体类某些字段记录日志的功能1. 使用场景2. 实现思路3. 具体实现1. 定义注解类2. 日志实体类3. 反射操作工具类4. 定义记录日志的工具类5. 业务…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

前端架构: 脚手架之包管理工具的案例对比及workspaces特性的使用与发布过程

npm的workspaces 特性 1 &#xff09;使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理&#xff0c;它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去&#xff0c;每一个包都有package.json它里面有很多项目&#xff0c;再没有 Lerna 之前去维护和…

【大数据】Flink SQL 语法篇(七):Lookup Join、Array Expansion、Table Function

《Flink SQL 语法篇》系列&#xff0c;共包含以下 10 篇文章&#xff1a; Flink SQL 语法篇&#xff08;一&#xff09;&#xff1a;CREATEFlink SQL 语法篇&#xff08;二&#xff09;&#xff1a;WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇&#xff08;三&…

SpringCloudNacos注册中心服务分级存储模型

文章目录 服务分级存储模型概述配置集群同集群优先的负载均衡 权重配置总结 之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践. 服务分级存储模型概述 一个服务可以有多个实例&#xff0c;例如我们的 user-server&#xff0c;可以有:…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

老卫带你学---leetcode刷题(202. 快乐数)

202. 快乐数 问题 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1&#xff0c;那么这个数就是快乐数。…

VR全景HDR拍摄教程

什么是HDR&#xff1f; HDR可以用在哪里&#xff1f; 书面解释&#xff1a;HDR&#xff08;高动态范围 High Dynamic Range&#xff09;摄影&#xff0c;是摄影领域广泛使用的一种技术。 是不是有点懵&#xff1f; 我们来看一个实际的拍摄现场环境&#xff0c;你就懂了 我们…

使用 Gradle 版本目录进行依赖管理 - Android

/ 前言 / 在软件开发中&#xff0c;依赖管理是一个至关重要的方面。合理的依赖版本控制有助于确保项目的稳定性、安全性和可维护性。 Gradle版本目录&#xff08;Version Catalogs&#xff09;是 Gradle 构建工具的一个强大功能&#xff0c;它为项目提供了一种集中管理依赖…

定时任务框架

定时任务的框架有哪些 ● Timer&#xff0c;JDK自带的&#xff0c;比较简单&#xff0c;使用的时候&#xff0c;定义一个TimerTask&#xff0c;实现run方法&#xff0c;然后定义一个Timer类&#xff0c;调用timer.schedule(timerTask,1000,3000); ○ 缺点&#xff1a;单线程、…

附加Numpy数组

参考&#xff1a;Append Numpy Array 引言 在数据科学和机器学习领域&#xff0c;处理大规模数据集是一项重要且常见的任务。为了高效地处理数据&#xff0c;numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作&#xff0c;即如何附加&#xff08;append&a…

LeetCode:2867. 统计树中的合法路径数目(筛质数+ DFS Java)

目录 2867. 统计树中的合法路径数目 题目描述&#xff1a; 实现代码与思路&#xff1a; 筛质数 DFS 原理思路&#xff1a; 2867. 统计树中的合法路径数目 题目描述&#xff1a; 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 …

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

linux使用scp命令来在两台Linux设备之间传输文件

1、linux怎么将一个文件发送到另一个linux设备特定目录下 可以使用scp命令&#xff08;secure copy&#xff09;来将文件从一个Linux设备复制到另一个Linux设备的特定目录下。假设你要将本地文件localfile.txt发送到远程设备的/remote/directory目录下&#xff0c;你可以使用以…

Oracle修改用户密码之后连接特别慢的问题

一、问题现象 oracle数据库密码修改后连接速度特别慢&#xff0c;甚至出现超时的问题&#xff0c;查询表也特别慢 更改密码后&#xff0c;每次连接异常慢&#xff0c;就算用正确的密码连接&#xff0c;验证延时也非常大&#xff0c;导致应用程序连接反复出现超时现象&#xf…

Jquery操作DOM对象

文章目录 目录 文章目录 本章目标 一.DOM操作分类 二.JQuery中的DOM操作 内容操作 属性值操作 节点操作 节点属性操作 节点遍历 总结 本章目标 使用Jquery操作网页元素使用JQuery操作文本与属性值内容使用JQuery操作DOM节点使用Jquery遍历DOM节点使用JQuery操作CSS-DOM 一…

Groovy(第八节) Groovy 之类

目录 Song 类 Groovy 类就是 Java 类 类的关系 类初始化 核心的灵活性