参考网址:https://www.cnblogs.com/BlueTzar/articles/1223313.html

https://www.cnblogs.com/xiaodingmu/p/7407307.html

一、浅赋值问题

(1)如果类中叧包含简单数据成员,没有指向堆的指针, 可以使用编译器提供的默认复制构造函数

(2)如果类中包含指向堆中数据的指针,浅复制将出现 严重问题

①浅复制直接复制两个对象间的指针成员,导致两个指针 指向堆中同一坑内存区域

② 一个对象的修改将导致另一个对象的修改

③ 一个对象超出作用域,将导致内存释放,使得另一个对 象的指针无效,对其访问将导致程序异常。

二、编写自己的赋值构造函数(完成深复制的内容):实现了资源的重新分配

(1)含有指针成员的类,通常需要编写构造函数和复制 构造函数,同时需要实现相应的复制构造函数,以 及运算符重载

(2)实现“深复制”,创建对象备仹时,为新对象在堆 中分配自己的内存,并将现有值复制到新内存中。

Tricycle类举例:

第一部分:主函数:main.cpp

#include "Tricyle.h"
#include "iostream"int main()
{Tricycle wichita;Tricycle dallas(wichita);   //复制构造函数wichita.setSpeed(10);std::cout<<"Wichita ";wichita.pedal();std::cout<<"Dallas ";dallas.pedal();std::cout<<"Wichita ";wichita.brake();std::cout<<"Dallas ";dallas.brake();return 0;
}

第二部分,头文件:Tricycle.h

#ifndef TRICYLE_H_INCLUDED
#define TRICYLE_H_INCLUDED//defination class
class Tricycle
{
public:Tricycle(); //constructor funTricycle(const Tricycle &rsh);//copy constructor fun~Tricycle(); //disconstructor funint getSpeed()const{return *speed;}void setSpeed(int newSpeed){*speed = newSpeed;}void pedal(); //速度增加void brake();
private:int *speed;   //在堆中申请了内存
};#endif

第三部分:Tricycle.cpp


