当前位置: 首页 > 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;
}

注意:

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

http://www.lryc.cn/news/176563.html

相关文章:

  • MATLAB实现相关性分析
  • MySQL索引看这篇就够了
  • 无法从 /var/lib/rpm 打开软件包数据库
  • 路由器实现 IP 子网之间的通信
  • 解决kali beef启动失败问题及实战
  • 【NetEq】NackTracker 走读
  • 条例18~23(设计与声明)
  • STM32 UART通信协议 基础知识
  • nginx部署vue前端项目,访问报错500 Internal Server Error
  • @Excel注解
  • 解释器模式简介
  • 图像识别技术在不同场景下有哪些应用?
  • 阿里巴巴OceanBase介绍
  • leetcode 2560. 打家劫舍 IV
  • 正点原子lwIP学习笔记——Socket接口TCP实验
  • 【Flink】
  • 大数据Flink(九十一):Array Expansion(数组列转行)和Table Function(自定义列转行)
  • 华为云云耀云服务器L实例评测|华为云云耀云服务器L实例CentOS的存储和备份策略
  • Web自动化测试 —— 如何进行Selenium页面数据及元素交互?啊哈
  • 点云从入门到精通技术详解100篇-基于全景图的室内场景点云补全方法(续)
  • Debezium系列之:采集数据库数据实现对表指定的字段进行加密,下游实现对表加密后的字段进行解密
  • Win10 cmd如何试用tar命令压缩和解压文件夹
  • 最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt+MJ以图生图+思维导图生成
  • AI绘画普及课【二】图生图
  • C语言 数据类型
  • 瑞芯微RK3568:Debian系统如何安装Docker
  • 联邦学习-Tensorflow实现联邦模型AlexNet on CIFAR-10
  • 嵌入式Linux应用开发-文件 IO
  • 【C++】多态,从使用到底层。
  • uvm白皮书练习_ch2_ch221只有driver的验证平台之*2.2.1 最简单的验证平台