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

C++,对象赋值与对象拷贝的区别、深浅拷贝

在C++中,对象赋值和对象拷贝是两个不同的操作,它们有明显的区别:

1. 对象赋值(Object Assignment):

   - 对象赋值是指将一个已经存在的对象的值复制给另一个已经存在的对象。这通常通过赋值操作符(`=`)来实现。

   - 对象赋值会修改已有的对象,将一个对象的值覆盖到另一个对象上。赋值操作会改变被赋值对象的内容,但不会创建新的对象。

     MyClass obj1;MyClass obj2;obj2 = obj1; // 对象赋值,将 obj1 的值复制给 obj2

 

 

2. 对象拷贝(Object Copying):

      拷贝构造方法的声明: 类名(const 类名& obj)

   - 对象拷贝是指在创建一个新对象时,通过将一个已有对象的值复制到新对象来初始化它。这通常发生在对象的构造函数中,或者使用拷贝构造函数。

   - 对象拷贝会创建一个全新的对象,该对象与原始对象相互独立,它们具有相同的值但位于不同的内存空间。

   - 例如,使用拷贝构造函数进行对象拷贝(浅拷贝):

     MyClass obj1;MyClass obj2(obj1); // 对象拷贝,创建一个新对象 obj2,其值与 obj1 相同但是独立的
//头文件.h
class Stu
{
public://成员变量int age = 23;string name = "ssss";Stu();Stu(const Stu& obj);
};
Stu::Stu(){}
//定义文件.cpp
Stu::Stu(const Stu& obj)
{this->age = obj.age;this->name = obj.name;
}//main.cppStu stu;stu.age = 10;stu.name = "xiao wang";Stu stu2(stu);//触发复制构造方法,等效于Stu stu2 = stu; 

总结来说,对象赋值和对象拷贝都涉及将一个对象的值复制给另一个对象,但它们的关键区别在于:
- 对象赋值用于已存在的对象,它不会创建新的对象,而是修改现有对象的值。
- 对象拷贝用于创建一个全新的对象,它会创建一个新的对象并将值从一个对象复制到另一个对象,这两个对象是相互独立的。对象拷贝通常在对象的构造过程中发生。

浅拷贝:

深拷贝:

//stu.h
#ifndef STU_H_
#define STU_H_
#include <iostream>
using namespace std;
class Stu
{
public://成员变量int age;string name;int *p;Stu();Stu(const Stu& obj);
};
#endif /* STU_H_ *///stu.cpp
#include "stu.h"
#include<iostream>
#include <stdlib.h>
Stu::Stu() {cout<<"Stu::Stu()..."<<endl;
}
Stu::Stu(const Stu& obj)
{cout<<"Stu::Stu(const Stu& obj)"<<endl;this->age = obj.age;this->name = obj.name;this->p = (int *)malloc(sizeof(int));
}//main.cpp
#include <iostream>
using namespace std;
#include "stu.h"
#include<stdio.h>
int main(void)
{Stu stu;stu.age = 10;stu.name = "xiao wang";stu.p = (int *)malloc(sizeof(int));Stu stu2(stu);cout<<stu.p<<endl<<stu2.p<<endl;// 两个指针的值是不一样的。//....free(stu.p);free(stu2.p);stu.p = NULL;stu2.p = NULL;return 0;
}

注意:

        在类的浅拷贝中,只有指针成员的内存地址会与原始对象一致,其他非指针类型的成员的内存地址通常不会一致。浅拷贝是指在拷贝对象时,只复制对象的各个成员的值,而不会复制指向动态分配内存的指针的内容。这意味着新对象中的指针成员将指向与原始对象中相同的内存地址,但其他成员将拥有自己独立的内存空间。

相关文章:

C++,对象赋值与对象拷贝的区别、深浅拷贝

在C中&#xff0c;对象赋值和对象拷贝是两个不同的操作&#xff0c;它们有明显的区别&#xff1a; 1. 对象赋值&#xff08;Object Assignment&#xff09;&#xff1a; - 对象赋值是指将一个已经存在的对象的值复制给另一个已经存在的对象。这通常通过赋值操作符&#xff08;…...

MATLAB实现相关性分析

目录 一.基本理论 二.两类相关系数的对比 三.相关系数的假设检验 四.MATLAB的相关操作 五.其他有关的一些列技巧 六.案例展示 七.实战操作 一.基本理论 所谓相关系数&#xff0c;本质上是来衡量两组数据的关系大小——对应呈现函数关心的两种变量&#xff0c;那么我们可以…...

MySQL索引看这篇就够了

能简单说一下索引的分类吗&#xff1f; 例如从基本使用使用的角度来讲&#xff1a; 主键索引: InnoDB 主键是默认的索引&#xff0c;数据列不允许重复&#xff0c;不允许为 NULL&#xff0c;一个表只能有一个主键。唯一索引: 数据列不允许重复&#xff0c;允许为 NULL 值&…...

