文章目录

  • 一、浅拷贝
  • 二、深拷贝

一、浅拷贝

#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;//定义一个类Person
class Person
{private:char *m_name;  //私有成员数据中定义个指针 int m_num;
public:  //共有成员接口 Person()  //普通无参构造函数 {m_name = NULL;  //在构造函数中将指针指向空 m_num = 0;cout << "已调用无参构造..." << endl;}Person(char *name,int num)  //普通有参构造函数 {//为m_name重新申请空间m_name = (char *)calloc(1,strlen(name)+1);  //新空间大小刚好为name的长度 if(m_name == NULL)  //若私有成员指针仍指向空地址,则输出构造失败 {cout<<"构造失败"<<endl;}cout<<"-->已经申请好空间"<<endl;  //否则提示空间申请成功 strcpy(m_name,name);  //将传入有参构造的参数指针赋值给成员指针 m_num = num;  cout<<"已调用有参构造..."<<endl;}~Person()  //定义析构函数 {if(m_name != NULL)  //若成员指针指向空,表示空间已被释放 {cout<<"m_name的空间已被释放"<<endl;free(m_name);  //否则手动释放内存空间 m_name = NULL;}cout<<"析构函数调用结束..."<<endl;}void showPerson(){cout << "m_name = " << m_name << ", m_num = " << m_num << endl;}
};//定义有参构造的接口测试函数
void demo1()
{Person p1("Chung", 42607);  //实例化p1对象,调用有参构造函数 p1.showPerson();  //调用成员函数输出p1的信息 // 浅拷贝Person p2= p1; //调用系统的默认拷贝构造(单纯的值拷贝)
}//定义无参构造的接口测试函数
void demo2()
{Person p3;  //实例化p3对象,调用无参构造函数p3.showPerson();  //输出p3的信息//浅拷贝Person p4= p3;  //简单的值拷贝 p4.showPerson();
}//主函数定义
int main(int argc, char *argv[])
{demo1();  //测试开始 ,有参构造 //demo2();  //无参构造 return 0;
}

二、深拷贝

#include <iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;//定义一个类Person
class Person
{private:char *m_name;  //私有成员数据中定义个指针int m_num;
public:Person()  //普通无参构造函数 {m_name = NULL;  //在构造函数中将指针指向空 m_num = 0;cout << "已调用无参构造..." << endl;}Person(char *name,int num)  //普通有参构造函数 {//为m_name重新申请空间m_name = (char *)calloc(1,strlen(name)+1);  //新空间大小刚好为name的长度 if(m_name == NULL)  //若私有成员指针仍指向空地址,则输出构造失败 {cout<<"构造失败"<<endl;}cout<<"-->已经申请好空间"<<endl;  //否则提示空间申请成功 strcpy(m_name,name);  //将传入有参构造的参数指针赋值给成员指针 m_num = num;  cout<<"已调用有参构造..."<<endl;}//自定义拷贝构造函数 Person(const Person &p)//p是一个引用类型,括号内相当于Box p=b1{cout << "--------------------拷贝构造函数----------------------" << endl;m_name= (char *)calloc(1, strlen(p.m_name)+1);  //在拷贝构造函数中重新申请空间,就能够实现地址的拷贝 cout << "空间已被申请" << endl;strcpy(m_name, p.m_name);  //将引用对象常量下的m_name拷贝到私有成员数据m_name里 m_num= p.m_num;cout << "--------------------拷贝构造函数----------------------" << endl;}~Person()  //定义析构函数 {if(m_name != NULL)  //若成员指针指向空,表示空间已被释放 {cout<<"m_name的空间已被释放"<<endl;free(m_name);  //否则手动释放内存空间 m_name = NULL;}cout<<"析构函数调用结束..."<<endl;}void showPerson(){cout << "m_name = " << m_name << ", m_num = " << m_num << endl;}
};//定义有参构造的测试函数
void demo1()
{Person p1("Chung", 42607);p1.showPerson();//通过自定义 拷贝构造函数 完成深拷贝动作Person p2= p1;
}//定义无参构造的测试函数
void demo2()
{Person p3;//p3.showPerson();//通过自定义 拷贝构造函数 完成深拷贝动作Person p4= p3;p4.showPerson();
}//定义主函数
int main(int argc, char *argv[])
{//demo1();  //调用测试函数 demo2();return 0;
}

