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

网站建设中图片广州百度推广客服电话

网站建设中图片,广州百度推广客服电话,bluehost配置wordpress,怎样学做网站运营前言 在C中,浅拷贝和深拷贝是涉及对象复制的两种不同方式,它们之间的关键区别在于拷贝对象时是否复制对象所指向的数据。 正文 浅拷贝(Shallow Copy): 浅拷贝只复制对象本身,而不复制对象所指向的数据。…

前言

在C++中,浅拷贝和深拷贝是涉及对象复制的两种不同方式,它们之间的关键区别在于拷贝对象时是否复制对象所指向的数据。

正文

浅拷贝(Shallow Copy)

  • 浅拷贝只复制对象本身,而不复制对象所指向的数据。
  • 当你使用浅拷贝创建一个新对象时,它将与原始对象共享相同的数据。这意味着如果一个对象修改了共享数据,另一个对象也会受到影响,因为它们指向相同的内存位置。
  • 浅拷贝通常是通过默认的复制构造函数或赋值操作符来执行的。

深拷贝(Deep Copy)

  • 深拷贝复制对象本身以及对象所指向的数据。它创建了一个新的独立副本,而不是与原始对象共享数据。
  • 深拷贝确保原始对象和新对象是完全独立的,修改一个对象不会影响另一个对象。
  • 深拷贝通常需要自定义复制构造函数和赋值操作符,以确保数据的完全复制。

分析代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
// 浅拷贝:简单的赋值拷贝操作// 深拷贝:在堆区重新申请空间,进行拷贝操作class Person
{
public:Person(){cout << "Person 的默认构造函数调用 " << endl;}Person(int age,int height){m_age = age;m_height = new int(height);cout << "Person 的 有参构造函数调用  " << endl;}~Person()  // 析构函数,将堆区开辟的数据释放操作{delete m_height;m_height = NULL;cout << "Person 的析构函数的调用 " << endl;}int m_age;int* m_height;
};void test()
{Person p1(18, 160);cout << "p1的年龄为: " << p1.m_age << " 身高为 " << *p1.m_height << endl;Person p2(p1);cout << "p2的年龄为: " << p2.m_age << " 身高为 " << *p2.m_height << endl;
}int main()
{test();
}

上面那个代码会报错,为什么呢,因为上面是浅拷贝操作, p1 和 p2 的 指针 m_height 都指向同一个地址,当调用析构函数的时候,在 函数 test 里面 p1 和 p2 都是存储在栈里面的,先释放 p2 的空间 , 这导致后来 p1 无法释放 m_height 指向的空间

在这里插入图片描述
会产生上面的报错

我们可以通过 将

		delete m_height;m_height = NULL;

改成

if (!m_height){delete m_height;m_height = NULL;}

浅拷贝带来的问题就是 堆区内存的重复释放带来的问题

利用深拷贝操作

我们可以写 拷贝函数 ,不使用默认的构造函数来实现深拷贝

Person(const Person& p){cout << " Person 的 拷贝函数的调用 " << endl;m_age = p.m_age;//	m_height = p.m_height;  编译器默认实现的就是这行代码// 自己实现深拷贝操作m_height = new int(*p.m_height);}

我们来看看具体的代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
// 浅拷贝:简单的赋值拷贝操作// 深拷贝:在堆区重新申请空间,进行拷贝操作class Person
{
public:Person(){cout << "Person 的默认构造函数调用 " << endl;}Person(int age,int height){m_age = age;m_height = new int(height);cout << "Person 的 有参构造函数调用  " << endl;}// 自己构造拷贝函数,解决浅拷贝带来的问题Person(const Person& p){cout << " Person 的 拷贝函数的调用 " << endl;m_age = p.m_age;//	m_height = p.m_height;  编译器默认实现的就是这行代码// 自己实现深拷贝操作m_height = new int(*p.m_height);}~Person()  // 析构函数,将堆区开辟的数据释放操作{delete m_height;m_height = NULL;cout << "Person 的析构函数的调用 " << endl;}int m_age;int* m_height;
};void test()
{Person p1(18, 160);cout << "p1的年龄为: " << p1.m_age << " 身高为 " << *p1.m_height << endl;Person p2(p1);cout << "p2的年龄为: " << p2.m_age << " 身高为 " << *p2.m_height << endl;
}int main()
{test();
}

这样 p1 和 p2 的 m_height 指向的堆的内存地址就不一样了,代码就不会报错了

http://www.shuangfujiaoyu.com/news/59977.html

相关文章:

  • 网站团队建设爱站长尾关键词挖掘工具
  • 国防教育网站建设说明书网站关键词提升
  • 自开发网站google play下载官方版
  • 网站建设小工具百度站长平台如何添加网站
  • 网站开发项目时序图企业关键词推广
  • 专业的移动网站建设公百度seo优化多少钱
  • 域名查询注册官网seo修改器
  • 怀柔城乡建设委员会的网站站长统计 站长统计
  • 做网站推广的 什么是开户网络广告推广方式
  • 莉莉卡是哪个网站做的接推广app任务的平台
  • 如何自己编写一个程序seo是哪个国家
  • 厦门网站建设 智多星网络营销推广难做吗
  • 想兼职做网站推广长春刚刚最新消息今天
  • 网站做好是需要续费的吗搜索关键词
  • 网站运营网站建设贵阳网站建设公司
  • 网站模板登录模块推推蛙品牌策划
  • 用香港服务器建网站做微商厦门网站关键词推广
  • 邢台做网站推广报价免费发布推广信息网站
  • 加若格网站做么样快手推广网站
  • 服务行业做网站关键词自助优化
  • 怎样做平台网站百度seo优化技巧
  • 河北省建设厅网站刷身份证流程西安网站建设哪家好
  • 西安公司企业网站建设商城小程序
  • 南宁专业网站建设seo免费优化软件
  • 知名电子商务网站有哪些谷歌手机网页版入口
  • 引导企业做网站seo云优化是什么意思
  • wordpress4.6获取用户名方法惠州seo推广外包
  • 毕业设计做音乐网站可以吗网络营销的优势包括
  • 郑州网站建设哪家有google海外推广
  • 网站域名使用怎么做待摊分录网站做seo教程