#include "Tricyle.h"
#include "iostream"
using namespace std;Tricycle::Tricycle()
{speed = new int(5);}
Tricycle::Tricycle(const Tricycle &rsh)
{speed = new int ;  //申请动态空间,但是并没有进行初始化*speed = *rsh.speed;   //或者写成,*speed = rsh.getSpeed();}
Tricycle::~Tricycle()
{delete speed;speed =NULL;
}//速度增加
void Tricycle::pedal()
{(*speed)++;   //或者setSpeed(getSpeed()+1)std::cout << "pedaling" << getSpeed()<<'\n';}void Tricycle::brake()
{(*speed)--;std::cout << "brakeing" << getSpeed()<<'\n';}

运行结果:

深复制的例子:Person类

#include <iostream>
#include <string>
using namespace std;class Person
{
public: Person();                                 //缺省的构造函数                    Person(const char *name, int age, char sex);   //带参数构造函数Person(Person &p);                      //复制构造函数构造函数                             ~Person();                              //析构函数void out()                             //输出信息{cout<<name<<","<<age<<","<<sex<<endl;}  private:  char *name; char sex;  int age;
}; int main()
{  cout << "***第一种情况,调用无参的构造函数"<<endl;;Person a;a.out();cout << "***第二种情况,调用含参的构造函数"<<endl;Person p1("zhangsan",20,'F');   //对构造函数进行初始化p1.out(); cout << "***第三种情况,复制构造函数"<<endl;Person p2(p1); p2.out(); return 0;
} Person::Person()
{cout << "\t 调用了无参数的构造函数:";name = new char[10];strcpy(name,"haoaowei");sex = 'M';age = 25;}//带参数构造函数Person::Person(const char *name, int age, char sex)
{cout << "\t 调用了含参数的构造函数:";this->name = new char[strlen(name)+1];  //加1是为存储\0strcpy(this->name,name);this->age = age;this->sex = sex;
}
Person::~Person()
{cout << "name:"<<name<<"调用了析构函数"<< endl;delete []name;name = NULL;
}//复制构造函数
Person::Person(Person &p)
{cout << "\t 调用了复制构造函数:";name = new char[strlen(p.name)+1];strcpy(name,p.name);this->age = p.age;this->sex = p.sex;
}

运行结果:

C++浅拷贝(值拷贝)和深拷贝(位拷贝)相关推荐

  1. 浅拷贝、深拷贝、值拷贝和位拷贝

    首先: 位拷贝就是浅拷贝,值拷贝就是深拷贝. 编译器会在必要的时候,自己产生默认的拷贝构造函数和赋值函数,采用的位拷贝. 自己可以重新定义 拷贝构造函数,要注意采用值拷贝. Q:什么是浅拷贝(shal ...

  2. C++拷贝构造函数(深拷贝,浅拷贝)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...

  3. C++拷贝构造函数(深拷贝与浅拷贝)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...

  4. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例

    转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...

  5. JS对象拷贝:深拷贝和浅拷贝

    摘要:对象拷贝,简而言之就是将对象再复制一份,但是,复制的方法不同将会得到不同的结果. 本文分享自华为云社区<js对象深浅拷贝,来,试试看!>,作者: 北极光之夜.. 一.速识概念: 对象 ...

  6. c++学习笔记(12) 需要对对象做拷贝时(深拷贝,浅拷贝),如何重载赋值运算符

    在c++学习笔记(8)中,介绍了拷贝构造函数的概念:涉及到深拷贝和浅拷贝的概念: 拷贝构造函数:每一个类都有一个都有一个拷贝构造函数,用于拷贝对象.拷贝构造函数可以用来创建一个对象,并用另一个对象的数 ...

  7. 深入理解Python深拷贝(deepcopy)、浅拷贝(copy)、等号拷贝----看了还不懂找我

    编程中难免会遇到copy(浅拷贝)与deepcopy(深拷贝)问题,一不小心就会掉进坑中了,或许很多人只知道有深浅拷贝,但是你又知道copy和"="拷贝有什么区别么?也许很少有人对 ...

  8. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

  9. c++拷贝构造函数(深拷贝,浅拷贝)详解

    一.什么是拷贝构造函数       首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成 ...

  10. 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像数据中的 YUV 数据简介 二.向 x264 编码图片 三. 提取 NV21 数据中的灰度数据 Y 四. 提取 NV21 数据中的饱和度数据 U ...

最新文章

  1. 【NetApp】安装Cmode模拟器时,应使用带交换机的模式
  2. Windows Mobile Incoming Call View Custom
  3. numpy.lib.stride_tricks.as_strided() 高效切分数组
  4. element ui表格点击整行选择_element-ui实现动态表头的表格问题汇总
  5. 现代软件工程讲义 11 项目管理 - 事后诸葛亮会议
  6. iOS -- SKScene类
  7. mysql十万条数据_2秒内向数据库中插入十万条数据?
  8. 流程控制库async
  9. existed hive ods_hive数据仓库建设
  10. linux下的nginx+tomcat配置
  11. 【前端进阶之路】内存基本知识
  12. 并查集:POJ No1703 Find them, Catch them
  13. 联想y50更换固态硬盘_联想y50怎么加固态硬盘而不换原来的机器硬盘?
  14. 网际风全推数据接口_网际风接口软件
  15. matlab连通区域质心标记,连通域的质心
  16. java simon_Java程序监控API Java Simon
  17. 谁能和乔布斯比勤奋?乔布斯的睡眠时间
  18. 2020-09-12
  19. 你若运行,便是晴天!
  20. 经过离散点画平滑曲线(贝塞尔3次)

热门文章

  1. 电子器件激发出的想象力
  2. 网站不稳定的原因有哪些
  3. nginx配置域名转发到其他域名的几种方法
  4. 网购火车票攻略(十一长假版)
  5. PTA-python练习题-1
  6. 关于SELECT...FOR UPDATE到底锁表还是锁行
  7. 小会计去财务公司代理记账,还有前途吗
  8. JavaScript判断数据类型有几种方法,以及它们的区别
  9. 在服务器端搭建WDS自动部署服务实现自动装机
  10. 余数之和(数论、数学题)