C++深拷贝的浅拷贝
Posted boyboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++深拷贝的浅拷贝相关的知识,希望对你有一定的参考价值。
-
class person
public:
person(int age,int height)
m_age=age;
m_height=new int(height);//new一个堆区接受外来值与成员变量地址一致
cout<<"有参构造函数"<<endl;
~person()//析构函数将堆区的数据释放
if(m_height!=NULL)
delete m_height;
m_height=NULL;
cout<<"析构函数"<<endl;
int m_age;
int *m_height;
;
void text01()
person p1(10,20);
cout<<"年龄为"<<p1.m_age<<"身高为"<<p1.m_height<<endl;
person p2(p1);
cout<<"年龄为"<<p2.m_age<<"身高为"<<p2.m_height<<endl;
int main()
text01(); -
当调用析构函数时由于,p2的拷贝函数和p2的构造函数同时对同一份地址进行析构产生错误
-
修改系统自动给出的拷贝构造,在有参构造下应自己实现拷贝构造函数
-
//深拷贝
person(const person *p)
//m_height=p.m_height;系统自动给出
m_height=new int (*p.m_height);
初始化列表
-
class person
public:
person(int a,int b,int c):m_a(a),m_b(b),m_c(c)
int m_a;
int m_b;
int m_c;
;
void text01()
person p(10,25,66);
cout<<p.m_a<<p.m_b<<p.m_c<<endl;
int main()
text01(); -
类对象作为类成员
-
class phone
public:
phone(string pname)
m_pname=pname;
string m_pname;
;
class person
public:
person(string name,string pname):m_name(name),m_pname(pname)
string m_name;
phone m_pname;
;
void test()
person p("小子","苹果max");
cout<<"姓名"<<p.m_name<<"手机为"<<p.m_pname.m_pname<<endl;
int main()
test();
-
-
静态成员
-
class person
public:
static int age;//类内声明
private:
;
int person::age=10;// 类外初始化
void text01()
//用对象进行访问
person p1;
cout<<p1.age<<endl; //输出的结果是10
person p2;
cout<<p2.age<<endl;//输出的结果是10
//通过类名进行访问
cout<<person::age<<endl;
int main()
text01();
system("pause");
return 0; -
-
js的浅拷贝与深拷贝
浅拷贝和深拷贝只针对对象和数组这样的数据类型,对于基本的数据类型不存在这些问题
1、浅拷贝
浅拷贝之后的对象或数组与原对象或数组指向内存中的同一个地址,改变其中任何一个,另一个也会相应的被改变
2、深拷贝
深拷贝之后的对象或数组与原对象和数组的内存地址是独立的,改变任何一个,另一个都不会受影响
数组的深拷贝
var a = [1,2,3]; var b = a.concat();//数组拼接 var c = a.slice(0);//截取数组
对象的深拷贝
手动复制,将属性一个个复制到新对象中,或使用Object.assign()该方法只能复制基本数值的属性,若属性为引用类型,则为浅复制,即这两种方法的处理深度只有一层,没有做到真正的深复制
转成JSON再转回来
var obj1 = {a:1,b:{a:11,b:22}}; var obj2 = JSON.parse(JSON.stringify(obj1))
该方法值适用于JSON格式的对象,而function没有办法转成JSON,该方法只适用于单纯的数据对象
jquery的$.extend方法
lodash中的_.cloneDeep
以上是关于C++深拷贝的浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章