目录
- 拷贝构造函数
- 浅拷贝
- 深拷贝
拷贝构造函数
拷贝构造函数:
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 <stdio.h>
如果使用 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