C++中的string类是一个很常见的面试题,string类里必须有的构造函数,拷贝构造,赋值运算符重载,析构函数等成员函数,下面看看是如何实现以及如何处理动态内存
拷贝构造的几种实现方法:
1.传统深拷贝
//传统深拷贝
String(const String& s)
:_str(new char[strlen(s._str) + 1]) //深拷贝构造函数
{
strcpy(_str, s._str);
cout << "String(const String& s)" << endl;
}
如果不用引用计数的话,在这里只能用深拷贝
深浅拷贝问题连接:http://blog.csdn.net/dream_1996/article/details/61923747
//现代方式拷贝
String(const String& s)
:_str(NULL)
{
String tmp(s._str);
std::swap(_str, tmp._str);
cout<<"String(const String& s)"<<endl;
}
这里不用给_str申请空间,直接把_str赋成空,然后用s._str构造一个tmp对象,把tmp和*this的_str的空间交换,这时tmp._str就指向空,而_str现在指向原来s._str的空间,在函数调用结束时tmp会自动释放
3.写时拷贝
//写时拷贝
String(const String& s)
:_str(s._str)
, _size(s._size)
{
++(*_size);
}
private:
char *_str;
int *_size;
写时拷贝技术是通过"引用计数"实现的,因为浅拷贝的缺陷,所以在这个时候我们就引入了引用计数的拷贝。但是当其中一个对象改变它的值时,其他对象的值就会随之改变,所以此时我们采取这样一种做法,就是写时拷贝。写时拷贝