C++的掐拷贝、深拷贝【面向对象程序设计细节】
2021/6/20 17:22:08
本文主要是介绍C++的掐拷贝、深拷贝【面向对象程序设计细节】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 一、浅拷贝
- 二、深拷贝
一、浅拷贝
#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++的掐拷贝、深拷贝【面向对象程序设计细节】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享