下图列出了类中6个默认的成员函数,在我之前的博文中仔细的讲解了构造函数和析构函数,具体参照构造函数和析构函数
1、浅拷贝
这种拷贝的话编译器只是将指针的值拷贝过来,结果多个对象共用同一块内存。如下图所示:
这样存在的问题就是当一个对象将这块内存释放掉过后,另一些对象不知道该块内存已经还给了系统,以为还有效,所以在对这段内存进行操作的时候,容易发生违规访问。
2、深拷贝
深拷贝是指的构造s2的时候拷贝一块儿和跟s1指向数据块一样大的数据块,并将值拷贝下来,这样s1和s2指向各自的数据块,析构时释放各自的数据块,如下图所示:
这种方式就解决了前面浅拷贝存在的问题。但是系统默认提供的是浅拷贝的方式,因此,如果要实现深拷贝需要自己实现。
【举个栗子】string类实现深拷贝
String(const String& s)
{
_str = new char[strlen(s.str)+1];
strcpy(_str,s._str);
}
3、写实拷贝
写时拷贝简单来说就是当你读取一片空间时,系统并不会为你开辟一个一模一样的空间给你,只有在当你真正修改的时候,才会开辟一片空间给你
具体参照我们的另外一篇博文浅拷贝、深拷贝、写时拷贝
1、定义
拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象生成相同类型的新对象时由编译器自动调用。
2、具体实现
在上面我们探讨了浅拷贝和深拷贝。那么在实现这个拷贝构造函数的时候究竟是用何种方式呢?