鱼C论坛

 找回密码
 立即注册
查看: 1775|回复: 0

[技术交流] 拷贝构造(深拷贝/浅拷贝)

[复制链接]
发表于 2019-6-3 13:59:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Julia999 于 2019-7-31 18:43 编辑
1.拷贝构造函数调用的时机(1)用已有对象初始化新创建对象
int main()
{
   Location A(1,2);
   Location B(A);
   cout<<B.getX()<<","<<B.getY()<<endl;
}
(2)函数的类类型初始化形参时
void f(Point p)
{}
mian()
{
     Point A(1,2);
     f(A);
}
在上面这个例子中,我们把实参传给行参的时候,会自动出现拷贝构造函数。
(3)函数返回类类型
Point g()
{
   Point A(1,2);
   return A;
}
void main()
{
   Point D=g();
}
在上面这个例子中,函数的返回值A实际上是一个A的拷贝,并不是返回A本身。
(3)与重载的赋值运算(=)区别
int main()
{
   Name Obj1("zhangsan");
   Name Obj2=Obj1;//调用复制构造函数
   Name Obj3("NoName");
   Obj3=Obj2=Obj1;
}

2.浅拷贝和深拷贝?
浅拷贝——仅拷贝栈里的数据
深拷贝——拷贝栈和堆里的数据
例子:(一个有问题的程序)
#include<iostream>
using namespace std;
class name
{
public:
   name(char *pa);
   ~name();
protected:
   char *pname;
   int size;
};
name::name(char *pa)
{
   cout<<"Constructing"<<pa<<endl;
   pname=new char[strlen(pa)+1];
   if(pname!=0) strcpy(pname.pa);
   size=strlen(pa);
}name::~name()
{
   cout<<"Destructing"<<pname<<endl;
   delete []pname;
   size=0;
}
int main()
{
    name Obj1("noname");
    name Obj2=Obj1;
}
上面这个程序出现的问题在于name Obj2=Obj1,两个指针指向了同一个地方,当程序退出的时候,会执行析构函数,但是删除的时候会出现重复删除。


例子:修改上面的程序(将浅拷贝改为深拷贝)
#include<iostream>
using namespace std;
class name
{
public:
   name(char *pa);
   ~name();
protected:
   char *pname;
   int size;
};
name::name(char *pa)  //构造函数
{
   cout<<"Constructing"<<pa<<endl;
   pname=new char[strlen(pa)+1];
   if(pname!=0) strcpy(pname.pa);
   size=strlen(pa);
}


name::name(const name &Obj)
{
   cout<<"Copying"<<Obj.pname<<"into its own block\n"<<endl;
   pname=new char[strlen(Obj.pname)+1];
   if(pname!=0)
{
     strcpy(pname,Obj.pname);
}
   size=Obj.size;
}


name::~name()
{
   cout<<"Destructing"<<pname<<endl;
   delete []pname;
   size=0;
}
int main()
{
    name Obj1("noname");
    name Obj2=Obj1;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表