本文主要是介绍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++的掐拷贝、深拷贝【面向对象程序设计细节】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!