String 深拷贝普通版本
#define _CRT_SECURE_NO_WARNINGS // 去除 vs下 函数不安全的警告
#ifndef _STRING_H_
#define _STRING_H_
#include <iostream>
using namespace std;
// 深拷贝的普通版本
class String
{
private:
char* _data;
public:
// 构造函数 // 请注意这里只可以再定义或者声明的时候写默认值
String(const char* data = '\0' );
String(const String& s); // 拷贝构造
String& operator=(const String& s); // 赋值运算符重载
friend ostream& operator<<(ostream& _cout, const String& s); // 输出运算符重载
~String(); // 析构函数
};
#endif
#include "String.h"
// String 深拷贝 普通版本
String::String(const char* data)
{
if (NULL == data)
{
_data = new char[1]; // 这里new [] 是为了匹配释放delete []
*_data = '\0';
}
else
{
_data = new char[strlen(data) + 1];
strcpy(_data, data);
}
}
String::String(const String& s)
:_data(new char[strlen(s._data) + 1])
{
strcpy(_data, s._data);
}
String& String::operator=(const String& s)
{
if (this != &s)
{
// 开辟一段临时空间 防止new空间失败 丢失原来的数据
char* pStr = new char[strlen(s._data) + 1];
strcpy(pStr, s._data); // 将等号右边的内容拷贝到新开辟的空间
delete[] _data; // 释放原来的空间
_data = pStr; //指向那段空间
}
return *this;
}
ostream& operator<<(ostream& _cout, const String& s)
{
_cout << s._data;
return _cout;
}
String::~String()
{
if (NULL != _data)
{
delete[] _data;
_data = NULL;
}
};
int main()
{
String s1("hello");
String s2(s1);
cout << s1 << endl;
cout << s2 << endl;
cout <<"------------------"<< endl;
String s3("world");
s3 = s1;
cout << s3 << endl;
cout <<"------------------"<< endl;
return 0;
}
头文件与前面的一样
// 构造函数
String::String(const char* data)
{
if (NULL == data)
{
_data = new char[1];
*_data = '\0';
}
else
{
_data = new char[strlen(data) + 1];
strcpy(_data, data);
}
}
// 拷贝构造
String::String(const String& s)
:_data(NULL) // 注意这里要记得置空不然会出现替换位置区域 报错
{
String temp_str(s._data);
std::swap(_data, temp_str._data);
}
// 赋值运算符重载
String& String::operator=(const String& s)
{
if (this != &s)
{
String temp_str(s._data);
std::swap(_data, temp_str._data);
}
return *this;
}
ostream& operator<<(ostream& _cout, const String& s)
{
_cout << s._data;
return _cout;
}
String::~String()
{
if (NULL != _data)
{
delete[] _data;
_data = NULL;
}
};
int main()
{
String s1("hehe");
cout << s1 << endl;
String s2;
s2 = s1;
cout << s2 << endl;
String s3(s1);
cout << s3 << endl;
return 0;
}