服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++简明图解分析浅拷贝与深拷贝

C++简明图解分析浅拷贝与深拷贝

2022-12-15 11:59Bright-SKY C/C++

在c++中,深拷贝和浅拷贝也算是一个难点,特别是对于初学者来说,往往在不知道两者区别的情况下而错误的使用了浅拷贝,从而导致了野指针之类的问题,但是又因为缺少理解所以很难定位到问题所在

类中有指针成员 才会讨论 浅拷贝 和深拷贝问题。

浅拷贝(单纯值拷贝)

C++简明图解分析浅拷贝与深拷贝

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
  char *m_name;
public:
  Person(char *name)
  {
      cout<<"有参构造"<<endl;
      m_name = (char *)calloc(1,strlen(name)+1);
      if(m_name == NULL)
      {
          cout<<"空间申请失败"<<endl;
          exit(-1);
      }
      strcpy(m_name, name);
  }
  ~Person()
  {
      cout<<"析构函数"<<endl;
      //释放指针成员 指向的堆区空间
      if(m_name != NULL)
      {
          free(m_name);
          m_name = NULL;
      }
      cout<<"-----001------"<<endl;
  }
};
int main(int argc, char *argv[])
{
  Person ob1("lucy");
  Person ob2 = ob1;//拷贝构造(默认是浅拷贝)
  cout<<"ob2.m_name = "<<ob2.m_name<<endl;
  return 0;
}

C++简明图解分析浅拷贝与深拷贝

 

深拷贝

必须在拷贝构造中给ob2.m_name申请空间

C++简明图解分析浅拷贝与深拷贝

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Person
{
public:
  char *m_name;
public:
  Person(char *name)
  {
      cout<<"有参构造"<<endl;
      m_name = (char *)calloc(1,strlen(name)+1);
      if(m_name == NULL)
      {
          cout<<"空间申请失败"<<endl;
          exit(-1);
      }
      strcpy(m_name, name);
  }
  Person(const Person &ob)
  {
      cout<<"拷贝构造函数(深拷贝)"<<endl;
      m_name = (char *)calloc(1, strlen(ob.m_name)+1);
      if(m_name == NULL)
      {
          cout<<"空间申请失败"<<endl;
          exit(-1);
      }
      strcpy(m_name, ob.m_name);
  }
  ~Person()
  {
      cout<<"析构函数"<<endl;
      //释放指针成员 指向的堆区空间
      if(m_name != NULL)
      {
          free(m_name);
          m_name = NULL;
      }
  }
};
int main(int argc, char *argv[])
{
  Person ob1("lucy");
  Person ob2 = ob1;//拷贝构造
  cout<<"ob2.m_name = "<<ob2.m_name<<endl;
  return 0;
}

C++简明图解分析浅拷贝与深拷贝

 

总结

1、如果类中的成员 指向了堆区空间 一定要记得在析构函数中 释放该空间

2、如果用户 不实现 拷贝构造 系统就会提供默认拷贝构造,而默认拷贝构造 只是单纯的赋值 容易造成浅拷贝问题

3、用户记得 要实现:无参构造(初始化数据)、有参构造(赋参数)、拷贝构造(深拷贝) 、析构函数(释放空间)

 

拷贝构造函数的调用时机

拷贝构造函数调用的时机:旧对象 给新对象 初始化

class Data
{
public:
  Data()
  {
      cout<<"无参构造"<<endl;
  }
  Data(const Data &ob)
  {
      cout<<"拷贝构造"<<endl;
  }
  ~Data()
  {
      cout<<"析够函数"<<endl;
  }
};

情形1:旧对象给新对象初始化

Data ob1;
Data ob2 = ob1;//调用拷贝构造

情形2:普通对象作为函数的参数

void fun01(Data ob)//Data ob=ob1  发生拷贝构造
{
}
int main(int argc, char *argv[])
{
  Data ob1;
  fun01(ob1);
  return 0;
}

情形3:普通对象 作为函数的返回值

#include <iostream>
using namespace std;
Data fun01(void)
{
  Data ob1;
  return ob1;
}
int main(int argc, char *argv[])
{
  Data ob = fun01();
  return 0;
}

vs下会发生拷贝构造:

C++简明图解分析浅拷贝与深拷贝

Qt、linux不会发生拷贝:

C++简明图解分析浅拷贝与深拷贝

C++简明图解分析浅拷贝与深拷贝

到此这篇关于C++简明图解分析浅拷贝与深拷贝的文章就介绍到这了,更多相关C++浅拷贝与深拷贝内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34981463/article/details/124994749

延伸 · 阅读

精彩推荐
  • C/C++C++中引用的相关知识点小结

    C++中引用的相关知识点小结

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍...

    Chaser Feng9962022-10-11
  • C/C++如何通过C++求出链表中环的入口结点

    如何通过C++求出链表中环的入口结点

    本文主要介绍了通过C++求解链表中环的入口结点,即给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。需要的朋友可以...

    翟天保Steven8572022-03-11
  • C/C++C++实现双向链表

    C++实现双向链表

    这篇文章主要为大家详细介绍了C++实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    adorable_11482021-09-07
  • C/C++json格式解析和libjson的用法介绍(关于cjson的使用方法)

    json格式解析和libjson的用法介绍(关于cjson的使用方法)

    下面小编就为大家带来一篇json格式解析和libjson的用法介绍(关于cjson的使用方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小...

    alixixi12162021-04-23
  • C/C++深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)

    深入const int *p与int * const p的区别详解(常量指针与指向常量的指

    本篇文章是对const int *p与int * const p的区别进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网5722020-12-16
  • C/C++c++实现简单随机数的代码

    c++实现简单随机数的代码

    在本篇文章里小编给大家整理的是一篇关于c++实现简单随机数的代码内容,有需要的朋友们可以跟着学习下。...

    Zycc++10052021-11-09
  • C/C++C++实现井字棋游戏

    C++实现井字棋游戏

    这篇文章主要为大家详细介绍了C++实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    L...P4832021-09-18
  • C/C++C语言是一个什么样的编程语言

    C语言是一个什么样的编程语言

    对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解C的程序员。C语言概念少,词汇少,包含了基本的编程元素,后来的很多语言(C++、Jav...

    hezeyujiang5472020-10-14