拷贝构造函数
拷贝构造函数:
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版本开辟空间文章来源:https://www.toymoban.com/news/detail-708427.html
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文章来源地址https://www.toymoban.com/news/detail-708427.html
到了这里,关于拷贝构造函数(深拷贝+浅拷贝)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!