面试中string类的正确写法 http://coolshell.cn/articles/10478.html
String的实现:
//备注:
只在构造函数里面调用new char[],只在析构函数里面调用delete[];
每个函数都只有一两行代码,没有条件判断;
#include<iostream>
#pragma warning(disable :4996)
using namespace std;
class MyString //构造函数
{
public:
MyString(char* str)//备注:首先选择数据成员,最简单的string只有一个char*成员变量,好处是容易实现,坏处是某些操作的复杂度较高
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
~MyString()//析构函数
{
delete _str;
_str = NULL;
}
//MyString(MyString& s) //拷贝构造函数
// :_str(new char[strlen(s._str) + 1])
//{
// strcpy(_str, s._str);
//}
//MyString& operator=(MyString& s) //赋值运算符重载
//{
// if (this != &s)
// {
// char* tmp = new char[strlen(s._str) + 1];
// strcpy(tmp, s._str);
// delete[] _str; //防止开辟_str开辟空间失败
// _str = tmp;
// }
// return *this;
//}
//拷贝构造现代版-->利用已经有的构造函数,构造临时对象
MyString(const MyString& s)
:_str(NULL)
{
MyString tmp(s._str);
swap(_str, tmp._str);
}
//赋值运算符重载简洁版
MyString& operator=(MyString s)
{
swap(_str, s._str);
return *this;
}
protected:
char* _str;
};
void Test1()
{
char* str = "hello";
char* ptr = "world111";
MyString s1(str);
MyString s2(s1);
MyString s3(ptr);
s1 = s3;
}
int main()
{
Test1();
return 0;
}