拷贝构造函数(深拷贝+浅拷贝)

目录

  • 拷贝构造函数
  • 浅拷贝
  • 深拷贝

拷贝构造函数

拷贝构造函数:

Myclass(const Myclass& myclass)
{
     a=myclass.a;
     b=myclass.b;
     c=myclass.c;
}

浅拷贝

浅拷贝的思路就是和默认的拷贝构造函数一样: 即将原对象的值直接赋值给新对象,这样做一般情况下是没什么问题的,但是如果类的成员有指针,就会导致新对象中的指针和原对象中的指针指向的是一个地址.这样就会有若干风险存在

  • 对新对象中的指针内容修改时,原对象中的指针内容也会被修改
  • 对新对象析构后,再对原对象析构,就会导致对同一个地址释放释放两次.

深拷贝

拷贝构造函数(深拷贝+浅拷贝)_第1张图片

深拷贝的思路是,开辟新的空间,让新对象中的指针和原对象中的指针分别指向不同的空间.

所以说当类中有成员函数是指针的情况下,我们就不能使用浅拷贝,而应
当使用深拷贝.

使用深拷贝的例子:

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

你可能感兴趣的:(c++)