无法从 /var/lib/rpm 打开软件包数据库

使用yum命令安装软件包时&#xff0c;报错“无法从 /var/lib/rpm 打开软件包数据库” 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.原因 是误操作导致 rpm 数据库损坏。&#xff08;/var/lib/rpm 目录下的文件被损坏&#xff09; 2.解决 当RPM 数据库发生损坏&a…...

路由器实现 IP 子网之间的通信

目录 路由器配置静态或默认路由实现 IP 子网之间的通信 地址聚合与最长前缀匹配路由配置 路由器配置静态或默认路由实现 IP 子网之间的通信 按如下拓扑图配置 其中&#xff0c;路由器加入4GEW-T PC配置如下 LSW1的配置 <Huawei>sys Enter system view, return user…...

解决kali beef启动失败问题及实战

文章目录 一、解决方法二、靶场实战应用1.首先打开dvwa这个靶场&#xff0c;设置难度为low2.打开xss-stored3.准备payload4.提交payload5.利用 一、解决方法 首先需卸载 ruby apt remove ruby 卸载 beef apt remove beef-xss 重新安装ruby apt-get install ruby apt-get insta…...

【NetEq】NackTracker 走读

重传列表的最大限制是500个包,大约10秒钟 // A limit for the size of the NACK list.static const size_t kNackListSizeLimit = 500; // 10 seconds for 20 ms frame// packets.允许设置一个小于max_nack_list_size的值 // Set a maximum for the size of the NACK list. I…...

条例18~23(设计与声明)

目录 条例18 让接口被正确使用&#xff0c;不易被误用 总结 条例19 设计class犹如设计type 条例20 宁以const的引用传参替代传值传参 总结 条例21 必须返回对象时&#xff0c;别妄想返回他的引用 总结 条例22 将成员变量声明为private 总结 条例23 宁以非友元非…...

STM32 UART通信协议 基础知识

通用异步收发器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART&#xff0c;是一种串行、异步、全双工的通信协议。 在通信领域中&#xff0c;有两种数据通信方式&#xff1a;并行通信和串行通信。串口的数据传输是以串行方式进行的。串口在…...

nginx部署vue前端项目,访问报错500 Internal Server Error

前言 描述&#xff1a;当我配置好全部之后&#xff0c;通过 服务器 ip 地址访问&#xff0c;遇到报错信息&#xff1a;500 Internal Server Error。 情况说明 前提&#xff1a;我是通过Docker启动nginx容器&#xff0c;通过-v 绑定数据卷&#xff0c;将html文件和nginx.conf…...

@Excel注解

在 Java 开发中&#xff0c;Excel 注解通常用于标记实体类的字段&#xff0c;以指示与 Excel 文件的导入和导出相关的配置信息。 Excel 注解通常是自定义的注解&#xff0c;它可以包含多个属性&#xff0c;用于定义与 Excel 相关的配置&#xff0c;如字段的标题、顺序、数据格…...

解释器模式简介

概念&#xff1a; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于定义语言的文法&#xff0c;并解析和执行给定语言中的表达式。该模式将每个表达式表示为一个类&#xff0c;并提供了一种方式来组合这些表达式以实现复杂的语句…...

图像识别技术在不同场景下有哪些应用?

图像识别技术在不同场景下的应用包括&#xff1a; 遥感图像识别&#xff1a;航空遥感和卫星遥感图像通常用图像识别技术进行加工以便提取有用的信息。该技术目前主要用于地形地质探查&#xff0c;森林、水利、海洋、农业等资源调查&#xff0c;灾害预测&#xff0c;环境污染监…...

阿里巴巴OceanBase介绍

前言 官网地址&#xff1a;https://www.oceanbase.com/ OceanBase是由蚂蚁集团完全自主研发的国产原生分布式数据库&#xff0c;始创于2010年。是全球唯一在 TPC-C 和 TPC-H 测试上都刷新了世界纪录的国产原生分布式数据库。 2010年&#xff0c;创始人阳振坤加入阿里巴巴&…...

leetcode 2560. 打家劫舍 IV

2560. 打家劫舍 IV 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统&#xff0c;所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额 。…...

正点原子lwIP学习笔记——Socket接口TCP实验

1. Socket接口TCP Client配置连接 配置步骤如下所示&#xff1a; sin_family设置为AF_INET表示IPv4网络协议&#xff1b;sin_port为设置端口号&#xff1b;sin_addr. s_addr设置远程IP地址&#xff1b;调用函数Socket创建Socket连接&#xff0c; 注意该函数的第二个参数SOCK_…...

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…...

大数据Flink(九十一):Array Expansion(数组列转行)和Table Function(自定义列转行)

