模拟实现MyString
一、模拟实现String的简单版本
所实现的包括构造函数,拷贝构造以及赋值运算符的重载等基本操作。
关于拷贝构造的深浅拷贝问题:
此时需要重新开辟一块空间,将内容拷入,即深拷贝:
关于赋值运算符的重载,需要先释放掉其空间,在重新开辟空间完成拷贝。
代码实现传统写法:
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class String
{
friend ostream& operator<< (ostream& os, const String& s);
public:
String()
:_str(new char[1])
{
*_str = '\0';
}
String(const char* str) //构造函数
:_str(new char[strlen(str) + 1])
{
cout << "String(const char* str)" << endl;
strcpy(_str, str);
}
String(const String& s) //拷贝构造函数
:_str(new char[strlen(s._str) + 1])
{
cout << "String(const String& s)" << endl;
strcpy(_str, s._str);
}
String& operator=(const String& s) //运算符的重载
{
cout << "String& operator=(const String& s) " << endl;
if (&s != this)
{
delete[] _str;
_str = new char[strlen(s._str) + 1];
strcpy(_str, s._str);
}
return *this;
}
~String()
{
if (_str)
{
cout << "~String()" << endl;
delete[] _str;
}
}
private:
char* _str;
};
ostream& operator<< (ostream& os, const String& s)
{
os << s._str;
return os;
}
void Test()
{
String str1 = "asdsfd";
cout << str1 << endl;
String str2(str1);
cout << str2 << endl;
String str3;
str3 = str2;
cout << str3 << endl;
}
二、现代写法实现MyString
拷贝构造利用构造函数,赋值运算符的重载利用拷贝构造函数
代码实现:
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
class String
{
friend ostream& operator<<(ostream& os, const String& s);
public:
String(const char* str = "")
:_str(new char[strlen(str) + 1])
{
cout << "String(const char* str = "")" << endl;
strcpy(_str, str);
}
~String()
{
cout << "~String()" << endl;
if (_str)
{
delete[] _str;
}
}
String(const String& s) //拷贝构造
:_str(NULL)
{
cout << "String(const String& s)" << endl;
String tmp(s._str);
swap(_str, tmp._str);
}
String& operator=(String s) //赋值运算符的重载
{
cout << "String& operator=(String s)" << endl;
swap(_str, s._str);
return *this;
}
private:
char* _str;
};
ostream& operator<<(ostream& os, const String& s)
{
os << s._str;
return os;
}
void Test()
{
String str1 = "jsdgs";
cout << str1 << endl;
String str2(str1);
cout << str2 << endl;
String str3;
str3 = str1;
cout << str3 << endl;
}