【类和对象】——拷贝构造函数和赋值运算符重载函数

文章目录

  • 1、类中6个默认成员函数
  • 2、拷贝构造函数
    • 1.1深拷贝、浅拷贝、写时拷贝
    • 1.2拷贝构造函数详解
  • 3、赋值运算符重载

1、类中6个默认成员函数

下图列出了类中6个默认的成员函数,在我之前的博文中仔细的讲解了构造函数和析构函数,具体参照构造函数和析构函数
【类和对象】——拷贝构造函数和赋值运算符重载函数_第1张图片

2、拷贝构造函数

1.1深拷贝、浅拷贝、写时拷贝

1、浅拷贝
这种拷贝的话编译器只是将指针的值拷贝过来,结果多个对象共用同一块内存。如下图所示:
【类和对象】——拷贝构造函数和赋值运算符重载函数_第2张图片
这样存在的问题就是当一个对象将这块内存释放掉过后,另一些对象不知道该块内存已经还给了系统,以为还有效,所以在对这段内存进行操作的时候,容易发生违规访问

2、深拷贝
深拷贝是指的构造s2的时候拷贝一块儿和跟s1指向数据块一样大的数据块,并将值拷贝下来,这样s1和s2指向各自的数据块,析构时释放各自的数据块,如下图所示:
【类和对象】——拷贝构造函数和赋值运算符重载函数_第3张图片
这种方式就解决了前面浅拷贝存在的问题。但是系统默认提供的是浅拷贝的方式,因此,如果要实现深拷贝需要自己实现。
【举个栗子】string类实现深拷贝

String(const String& s)
{
	_str = new char[strlen(s.str)+1];
	strcpy(_str,s._str);
}

3、写实拷贝
写时拷贝简单来说就是当你读取一片空间时,系统并不会为你开辟一个一模一样的空间给你,只有在当你真正修改的时候,才会开辟一片空间给你
具体参照我们的另外一篇博文浅拷贝、深拷贝、写时拷贝

1.2拷贝构造函数详解

1、定义
拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象生成相同类型的新对象时由编译器自动调用。

2、具体实现
在上面我们探讨了浅拷贝和深拷贝。那么在实现这个拷贝构造函数的时候究竟是用何种方式呢?

  • 首先,深拷贝和浅拷贝都是由拷贝构造函数所引发的,若不自定义拷贝构造函数,那么编译器会调用默认的拷贝构造函数,属于浅拷贝
  • 当类成员中存在指针类型的数据成员时,浅拷贝仅仅是拷贝了原对象的副本给新对象,会导致两个指针指向同一个内存空间,不会新开辟内存进行数据拷贝,因此在析构函数执行时,会出现错误,会导致资源的两次释放
  • 如果是深拷贝,首先是按照原对象的大小进行新空间的分配,然后在新空间进行对原数据的拷贝,仅仅复制数据到新内存。如下图所示:

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