深拷贝与浅拷贝

简介: 深拷贝与浅拷贝

一、对象的拷贝


拷贝对象就是将对象复制一份,浅拷贝从字面上理解就是浅显的拷贝,可能会存在问题,
深拷贝就是经过深思熟虑对对象进行拷贝。


二、什么是浅拷贝


浅拷贝;对于比较简单的数据进行赋值操作;
弊端:如果进行拷贝的在指针或者是字符串,浅拷贝只会机械的将字符串或者地址给到新的对象;
然后会出现多个对象里面的数据仅仅是因为将指针指向了堆区里面的同一数据;
输出时不会有问题,但析构时会对堆区的同一地址里面的内容释放两次;然后出错;


1.模式图

edbb21b2ca794b2a9e7a6357703cf763.png

2.代码


#include<iostream>
using namespace std;
class test {
private:
  int a;
  int b;
public:
  test(int a=0, int b=0) {
    this->a = a;
    this->b = b;
    cout << "这里是构造函数,并且被调用了" << endl;
  }
    test(test& a) {
    this->a = a.a;
    this->b = a.b;
    cout << a.geta()<<endl;
    cout << "我是拷贝构造函数我被调用了" << endl;
  }
  ~test() {
    cout << "这里是析构函数并且被调用了" << endl;
  }
  void setAB(int a,int b) {
    this->a = a;
    this->b = b;
  }
  int geta() {
    return a;
  }
  int getb() {
    return b;
  }
};
void print(test &a) {
  cout << a.geta()<<endl;
  cout << a.getb() << endl;
}
test& abadd(test a1, test a2) {//如果函数参数是类的对象,则会调用拷贝构造函数
  //如果参数是对象的引用则不会调用构造函数;
  test a3(a1.geta() + a2.geta(), a1.getb() + a2.getb());//函数中产生的对象生命周期伴随函数生命周期
  return a3;//返回一个匿名对象,
}
int main() {
  test a1(1, 2),a2(3,4);
  test a3 = abadd(a1,a2);
  test a4 = a1;
//  print(a1);
//  print(a3);
//  print(a4);
  return 0;
}


三、什么是深拷贝?


深拷贝;通过动态内存分配解决了浅拷贝遗留的问题;对指针类型的成员属性进行单独的空间开辟
具体实现方法如下:
• 1
• 2


1.模式图


4579aa7387bc4645b8a00a24fe3143df.png


2.代码


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class pp {
private:
  int len;
  char *p;
public:
  pp(char q[]) {//构造函数
    len = strlen(q) + 1;
    p = new char[len];
    strcpy(p, q);
  }
  pp(pp& q) {//深拷贝实现方法
    if (this->p != NULL) {
      delete[]this->p;
      len = 0;
    }
    len = strlen(q.p)+1;
    this->p = new char[len];
    strcpy(this->p, q.p);
  }
  ~pp() {
    if (p != NULL) {
      delete[]p;
    }
    cout << "析构函数" << endl;
  }
  void print() {
    cout <<p<< endl;
  }
};
int main() {
  char aa[] = "I am big boy";
  char dd[] = "66666";
  pp a1(aa),a2(dd);
  a1.print();
  a2.print();
  pp a3(a2);
  a3.print();
  return 0;
}


总结


理解深拷贝浅拷贝,对我们后来学习泛型编程有很大的益处,也会使我们的内存安全问题得到解决。



相关文章
|
9月前
|
机器学习/深度学习 人工智能 算法
超越 DeepSeek-R1!Seed-Thinking-v1.5:字节跳动开源MoE架构推理模型,200B总参数仅激活20B,推理效率提升5倍
字节跳动推出的200B参数混合专家模型,在AIME/Codeforces/GPQA等基准测试中实现多项突破,采用强化学习框架与流式推理系统,支持7大领域复杂推理任务。
622 13
超越 DeepSeek-R1!Seed-Thinking-v1.5:字节跳动开源MoE架构推理模型,200B总参数仅激活20B,推理效率提升5倍
|
Linux iOS开发 Docker
【开源推荐】简单的录屏工具
【6月更文挑战第5天】
471 9
|
人工智能 API 决策智能
swarm Agent框架入门指南:构建与编排多智能体系统的利器 | AI应用开发
Swarm是OpenAI在2024年10月12日宣布开源的一个实验性质的多智能体编排框架。其核心目标是让智能体之间的协调和执行变得更轻量级、更容易控制和测试。Swarm框架的主要特性包括轻量化、易于使用和高度可定制性,非常适合处理大量独立的功能和指令。【10月更文挑战第15天】
2532 6
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习参数初始化(二)Kaiming初始化 含代码
深度学习参数初始化(二)Kaiming初始化 含代码
905 2
|
Web App开发 前端开发 JavaScript
18个网站优化技巧
快速的页面加载对提升搜索引擎排名、网站转化率和整体的用户体验是非常重要的。网站页面的加载速度也是衡量网站性能的一个重要因素。 如果网站不是以最好的性能在运行,迟缓的加载会让你在低的排名和搜索流量上花费更大的代价。
1898 0
|
2天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1439 1
|
9天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1415 10
|
9天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1330 7
|
10天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
1210 15
|
4天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
454 118

热门文章

最新文章