1.深拷贝

</pre><pre code_snippet_id="1689102" snippet_file_name="blog_20160519_1_1528207" name="code" class="cpp">#include <iostream>
using namespace std;

class String{
public:

friend ostream& operator<<(ostream& out, const String& str);//友员

String(const char * str = NULL);// 默认参数
String(const String &str);
String& operator=(const String &str);

~String();

private:

ostream& outPut(ostream& out)const;//const
char *data;
};

String::String(const char* str){
if (str == NULL){ // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断
data = new char[1];
data[0] = '\0';
}
else{
int len = strlen(str);
data = new char[len + 1];
strcpy(data, str);
}
}

String::String(const String& str){ // 得分点:输入参数为const型
int len = strlen(str.data);
data = new char[len + 1];
strcpy(data, str.data);
}

String& String::operator =(const String &str){
if (this != &str){ //得分点:检查自赋值
String tmp(str);
char *tmp_data = tmp.data;
tmp.data = data;
data = tmp_data;
}
return *this;
}


String::~String(){
delete[]data;
}


ostream& String::outPut(ostream& out)const{ //const成员函数
out << data;
return out;
}

ostream& operator<<(ostream& out, const String& str){//
return str.outPut(out);
}

int main(){

char* p = "Hello World !";
String s(p);
cout << s << endl;
String s1("How are you ?");
cout << s1 << endl;

String s2(s1);
cout << s2 << endl;

s = s2;
cout << s << endl;

return 0;
}


2.浅拷贝

#include<iostream>
using namespace std;

//模拟new[],在前面多开4个字节来存引用计数
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str) + 5])
{
_str += 4;
_GetRefCount(_str) = 1;
strcpy(_str, str);
}

String(const String& s)
:_str(s._str)
{
++_GetRefCount(_str);
}
String& operator=(const String& s)
{
if (_str != s._str)
{
_Release();
_str = s._str;
++_GetRefCount(_str);
}
return *this;
}


char& operator[](size_t index)
{
if (_GetRefCount(_str) > 1)
{
char* tmp = new char[strlen(_str) + 5];
tmp += 4;
_GetRefCount(tmp) = 1;
strcpy(tmp, _str);
--_GetRefCount(_str);
_str = tmp;
}
return _str[index];
}


~String()
{
cout << "~String()" << endl;
_Release();
}
int& _GetRefCount(char* str)
{
return(*(int*)(str - 4));
}
void _Release()
{
if (--(_GetRefCount(_str)) == 0)
{
delete[](_str - 4);//指针返回首地址位置,释放整段空间
}
}
void put()
{
cout << _GetRefCount(_str) << "---------" << _str << endl;
}
private:
char* _str;
};

void Test()
{
String S;
String s1 = "abclefg";
String s2(s1);
S.put();
s1.put();
s2.put();
s2 = s1;
s2.put();
cout << "**********************" << endl;

String s3 = "hijklmn";
String s4(s3);
s3.put();
s3 = s1;
s3.put();

cout << "**********************" << endl;

s1.put();
s1[3] = 'd';
s1.put();
s2.put();
}

int main()
{
Test();

return 0;
}


1---------


2---------abclefg


2---------abclefg


2---------abclefg


**********************


2---------hijklmn


3---------abclefg


**********************


3---------abclefg


1---------abcdefg


2---------abclefg


~String()


~String()


~String()


~String()


~String()