鱼C论坛

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

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

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

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

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

x
本帖最后由 Julia999 于 2019-7-31 18:43 编辑
1.拷贝构造函数调用的时机(1)用已有对象初始化新创建对象
  1. int main()
  2. {
  3.    Location A(1,2);
  4.    Location B(A);
  5.    cout<<B.getX()<<","<<B.getY()<<endl;
  6. }
复制代码

(2)函数的类类型初始化形参时
  1. void f(Point p)
  2. {}
  3. mian()
  4. {
  5.      Point A(1,2);
  6.      f(A);
  7. }
复制代码

在上面这个例子中,我们把实参传给行参的时候,会自动出现拷贝构造函数。
(3)函数返回类类型
  1. Point g()
  2. {
  3.    Point A(1,2);
  4.    return A;
  5. }
  6. void main()
  7. {
  8.    Point D=g();
  9. }
复制代码

在上面这个例子中,函数的返回值A实际上是一个A的拷贝,并不是返回A本身。
(3)与重载的赋值运算(=)区别
  1. int main()
  2. {
  3.    Name Obj1("zhangsan");
  4.    Name Obj2=Obj1;//调用复制构造函数
  5.    Name Obj3("NoName");
  6.    Obj3=Obj2=Obj1;
  7. }
复制代码


2.浅拷贝和深拷贝?
浅拷贝——仅拷贝栈里的数据
深拷贝——拷贝栈和堆里的数据
例子:(一个有问题的程序)
  1. #include<iostream>
  2. using namespace std;
  3. class name
  4. {
  5. public:
  6.    name(char *pa);
  7.    ~name();
  8. protected:
  9.    char *pname;
  10.    int size;
  11. };
  12. name::name(char *pa)
  13. {
  14.    cout<<"Constructing"<<pa<<endl;
  15.    pname=new char[strlen(pa)+1];
  16.    if(pname!=0) strcpy(pname.pa);
  17.    size=strlen(pa);
  18. }name::~name()
  19. {
  20.    cout<<"Destructing"<<pname<<endl;
  21.    delete []pname;
  22.    size=0;
  23. }
  24. int main()
  25. {
  26.     name Obj1("noname");
  27.     name Obj2=Obj1;
  28. }
复制代码

上面这个程序出现的问题在于name Obj2=Obj1,两个指针指向了同一个地方,当程序退出的时候,会执行析构函数,但是删除的时候会出现重复删除。


例子:修改上面的程序(将浅拷贝改为深拷贝)
  1. #include<iostream>
  2. using namespace std;
  3. class name
  4. {
  5. public:
  6.    name(char *pa);
  7.    ~name();
  8. protected:
  9.    char *pname;
  10.    int size;
  11. };
  12. name::name(char *pa)  //构造函数
  13. {
  14.    cout<<"Constructing"<<pa<<endl;
  15.    pname=new char[strlen(pa)+1];
  16.    if(pname!=0) strcpy(pname.pa);
  17.    size=strlen(pa);
  18. }


  19. name::name(const name &Obj)
  20. {
  21.    cout<<"Copying"<<Obj.pname<<"into its own block\n"<<endl;
  22.    pname=new char[strlen(Obj.pname)+1];
  23.    if(pname!=0)
  24. {
  25.      strcpy(pname,Obj.pname);
  26. }
  27.    size=Obj.size;
  28. }


  29. name::~name()
  30. {
  31.    cout<<"Destructing"<<pname<<endl;
  32.    delete []pname;
  33.    size=0;
  34. }
  35. int main()
  36. {
  37.     name Obj1("noname");
  38.     name Obj2=Obj1;
  39. }
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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