Julia999 发表于 2019-6-3 13:59:18

拷贝构造(深拷贝/浅拷贝)

本帖最后由 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;
   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;
   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;
   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;
}


页: [1]
查看完整版本: 拷贝构造(深拷贝/浅拷贝)