拷贝构造函数:
Myclass(const Myclass& myclass)
{
a=myclass.a;
b=myclass.b;
c=myclass.c;
}
浅拷贝的思路就是和默认的拷贝构造函数一样: 即将原对象的值直接赋值给新对象,这样做一般情况下是没什么问题的,但是如果类的成员有指针,就会导致新对象中的指针和原对象中的指针指向的是一个地址.这样就会有若干风险存在
深拷贝的思路是,开辟新的空间,让新对象中的指针和原对象中的指针分别指向不同的空间.
所以说当类中有成员函数是指针的情况下,我们就不能使用浅拷贝,而应
当使用深拷贝.
使用深拷贝的例子:
class Myclass
{
char *str;
public:
Myclass(const Myclass & myclass)
{
int n = strlen(myclass.str)+1;
str = new char[n];
strcpy(str,myclass.str);
}
}
ps:
这里把语句str=new char[n],改成
str=new char;
str=new char();
str=new char[0];
..........
都是能正常编译且运行的,只不过编译器会给出警告,提示溢出缓冲区
另外strcpy这个函数在VS版本中已经因为不安全而被弃用了,如果想在VS中使用这个函数,需要加上
#define _CRT_SECURE_NO_WARNINGS
#include
如果使用 strcpy_s版本开辟空间
Myclass(const Myclass & myclass)
{
int n = strlen(myclass.str)+1;
str = new char[n];
strcpy_s(str,n,myclass.str);
}
缓冲区的大小=背复制的字符串的长度+1;
strcpy的安全版本:strcpy_s使用方法:
strcpy_s