文章目录 Array Expansion(数组列转行)和Table Function(自定义列转行)...

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例CentOS的存储和备份策略

1 华为云云耀云服务器L实例介绍 华为云云耀云服务器L实例是华为云计算服务中的一种虚拟云服务器&#xff0c;它提供了强大的计算资源&#xff0c;可以在云端运行各种应用程序和服务。 华为云服务器提供了多种实例类型&#xff0c;包括通用型、计算优化型、内存优化型等&#…...

Web自动化测试 —— 如何进行Selenium页面数据及元素交互?啊哈

前言&#xff1a; Web自动化测试是一种常用的测试方式&#xff0c;通过在浏览器中模拟用户操作以及与页面元素的交互&#xff0c;可以有效地检验页面的功能性以及稳定性。Selenium是一款流行的Web自动化测试工具&#xff0c;在本篇文章中&#xff0c;我们将介绍如何使用Seleni…...

别再死记ResNet结构了!用PyTorch手搓一个ResNet-50,从零理解残差连接

从零构建ResNet-50&#xff1a;用PyTorch拆解残差网络的秘密 深度学习领域最令人着迷的突破之一&#xff0c;莫过于残差网络&#xff08;ResNet&#xff09;的诞生。2015年&#xff0c;何恺明团队提出的这一架构不仅横扫ImageNet竞赛&#xff0c;更彻底改变了我们对深度神经网络…...

开发效率翻倍:用快马智能推荐最佳排序算法,告别性能焦虑

今天想和大家分享一个提升开发效率的实用技巧——如何快速找到最适合当前场景的排序算法。作为开发者&#xff0c;我们经常需要处理各种排序需求&#xff0c;但面对不同规模、不同特征的数据集时&#xff0c;如何选择最优算法往往让人头疼。 数据准备阶段 在实际项目中&#xf…...

OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务

OpenClaw对接nanobot镜像&#xff1a;低成本实现本地AI助手自动化任务 1. 为什么选择OpenClawnanobot组合 去年夏天&#xff0c;当我第一次尝试用AI自动化处理日常工作时&#xff0c;发现大多数方案要么需要昂贵的云服务API调用&#xff0c;要么对硬件要求极高。直到遇到Open…...

全向轮底盘运动控制:嵌入式PID与逆运动学实现

1. 全向轮底盘控制库&#xff08;omni_wheel&#xff09;技术解析与工程实践1.1 项目背景与工程定位omni_wheel是为B团队自主移动机器人开发的底层运动控制模块&#xff0c;最初版本发布于2018年7月10日。从其原始README描述“PIDかけて一方向に進むだけのプログラムでござんす…...

阿联酋人工智能大学:AI能在战争迷雾中做出理性判断吗?

这项由阿联酋穆罕默德本扎耶德人工智能大学和美国马里兰大学共同完成的研究发表于2026年3月&#xff0c;论文编号为arXiv:2603.16642v1。有兴趣深入了解的读者可以通过该编号查询完整论文。在人类历史上&#xff0c;预测战争走向一直是个极其困难的任务。就像我们很难在暴风雨中…...

一本计算机专业,准大一,有什么忠告?

你现在大概处于一种很特别的状态。高考刚结束不久&#xff0c;录取通知书拿到了&#xff0c;专业是计算机。可能是你自己选的&#xff0c;也可能是家里建议的&#xff0c;也可能是分数刚好够就填了。不管哪种&#xff0c;你现在对”计算机专业到底学什么”的理解大概率是模糊的…...

Django REST framework的应用场景

目录一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统&a…...

Unity 工具之(SharpZipLib)跨平台中文Zip压缩与解压实战指南(附多线程优化)

1. 为什么选择SharpZipLib处理Unity中的Zip文件 在Unity项目开发中&#xff0c;资源打包和网络传输经常需要处理压缩文件。SharpZipLib作为.NET平台的老牌压缩库&#xff0c;相比Unity内置的压缩方案有三个不可替代的优势&#xff1a; 首先是对中文路径的完美支持。很多开发者都…...

OpenRocket:模型火箭仿真的全流程技术解决方案

OpenRocket&#xff1a;模型火箭仿真的全流程技术解决方案 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket OpenRocket作为一款开源的模型火箭仿真软件&…...

别再手动调API了!用Dify+FastAPI+阿里云OSS,5分钟搭建一个自动化的文生视频服务

从零构建AI视频生成流水线&#xff1a;DifyFastAPIOSS全链路自动化实战 在内容创作领域&#xff0c;视频制作正经历着从手工剪辑到AI生成的范式转移。传统视频制作需要专业软件、复杂操作和大量时间投入&#xff0c;而现代AI技术已经能够通过自然语言描述直接生成高质量视频片段…...