C++的掐拷贝、深拷贝【面向对象程序设计细节】相关推荐

  1. C++ primer 第15章 面向对象程序设计

    文章目录 前言 OOP:概述 继承 动态绑定 定义基类和派生类 定义基类 成员函数与继承 访问控制与继承 定义派生类 派生类中的虚函数 派生类对象及派生类向基类的类型转换 派生类构造函数 派生类使用基 ...

  2. C++面向对象程序设计概念全总结(六)--最全的概念总结

    1.对象和类概念 对象:任何一个对象都应该具备两个要素:属性.行为. 在C++中每个对象都有数据(体现了'属性')和函数(用来对数据进行操作,以实现某些功能)两部分组成. 类:具有共性的实体的抽象. ...

  3. 初学者C++面向对象程序设计概念全总结最全的概念总结

    1.对象和类概念 对象:任何一个对象都应该具备两个要素:属性.行为. 在C++中每个对象都有数据(体现了'属性')和函数(用来对数据进行操作,以实现某些功能)两部分组成. 类:具有共性的实体的抽象. ...

  4. 面向对象程序设计(JAVA)复习笔记(上)

    文章目录 一.JAVA语言基础知识 变量和常量 标准输入输出 数组 数组的声明 数组的创建 数组元素的初始化 数组的引用 多维数组 二.类和对象的基本概念 面对对象程序设计方法概述 类的声明 对象的声 ...

  5. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

  6. 面向过程与面向对象 程序设计

    面向过程的程序: 按照思路是下棋的流程进行编程, 也就是我们通常习惯使用的自低向上, 逐层精确的编程思想.这种编程的主导思想是在设计时就把实现的细节考虑好了, 从而在低层就实现了程序满足应用软件要求的 ...

  7. 狄慧201771010104《面向对象程序设计(java)》第八周学习总结

    实验六接口的定义与使用 实验时间 2018-10-18 一.实验目的与要求 (1) 掌握接口定义方法: (2) 掌握实现接口类的定义要求: (3) 掌握实现了接口类的使用要求: (4) 掌握程序回调设 ...

  8. JavaSE-Adventure(VII) Java OOP 面向对象程序设计

    JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 CONTENTS JavaSE-Adventure(VII) Java & OOP 面向对象程序设计 ...

  9. C++面向对象程序设计教程

    前言 全篇使用标题+代码的形式,知识点的介绍写在代码部分的注释里.书籍为<C++面向对象程序设计教程(第四版)>(陈维兴 林小茶 编著). 第一章为基础概念,过于简单:第七章为输入输出流, ...

最新文章

  1. 用一个创业故事串起操作系统原理(二)
  2. linux怎么压缩后保留原文件,Linux 实现压缩保留源文件的方法
  3. “==”和equals()那些事
  4. ping不通docker_初识docker
  5. 华为照片在哪个文件夹_原来华为手机还能这样清理垃圾,怪不得你的手机可以多用5年...
  6. [Unity] 战斗系统学习 2:FlowCanvas 中的 SubGraph
  7. Redis的N种妙用,不仅仅是缓存
  8. python编写鸡兔同笼程序设计_Python少儿编程:鸡兔同笼,涨知识了
  9. 如何快速将一个lista集合中的部分字段值组合成新的的listb部分*
  10. pve万兆网卡驱动_家庭基础万兆网络——最简单的方案
  11. 2021年Web前端开发的趋势有哪些
  12. c语言编写五子棋报告,C语言编写五子棋游戏
  13. H5之微信授权登陆 (uniapp网页版微信授权登录)
  14. 计算机网络:20 网络应用需求
  15. JVM 垃圾收集器 学习笔记(《深入理解java虚拟机》之六 垃圾收集)
  16. 大数据矩阵计算基础(二):R、Excel、Matlab中矩阵操作
  17. kafka topic消息分配partition规则
  18. Maven的一个基础pom.xml文件结构
  19. 读书笔记:Spring in action 第2章
  20. python五角星教程_绘制五角星_清华尹成python入门教程_少儿编程视频-51CTO学院

热门文章

  1. php phpredis,PHP_PHP中redis的用法深入解析,redis是一个key-value存储系统。 - phpStudy...
  2. octave安装 缺java_在Octave中导入Java类
  3. mac xampp连接mysql数据库_在mac上如何使用终端打开XAMPP自带的MySQL
  4. mysql快捷键设置_MySQL快捷命令
  5. 原生ajax的post方法,原生js实现ajax及get post方法
  6. python下载url链接_使用Python从url地址下载所有pdf文件
  7. php将汉字转换为gb2312编码,php实现utf-8和GB2312编码相互转换
  8. Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.24.215] failed: connect timed ou
  9. 基于JAVA+Servlet+JSP+MYSQL的停车场管理系统
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的社区养老服务网站