马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
|