一:概念解释
当我们在构造一个对象时,我们需要把所有的成员变量和成员方法都要统统的给这个对象构造出来,那么如果这个对象我们别不需要对它进行读取和修改的操作,那么我们是不是可以采用一种写时拷贝技术来减少内存的消耗?
二:代码分析
#include<iostream>
using namespace std;
#include<string>
class CString
{
public:
CString()
{
_str = new char[5];
_str[4] = 0;//加上结束字符0
getcount() = 1;//将标志位设置为1
}
CString(const char* str)
{
_str = new char[strlen(str) + 4 + 1];//4是标志为的大小,1是最后的结束字符'\0'大小
strncpy_s(_str + 4, strlen(str) + 1, str, strlen(str));//?
getcount() = 1;
}
CString(const CString& src)//拷贝构造函数
{
//让两个类对象中的成员变量指向同一个外部资源
_str = src._str;
//又多了一个类对象使用该外部资源。
getcount()++;
}
CString& operator=(const CString& src)//等号运算符的重载
{
if (this == &src)
{
return *this;
}
if (--getcount() == 0)
{
delete[]_str;
}
_str = src._str;
getcount()++;
return *this;
}
~CString()
{
if (--getcount() == 0)
{
delete[]_str;
}
}
//当我们试图改变该外部资源时 我们需要经行 写时拷贝技术
char& operator[](int pos)
{
if (getcount() > 1)
{
getcount()--;
char* tmp = this->_str;
_str = new char[strlen(tmp + 1) + 4 + 1];
strncpy_s(_str + 4, strlen(tmp + 4) + 1, tmp + 4, strlen(tmp + 4));
getcount() = 1;
}
return _str[pos + 4];
}
void show()
{
cout << this->_str+4 << endl;
}
private:
int& getcount()
{
return *(int*)_str;//将字符数组的前四个字节获取到,以int类型作为标志
}
char* _str;
};
int main()
{
CString my1;
my1 = "wangbao";
my1.show();
CString my2 = my1;
my2.show();
my2[1] = 's';
my2.show();
return 0;
}